本文,我们将尝试深入了解uniGUI HyperServer。 可以将HyperServer所有功能分成三类:

  1. HyperServer和稳定性
  2. HyperServer和可扩展性
  3. 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的更多相关文章

  1. 安装和配置HyperServer

    总述 安装和配置HyperServer非常简单.直接. uniGUI安装程序在.. \uniGUI\HyperServer\bin\文件夹(\bin64\用于64位二进制文件)下分发了HyperSer ...

  2. uniGUI HyperServer

    uniGUI HyperServer 是一种新的服务器体系架构, 旨在高度提高 uniGUI 应用程序的可用性.稳定性和特定的可伸缩性. 这一目标是通过应用业界已知和广泛使用的技术 (如负载平衡和过程 ...

  3. HyperServer 中的 SSL 支持

    HyperServer 中的 SSL 支持 DLL 模式不需要 SSL 配置, 因为 web 服务器 (如 IIS) 将承担 ssl 配置和 ssl 证书的责任. 对于独立和服务模式, ssl 配置是 ...

  4. 基于uniGui开发的Delphi后台管理框架uniFramework

    uniGui是基于Delphi的一套开发Web应用的UI框架,前端使用的是ExtJS,最新版的uniGUI1.5 1480已支持新版的ExtJS6.5.3.我认为uniGUI是目前Delphi下最完善 ...

  5. nginx实现unigui群集

    nginx实现unigui群集 在笔者写此文的时候,UNIGUI1.50.x的版本已经发布,其提供的HyperServer已经支持群集. 有网友还专门为此做了群集方面的测试: 从上图可以看出:群集总共 ...

  6. UniGui安装(01)

    UniGui安装.Delphi10和uniGUI1.90.0.1509 1]下载 2]安装 3]目录说明 1]下载 在我百度网盘里  uniGUI1-90-0-1509.zip https://pan ...

随机推荐

  1. 宽度优先搜索BFS(Breadth-First-Search)

    Breadth-First-Search 1. 与DFS的异同 相同点:搜索所有可能的状态. 不同点:搜索顺序. 2. BFS总是先搜索距离初始状态近的状态,它是按照:开始状态->只需一次转移就 ...

  2. 【洛谷p1319】压缩技术

    (许久不见,甚是想念) 压缩技术[传送门] 洛谷上滴算法标签: 然而这是一道入门难度的题.(不管不管,就写它了) 好的先说一下思路吧wait!我忘记了咋做的当时. 首先做题第一道坎儿,如何输入若干个( ...

  3. python-flask-请求源码流程

    启动先执行manage.py 中的    app.run() class Flask(_PackageBoundObject): def run(self, host=None, port=None, ...

  4. css 使用率 清楚无用css

  5. 快速学习HTML

    1.先写基本的框架标签 2.HTML基本标签 段落标签 <p></p> 空格标签   标题标签 <h1></h1>……<h6></h6 ...

  6. [洛谷 P3239] [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...

  7. /etc/profile、~/.bash_profile、~/.bashrc和/etc/bashrc

    文件 引用关系 执行时间 影响用户 使用场景 /etc/profile   开机执行 所有用户 所有用户.重启生效 ~/.bash_profile 引用~/.bashrc 用户登录时执行 当前用户 当 ...

  8. 逆袭之旅.DAY08东软实训.多态~

    2018年7月4日

  9. Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY

    用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. 第一步:检查extens ...

  10. 小程序swiper效果高宽设置(微信小程序交流群:604788754)

    swiper的宽和高一定要设置在swiper上面.swiper-item默认继承swiper的宽和高.swiper-item容器里面的宽和高没有继承他的父节点宽和高,需要从新设置. 不明白之处,可以咨 ...