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)一起交流学习) 一.布局 ...
随机推荐
- 【MySQL】【2】数字排序问题
--我用的方案 SELECT * FROM TABLE_Q ORDER BY CAST(ID AS SIGNED) ASC 备注: 不做特殊处理的话,数字位数不一样时排序有问题,比如10会比2小. 其 ...
- python-day1笔记
# 1.编程语言的作用及与操作系统和硬件的关系:#编程语言就是人与电脑之间沟通的介质. # 2.应用程序->操作系统->硬件:#应用程序通过操作系统来控制计算机硬件. #3. cpu-&g ...
- [hdu 6191] Query on A Tree
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- 使用AJAX报406错误
使用AJAX报406错误,基本有一下两种情况: (1)90%的可能是没有添加jackson包: (2)10%的可能是请求的url后缀是*.html 在springmvc里面,如果请求的是*.html, ...
- 33 个 2017 年必须了解的 iOS 开源库
本文翻译自Medium,原作者为Pawe? Bia?ecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Pawe?,我是一个独立 iOS 开发者,并且是 ...
- Java 类名.class与类名.this 的区别?
“类名.this”的语法在Java语言中叫做“qualified this”.相关规定在这里:Chapter 15. Expressions - Qualified this这个语法的主要用途是:在内 ...
- java继承,final,super,Object类,toString,equals,
Java中的内部类:成员内部类静态内部类方法内部类匿名内部类 内部类的主要作用如下: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可 ...
- 从零开始学习Vue(四)
这里引入一个概念SPA(single Page Application), 接着上次的例子,我们在页面底部做了一个Tab的菜单,点击不同的按钮应该是显示不同的内容. 按传统的MVC的思维,我要在Con ...
- android apk瘦身
1.在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小 通过Build.gradle进行配置 2.删除无用的Resource文件. 这个和上面的肯定不一样 ...
- 由@Convert注解引出的jackson对枚举的反序列化规则
对于一些状态字段以前时兴用常量,现在时兴用枚举,虽然阅读体验极佳,但是传值的时候还是会有些麻烦,需要设置一下转换器.比如: class A{ @Convert(converter=TestTypeCo ...