如何解决DataSnap支持的Tcp长连接数受限的问题?

方案一:

采用代理服务器方式,基本流程为:

1、客户先连接代理服务器;2、获取可用的服务器IP和端口;3、关闭与代理服务器之间的连接;4、建立与可用服务器之间的连接。而且在第2步中可以实现负载均衡的配置与实现。博主最近对一个机房管理系统升级采用的就是此方案,学校(某一高新)公共机房现有机房50间左右,每间机房60台机器(标准配置),现有客户端3000台左右,以后肯定还要扩容更新的,故以5000个客户端为正常容量。因为要实时检测学生的的状态,如是否是在上课期间(机房号、时间、节次、周次、节假日等)、自费时间(实现计算帐户余额等)、接收和处理管理机的消息、接受管理机的监控等,故只能采用长连接的方式。

方案二:

采用多进程方式:

对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据。大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000的数量(如果想要维持稳定运行的话)。原因是大家都晓得的,阻塞方式会为每一个SOCKET连接创建一个新的线程为之服务,而WINDOWS单个进程理论上允许最多的线程数量是2048个,实际当中要少得多才行。有人说可以用WINDOWS的IOCP通信模型解决,诚然!但IOCP编程过于复杂。有人说,可以用INDY,使用短连接的方式解决。鉴于每隔500MS就要上传一次数据的频率,短连接其实不适合用,因为短连接每次都要建立和断开SOCKET连接,而建立和断开SOCKET连接是特别耗时的,所以使用TCP长连接的方式。

有人说为什么想着阻塞的方式,答案是:因为阻塞的编程是最简单的。其实对于5000长连接的客户端,INDY一样可以有办法实现。既然单个进程只能支持1000个左右的长连接,那开5个进程不是就可以支持5000个长连接了吗?有人说,阻塞的5000个连接就意味着WINDOWS要开5000个线程,如此多的线程,WINDOWS受得了吗?于是马上动手实验,一个进程开1500个线程,一共开了4个进程,每个线程每隔100ms,执行FOR I:=1 TO 100 DO,WINDOWS任务管理器显示,每一个进程占用40.4M的内存,CPU使用率才百分之零点几,总的CPU使用率才百分之几,内存使用率也只有20%,WINDOWS调度没有一点儿问题。这种方案只需要一个公网IP,分别为不同的进程绑定不同的端口。

而且这也是咏南兄的中间件曾提出并使用过的方案。这一方案的优点就是结构简单,部署方便,如果客户端的数量和应用不是特别巨大的话,一台服务器机器就能搞定。当然其缺点是只能使用一台服务器(因为采用了消息机制),不可做多服务器集群和负载均衡,扩展受到了一定限制。

解决DataSnap支持的Tcp长连接数受限的两种方法的更多相关文章

  1. 多进程解决datasnap支持的tcp长连接数量少的问题

    对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000 ...

  2. PyQt(Python+Qt)学习随笔:model/view架构中支持QListView列表中展示图标的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListView列表视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖 ...

  3. 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)

    分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...

  4. 实现iOS长时间后台的两种方法:Audiosession和VOIP

    http://www.cocoachina.com/applenews/devnews/2012/1212/5313.html 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在 ...

  5. Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. HDU 1160 排序或者通过最短路两种方法解决

    题目大意: 给定一堆点,具有x,y两个值 找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来 这里用两种方法来求解: 1. 我们可以一开始就将数组根据 ...

  7. hive权威安装出现的不解错误!(完美解决)两种方法都可以

    以下两种方法都可以,推荐用方法一! 方法一: 步骤一: yum -y install mysql-server 步骤二:service mysqld start 步骤三:mysql -u root - ...

  8. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...

  9. 解决vue项目eslint校验 Do not use 'new' for side effects 的两种方法

    import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app' ...

随机推荐

  1. 总结 IOS 7 内存管理

    [iOS7的一些总结].iOS中的内存管理 我们知道,为了更加方便地处理内存管理问题,将开发人员从繁琐的内存的分配和释放工作中解放出来而专注于产品和逻辑,iOS提供了一种有效的方法, 即自动引用计数A ...

  2. shake震动动画

  3. [JAVA] HTTP请求,返回响应内容,实例及应用

    JDK 中提供了一些对无状态协议请求(HTTP )的支持,下面我就将我所写的一个小例子(组件)进行描述: 首先让我们先构建一个请求类(HttpRequester ). 该类封装了 JAVA 实现简单请 ...

  4. ARC 和 MRC 小结

    ARC 和 MRC 内存管理 从 MRC—>ARC 就是将内存管理部分,从开发者的函数中转移到函数外部的runtime 中.由于 runtime 的开发简单,逻辑层次高,所以 runtime 的 ...

  5. IOS之代理

    作者:王泽豪 时间:2016年4月22日         ★代理是一种设计模式,它的价值在于通过一个统一的模式,解决一个原本并不方便.甚至是几乎不可能解决的问题.         ★代理有两个关注点: ...

  6. Java学习笔记——内部类及其调用方法

    一.static内部类的static方法 public class Test0719_Inner_Test { public static void main(String[] args) { //s ...

  7. XML DTD验证

    XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...

  8. oracle-同义词Synonyms + 用户访问控制(grant 和 revoke)

    同义词(Synonyms) 创建同义词:    语法    CREATE [PUBLIC] SYNONYM synonym        FOR    object; CREATE SYNONYM   ...

  9. 判断当前是否运行于Design Mode

    在使用Visual Studio设计XAML时,设计器运行在[设计时]状态.VS在内部运行这些代码,帮你把界面的类真实效果展示出来.一般情况下也不会有什么问题,但是当代码中存在外部资源时,XAML可能 ...

  10. 查看Nodejs 占用的端口

    查看 Nodejs 占用的端口 ps -ef | grep node强制关闭端口 kill