uniGUI HyperServer
uniGUI HyperServer 是一种新的服务器体系架构, 旨在高度提高 uniGUI 应用程序的可用性、稳定性和特定的可伸缩性。 这一目标是通过应用业界已知和广泛使用的技术 (如负载平衡和过程回收) 实现的。
传统的 uniGUI 应用程序服务器由一个单独的进程和多个线程组成。 单个进程可以是 uniGUI 可执行文件或 ISAPI 或 Apache 工作进程。 在所有情况下, 所有会话都驻留在单个进程中, 并且在同一进程中有多个线程用于处理传入的请求。
uniGUI HyperServer 改变了模型, 变成了一个多进程多线程模型。 在这个新模型中, 会产生几个工作进程来服务同一 web 应用程序。 会话将在工作进程之间划分, 并且基于配置, 您可能有多个工作进程用于相同的 uniGUI 应用程序。 工作进程由另一个实际上叫 HyperServer 进程来管理和调度。 HyperServer 将是所有客户端请求的入口点。 HyperServer 将接受所有请求并将它们分发到工作进程中。 HyperServer 还有责任在需要时生成新的工作进程, 并在不再需要时回收它们。 由于 uniGUI 会话是有状态的, 因此 HyperServer 的另一个重要职责是将传入的会话请求定向到创建该特定会话的正确的工作进程。 在 HyperServer术语中, 每个工作进程称为一个节点。
在继续之前,我们先来学习一下HyperServer引入的几个新术语。
HyperServer
HyperServer是所有请求的主要入口点。它将过滤请求并将它们引导到相应的节点。如果请求未与节点关联,则HyperServer将根据负载分配算法将其定向到任意节点。 HyperServer还负责创建新节点并在需要时回收它们。
毋庸置疑,HyperServer本身是一个uniGUI应用程序,专为此特定目的而设计。 HyperServer以预编译的二进制文件(Exe和Dll)的形式部署。可用的部署选项包括:独立服务器,ISAPI模块和Windows服务。将来HyperServer组件将包含在uniGUI库中,因此开发人员将能够创建自己的自定义HyperServers。
Node(节点)
HyperServer节点实际上是一个工作进程。同时,uniGUI应用程序本身也以独立的EXE模式部署。开发人员将以Node的形式部署他们的应用程序。开发人员在设计Node应用程序时不需要采取任何特殊设计,跟开发任何标准的uniGUI应用程序是一样的。
Node Id(节点ID)
每个节点都有一个唯一的节点ID。在创建节点时分配节点ID。当节点被回收时,将重新使用节点ID。
Transport(传输通道)
HyperServer使用传输通道在内部与节点通信。目前仅实现HTTP传输通道。未来,将基于各种技术实现其他的Transport,如Wiidows Pipes,TCP和UDP。
Node Recycling(节点回收)
节点将根据预定的设计方案进行回收,当需要回收节点时,将请求关联的进程做终止操作并在确认此请求后,Node将开始终止其所有会话并最终终止其进程。如果节点未确认回收请求,则HyperServer将强制终止该请求。
Active Node(激活节点)
活动节点是那些主动服务会话的节点,他们能够接受新的会话。
Suspended Node(挂起结点)
挂起的节点是无法与HyperServer通信的节点。在正常操作下,HyperServer会以特定间隔轮询其所有节点。如果其中一个节点未能响应,则将其标记为已暂停。如果节点在一定量的重试后未能响应,则它将被视为失败的节点并将被清除。
Purged Node(清除节点)
清除节点是从活动节点列表中删除并发送到回收队列的节点。清除节点既不接受新会话也不处理任何传入请求。下次清理回收队列时,它将从进程空间中删除。
Discarded Node(丢弃节点)
丢弃节点是实际拥有多个会话的节点,但它不接受新会话。它将继续存在,直到所有会话终止。在没有剩余会话时,它将被清除。
Persistent Node Zero(零持久节点)
零持久节点是一个Id = 0的节点,它保证持续运行,虽然偶尔也会像其他节点一样被回收,但在回收后会立即重新加载,不会被永久卸载。持久节点的主要目的是确保一次至少运行一个节点。考虑一种情况,一个uniGUI应用程序需要在线程中执行后台任务,这个任务可能利用放置在ServerModule上的TUniThreadTimer中执行。在传统的uniGUI应用程序中,只有一个进程,因此后台任务可以保证以Singleton的形式运行。但是,在同时运行同一进程的多个副本的HyperServer中,应该有一种机制来确保您的Singleton方法仅在其中一个节点中运行。零持久节点选项完美地满足此目的。您需要做的就是启用此选项并检查uniGUI应用程序中的Node Id。如果名为NodeZero的ServerModule中的布尔属性为True,则运行后台任务是安全的。
在下面的代码中,只在当前节点是Node Zero(Node Id = 0)时才执行ThreadTimer事件。
procedure TUniServerModule.UniThreadTimer1Timer(Sender: TObject);
begin
if NodeZero then // run code if I'm Node #0
begin // Your task here end;
end;
或者,如果您计划使用HyperServer或传统的单一进程模式部署应用程序,则可以使用以下语法。
procedure TUniServerModule.UniThreadTimer1Timer(Sender: TObject);
begin
if NodeZero or (not NodeMode) then // run code either if I'm Node #0 or I'm not a Node!
begin // Your task here end;
end;
uniGUI HyperServer的更多相关文章
- 安装和配置HyperServer
总述 安装和配置HyperServer非常简单.直接. uniGUI安装程序在.. \uniGUI\HyperServer\bin\文件夹(\bin64\用于64位二进制文件)下分发了HyperSer ...
- 深入了解HyperServer
本文,我们将尝试深入了解uniGUI HyperServer. 可以将HyperServer所有功能分成三类: HyperServer和稳定性 HyperServer和可扩展性 HyperServer ...
- 基于uniGui开发的Delphi后台管理框架uniFramework
uniGui是基于Delphi的一套开发Web应用的UI框架,前端使用的是ExtJS,最新版的uniGUI1.5 1480已支持新版的ExtJS6.5.3.我认为uniGUI是目前Delphi下最完善 ...
- HyperServer 中的 SSL 支持
HyperServer 中的 SSL 支持 DLL 模式不需要 SSL 配置, 因为 web 服务器 (如 IIS) 将承担 ssl 配置和 ssl 证书的责任. 对于独立和服务模式, ssl 配置是 ...
- nginx实现unigui群集
nginx实现unigui群集 在笔者写此文的时候,UNIGUI1.50.x的版本已经发布,其提供的HyperServer已经支持群集. 有网友还专门为此做了群集方面的测试: 从上图可以看出:群集总共 ...
- UniGui安装(01)
UniGui安装.Delphi10和uniGUI1.90.0.1509 1]下载 2]安装 3]目录说明 1]下载 在我百度网盘里 uniGUI1-90-0-1509.zip https://pan ...
- uniGUI试用笔记(十三)调用WebService
今天尝试用uniGUI做Web服务器,调用应用服务器的WebService,遇到些问题记录下来备忘. 1.对WebService的调用同一般App程序,只是注意如果WebService的执行时间较长, ...
- unigui数据库连接池
UNIGUI for delphi,是一款WEB RIA开发框架.开发WEB程式如传统C/S般简单,众多DELPHIER趋之若鹜. 虽然上手非常容易,但要真正使用好,有些地方还是值得考究的. 网上有同 ...
- unigui的页面布局使用
(unigui的页面布局还是很强大的,基本什么的排版都能搞好.前面部分为原文章翻译,翻译不一定很准确,就能看吧,后面有使用说明,有什么不明白的欢迎加我QQ(910300653)一起交流学习) 一.布局 ...
随机推荐
- 4.1.5 Georigia and Bob
Problem description: Georgia and Bob 在玩一个游戏. 如图所示,排成直线的格子上放有n个棋子.棋子 i 在左数第 Pi 个格子上.Georgia 和 Bob 轮流选 ...
- WDA基础七:TABStrip
这个组件很少用. 一般用这个,是为了页面好看,还有就是布局排版的问题,因为多个页签其实占的是一块地... 新建ELEMENT TABStrip,右键tabstrip,插入页签,需要几个加几个... 加 ...
- maven生命周期绑定要点
生命周期不执行任何操作,都是抱插件大腿 maven-core-3.3.9-sources.jar下META-INF/plexus/components.xml的定义了三个生命周期的插件绑定 参考:ht ...
- Java中获得当前静态类的类名
通常在打印日志的时候需要输出类名,普通类可以用this.getClass(),但是静态类没有this,直接写类名耦合度高. 参考了: https://stackoverflow.com/questio ...
- Docker Nginx 配置多个子域名
参考:nginx server_name实用:配置多个子域名 在腾讯购置了域名服务,想直接配置二级域名映射到指定端口,发现腾讯不支持端口映射的方式. 想了一下,域名默认解析80端口,只能通过nginx ...
- 十一、持久层框架(MyBatis)
一.基于注解方式的CRUD 把xml方式的CRUD修改为注解方式 之前在xml中配置,是在<mapper></mapper>标签下写CRUD <mapper namesp ...
- Hadoop---Exception in thread "main" java.lang.NullPointerException问题的解决
Exception in thread "main" java.lang.NullPointerException问题的解决 解决: 首先我们来分析下这个问题,我是使用debug ...
- Django之DjangoAdmin
前言: 当我们启动1个Django程序的时候,在程序的settings.py配置文件默认注册了1个名为'django.contrib.admin'的APP程序,并且配置了默认路由映射关系url(r'^ ...
- WebSphere禁用SSLv3和RC4算法教程
WebSphere经常会报“SSL 3.0 POODLE攻击信息泄露”和"SSL/TLS 受诫礼(BAR-MITZVAH)攻击"两个漏洞,前者建议禁用SSL算法后者建议禁用RC4算 ...
- python中字典内置方法