深入了解HyperServer
本文,我们将尝试深入了解uniGUI HyperServer。 可以将HyperServer所有功能分成三类:
- HyperServer和稳定性
- HyperServer和可扩展性
- HyperServer和远程部署
HyperServer和稳定性
HyperServer是一种新的服务器技术,专门用于从根本上提高uniGUI应用程序的可伸缩性和稳定性。那么,为什么我们需要HyperServer?
为了首先回答这个问题,让我们先回顾一下,一个传统的uniGUI应用程序的运行过程。一个传统的uniGUI应用程序,是由编译器生成二进制文件,该二进制文件通常是DLL或可执行文件。一旦将二进制文件加载到进程内存空间,该二进制文件就会充当服务器。它将无限期运行,直到由系统操作员手动卸载,或者由于程序错误而导致应用程序崩溃,被操作系统中止运行。在理想条件下,人们总是期望应用程序服务器二进制文件无限期地保留在内存中并提供强大而稳定的功能服务。
传统应用程序模型的另一个特征是由单个进程负责创建,保存和提供所有会话。它类似于将所有鸡蛋放在一个篮子里。在这种情况下,会话是鸡蛋,应用程序服务器是篮子。这个模型有几个缺点,最明显的问题是,一旦Web应用程序服务器终止或重新启动,所有活动会话都将被丢弃。另一个可能严重影响应用程序稳定性的问题是应用程序代码中的bug。此类bug可能导致严重的内存泄漏和其他问题,最终可能导致内存损坏和Web应用程序服务器崩溃。这个问题,那怕是微小的内存泄漏问题,因累积也会影响服务器运行。由于在传统模型中,应用服务器注定会无限期地运行,即使小问题也会随着时间的推移变得致命。当然,对于隐藏的bug,内存泄漏,指针问题和开发人员可能看不到的其他问题的应用程序来说,这种情况是真实存在的。如果将遗留的应用程序代码从桌面VCL应用程序移植到uniGUI,则可能难以检测和修复某些此类问题。
毋庸置疑,根据通用设计模式开发,同时对内存问题,泄漏和bug进行了充分测试与修正,经过这种方式开发的应用程序能够在传统的单进程应用程序模型中无限运行,uniGUI应用服务器非常稳定和健壮是有目共睹的,众所周知,许多开发人员开发的uniGUI应用程序的稳定性几乎没有问题。但是,也必须强调,尽管单一过程模型对于传统的uniGUI应用程序可以被认为是稳定的,但是对于可伸缩性而言不能说两者相同。考虑到稳定性,开发人员面临的主要问题是他们可能面临许多级别的软件缺陷,这些缺陷可能难以检测,修复或找到解决方法。让我们看一下这些缺陷的列表:
- 当前项目代码中的错误。
- 从旧项目移植的遗留代码中的错误。
- 第三方库中的错误。
- 编译器错误。
- Delphi标准库中的错误(RTL,VCL,DB等)
上面的一些bug来源可能非常罕见,比如编译器错误和Delphi库错误,我们不能否认它们的存在。在上述bug中,最常见的错误是直接存在于项目代码中的错误,但只有可能导致内存泄漏,内存损坏或代码死锁的错误对服务器应用程序最有害。Delphi应用程序的本地特性使它们容易受到内存问题的影响,并且在所有这些问题都解决之前,不能实现完全稳定的应用程序。软件开发团队(尤其是大型团队)面临的最大问题是,他们无法始终确保生成相同质量的代码,并且每个新版本都没有缺陷。即使是长时间的压力测试也可能不足以检测,隔离和修复以及隐藏的代码缺陷。
为了解决上述问题,我们需要一个新的服务器模型,它可以更好地容忍带有错误的应用程序代码。这里的主要技巧是增加代码在生产环境中的生存机会,即使它还没有为黄金时段做好准备。 HyperServer旨在提高存在此类条件时的稳定性。 HyperServer通过实现不同的机制来实现这一目标:内部负载平衡和节点回收。负载平衡将在节点之间分配整体服务器负载。节点回收将通过基于预定义规则回收节点,从而减少他们的生命周期。回收将确保节点仅在一段时间内驻留在进程内存空间中。与将应用程序服务器进程无限期地保存在内存中的经典模型不同。
必须要说的是,在这个意义上,HyperServer不应被视为有缺陷代码的解决方案,也不应被视为处理内存问题的工具。 HyperServer既不会修复您的应用程序错误,也不会为它们提供解决方法。
HyperServer和可扩展性
Web应用程序最大的问题之一是它们能够扩展,uniGUI应用程序也是如此。事实上,可扩展性可能是uniGUI应用程序的一个更大的问题,因为uniGUI会话是有状态的并且将所有状态信息保存在进程内存中。我们可以说使用单个进程来服务所有会话的经典应用程序模型可以扩展到几百个会话。这并不意味着您不能在经典模型中拥有数千个会话。从理论上讲,只要您的服务器具有足够的资源且您的应用程序设计具有固有的可扩展性,经典模型中的会话数量就没有上限。这里的问题是,在一个篮子里放1000个鸡蛋是否安全?显然,答案是否定的。然而,如果我们在10个篮子中分配1,000个鸡蛋,每个鸡蛋包含100个鸡蛋,那么每个人似乎都同意。这就是HyperServer诞生的出处。 HyperServer在内部将您的应用程序划分为多个节点,并在这些节点之间分配会话。由于每个节点都是一个单独的进程,因此其会话与其他节点中的会话隔离。因此,Node中的任何问题都只能影响该节点及其会话。
鸡蛋和篮子问题不是与传统单进程应用程序服务器模型相关的唯一问题。另一个问题是在同一进程中保留大量会话可能会导致其他问题。一个问题是uniGUI应用程序是高度多线程的应用程序,当然它需要使用锁来同步某些操作。随着会话数量的增加,这种锁可能会变成瓶颈。虽然在uniGUI中我们尝试尽可能少地使用锁,但它们是不可避免的。在RTL代码和其他涉及的第三方库中也可能出现代码锁。
HyperServer不仅可以管理同一服务器内的节点集群,还可以扩展为管理多个服务器上的多个节点集群。这意味着您将能够在服务器场上运行uniGUI应用程序。这将为使用uniGUI和Delphi开发的Web应用程序添加新的维度。
HyperServer和远程部署
HyperServer为uniGUI框架添加的另一个令人兴奋的新功能是能够远程部署应用程序的新版本,而无需停止服务器。因此HyperServer不仅仅具有稳定性和可扩展性,它还涉及到应用程序服务器运行的连续性和可用性。在传统的单一过程中,uniGUI应用程序更新应用程序相对困难。首先,需要跟踪出流量较低且活动会话很少的时间点,然后,需要关闭服务器,这意味着将丢弃所有活动会话,这时候,你可能需要通知用户,从应用中注销并等待更新完成。
针对以上常见的场景,使用HyperServer可以远程上传新版本的应用程序,其余工作将由HyperServer完成。 HyperServer将逐步更新节点,所有新会话将重定向到运行新版本应用程序的节点,旧版本的节点将在其所有会话都注销后被丢弃并清除。
深入了解HyperServer的更多相关文章
- 安装和配置HyperServer
总述 安装和配置HyperServer非常简单.直接. uniGUI安装程序在.. \uniGUI\HyperServer\bin\文件夹(\bin64\用于64位二进制文件)下分发了HyperSer ...
- uniGUI HyperServer
uniGUI HyperServer 是一种新的服务器体系架构, 旨在高度提高 uniGUI 应用程序的可用性.稳定性和特定的可伸缩性. 这一目标是通过应用业界已知和广泛使用的技术 (如负载平衡和过程 ...
- HyperServer 中的 SSL 支持
HyperServer 中的 SSL 支持 DLL 模式不需要 SSL 配置, 因为 web 服务器 (如 IIS) 将承担 ssl 配置和 ssl 证书的责任. 对于独立和服务模式, ssl 配置是 ...
- 基于uniGui开发的Delphi后台管理框架uniFramework
uniGui是基于Delphi的一套开发Web应用的UI框架,前端使用的是ExtJS,最新版的uniGUI1.5 1480已支持新版的ExtJS6.5.3.我认为uniGUI是目前Delphi下最完善 ...
- 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 ...
随机推荐
- laravel App\Kernel.php中的middleware、middlewareGroups、routeMiddleware
万事万物总逃不出一个理字,程序尤其如此,你之所以活得轻松,是因为有人替你负重前行,帮你屏蔽掉了很多乱七八糟的事情,但总有一天你要直面这些事情.程序亦是如此,某个框架你用的很轻松,那是因为底层逻辑已经有 ...
- 【其他】【服务器】【4】删除Windows系统中不想要的服务
步骤: 1,开始菜单栏查找“服务”,打开后找到想要删除的服务 2,右键单击想要删除的服务,选择“属性”-“常规”-“服务名称”,记下服务名称(AA) 3,开始菜单栏输入“cmd”打开命令行窗口,输入s ...
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- MySql(七)多表查询
十一.多表查询 新建两张表:部门表(department).员工表(employee) create table department( id int, name varchar(20) ); cre ...
- ssl tls 证书链 根证书和叶证书查询
你基本上需要做的是构建一个证书链,如果你没有得到它作为一个链.证书链基本上由第零个位置的最终实体证书(也是叶证书,链中最重要的证书)组成,其次是次要证书. CA证书是最不重要的. 所以这是通常的X.5 ...
- 两个有序数组的中位数(第k大的数)
问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...
- js 时间戳转特定格式的日期
var Tools = {}; Tools.formatDate = function (fmt,timestamp) { if(timestamp){ var date = new Date(par ...
- Win32汇编环境搭建教程(MASM32 SDK)
一.说明 常用的32位汇编编译器有微软的MASM.Borland的TASM和NASM. 编译器 开发者 优点 缺点 MASM 微软 微软自家软件和系统兼容性好:支持invoke/.if等伪指令将汇编变 ...
- weblogic创建domain教程
1.创建domain [ls@ls ~]$ cd /weblogic/wlserver_10.3/common/bin/ #进入创建文件所在目录 [ls@ls bin]$ ./config.sh #执 ...
- 【框架】Testng用例失败自动重跑(五)
arrow是testng的一个扩展插件,参考arrow的源代码 1.新建一个工程,结果如图: 2.RetryListener.java的代码 package com.netease.qa.testng ...