解决DataSnap支持的Tcp长连接数受限的两种方法
如何解决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长连接数受限的两种方法的更多相关文章
- 多进程解决datasnap支持的tcp长连接数量少的问题
对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000 ...
- PyQt(Python+Qt)学习随笔:model/view架构中支持QListView列表中展示图标的两种方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListView列表视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖 ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)
分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP
http://www.cocoachina.com/applenews/devnews/2012/1212/5313.html 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在 ...
- Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- HDU 1160 排序或者通过最短路两种方法解决
题目大意: 给定一堆点,具有x,y两个值 找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来 这里用两种方法来求解: 1. 我们可以一开始就将数组根据 ...
- hive权威安装出现的不解错误!(完美解决)两种方法都可以
以下两种方法都可以,推荐用方法一! 方法一: 步骤一: yum -y install mysql-server 步骤二:service mysqld start 步骤三:mysql -u root - ...
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...
- 解决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' ...
随机推荐
- 2dx解析cocosbuilder中使用layer时的缺陷
2dx解析cocosbuilder中使用layer时的缺陷 cocos2d-x 3.7 cocosbuilder中的layer通常会用到触摸属性: 但是在2dx解析布局文件的时候,却很多属性都没解析: ...
- 从敏捷开发到小团队SVN
一.敏捷之惑 敏捷开发,有一个很好的实践,“每天都可以产生一个可用于发布的版本”. 以前对这句话感到非常的困惑,因为我们手中的项目是残缺的,基本只是程序的一个功能片段,在未集成之前如何发布得了?当然这 ...
- .NET强制进行即时垃圾回收
大家知道,.NET控制系统垃圾回收(一种自动回收未使用内存的服务)是自动的. 可有时候需要手动强制进行即时垃圾回收. 代码如下: GC.Collect();
- webapp新体验Rem实现移动端网页适配详解资源
本来想写一篇,webapp使用Rem的问题,查了一下相关rem的介绍之后,发现很多平台已经解释的很清楚了,图文并茂,于是我便想将其解释资源整理一些,方便以后自己查阅. 腾讯ISUX:web app变革 ...
- [转]Displaying standard DataTables in MVC
本文转自:http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc Controller act ...
- 2013 长沙网络赛J题
思路:这题对于其他能退出所有值的情况比较好像,唯一不能确定的是XXOXXOXXOXX这个形式的序列,其中XX表示未知,O表示已知. 我们令num[1]=0,那么num[4]=sum[3]-sum[2] ...
- HTML中的英文缩写标记、属性
我们知道是表示一个空格,因为在HTML中手动敲多个空格浏览器会认为是一个空格,具体的英文全称:Non Breaking Spacing 不间断空格
- 日历控件table布局
作为初学者,一开始就接触div+css ,所以说实话,我并不怎么喜欢table布局,一般逃避. 先上这次的效果图: 看到这个图,第一次用table布局没实现,原因是给tr加下边框失效.当时没找到原因, ...
- (转)浅谈.NET下的多线程和并行计算(一)前言
转载——原文地址:http://www.cnblogs.com/lovecindywang/archive/2009/12/25/1632014.html 作为一个ASP.NET开发人员,在之前的开发 ...
- iOS中调用系统录音功能及其播放
最近做的项目中,用到了录音的功能,简单记录一下. 我的想法是:通过重写button的点击事件,来达到录音的目的. /*----------------------------------[录音]--- ...