深入了解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 ...
随机推荐
- selenium chrome 自动加载flash
#coding:utf-8from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom ...
- poj-2689-素数区间筛
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22420 Accepted: 5954 Descr ...
- Oracle11g ADG环境实施文档-1204
Oracle11g adg 环境搭建实施手册-1204 2017年8月30日 9:16 11g adg 环境搭建实施手册-0824 2017年8月24日 10:18 ################# ...
- 元类应用ORM实现
首先看下一个简单的例子 # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, ...
- lua 函数基础
函数定义在前,调用在后 如果函数只有一个实参,并且此参数是一个字面字符串或者table构造式,那么可以省略() 例如 print "hello" unpack{1,2} print ...
- 2017-4-20/Redis的数据结构及应用场景
1. 谈谈你对redis的理解,它的应用场景. Redis是一个key-value存储系统,它支持存储的value类型包括string字符串.list链表.set集合.sorted Set有序集合和h ...
- Maximum sub array
Here I post a way to solve maximum sub array problem: The problem described like this: here is an ar ...
- HDFS shell操作及HDFS Java API编程
HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...
- Vue + webpack 项目配置化、接口请求统一管理
准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题. 又或者后面其他同事接手你的模块,或者改你的bug ...
- cogs448
☆ 输入文件:1.in 输出文件:1.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在某次膜拜大会上,一些神牛被要求集体膜拜.这些神牛被奖励每人吃一些神牛果. ...