架构:TSocketConnection -> scktsrvr.exe -> RemoteDataModule
现状:大量客户端(如200个)同时发起连接请求,中间层或scktsrvr明明无法处理这么多的连接,却又不推辞,最终导致客户端、中间层和scktsrvr都死掉。
期望:让scktsrvr限制Socket的数量,超过限度(如20个)之后的客户端可以向scktsrvr发出连接请求,但scktsrvr不分配给Socket,拒绝连接;客户端超时之后,弹出对话框提示用户。
条件:
1、在客户端,必须由应用程序自己来捕获“无法连接”这个错误,不能让操作系统擅自弹出对话框;
2、在客户端,必须由应用程序自己指定尝试连接的超时时间,不能无限地等下去。
3、在服务器端,scktsrvr拒绝“超限客户端”的连接请求之后,仍然正常监听;当现有客户端释放连接,导致连接总数低于限制值时,scktsrvr又可继续接纳客户端的连接请求。
4、在服务器端,scktsrvr拒绝一个“超限客户端”的连接请求时,必须干净地关闭或拒绝创建Socket,干净地结束或拒绝创建Thread,不能在内存里积攒越来越多的“死Socket”“死Thread”。
5、可少量改写scktsrvr,但不能大量改写或全部重写,不能换架构,不能用第三方构件。
解决方案 »
- cxgrid 合并单元格时,如何选中一行时合并列不选中
- 如何使用Delphi编写可用于ASP等程序的DLL文件?在线等.
- ●【◎】● 基于绿色Delphi的强大的RIA框架平台,轻松开发Web系统
- 报表数据分组的问题,不知能否?
- idftp的问题,头疼!!!
- 有谁贴出来TStringGrid的使用方法。怎么设置各个单元格的颜色等设置。
- 哪里有VisiBroker for D7的版本下载,我买的D7安装盘是一张的
- 急求:FindNextPrinterChangeNotification的例子,
- 一个初学的困惑,用socket发送图像的程序
- 怎样得到一个数据集的当前记录号?
- 设置字间距?(不同字符显示字距不同?)
- delphi dbgrideh 相同数据行合并的问题
现在只希望在scktsrvr及其引用的库(单元)上做文章。
这个 负载均衡 的入口,其实只是一个特殊的scktsrvr,它仅仅负责接收其它真正的scktsrvr的负荷,把连接进来的客户端转到负荷最小的真正的scktsrvr
我曾尝试在OnGetSocket、DoConnect等处写,写CloseSocket、Socket.Close、Disconnect,都没有成功。
我希望在请求连接的环节由服务器断掉。
并且不希望使用负载均衡。我只用一台服务器,只用一个中间层程序,只用一个scktsrvr.exe
现在的midas程序的状况是:允许所有储户同时进入大厅,但窗口营业员只能为10个储户办业务,于是储户们就在窗口争抢,搅成一锅粥,最后谁也办不成业务。
“负载均衡”的解决方案是:开4个大厅,每个大厅仍是10个窗口。银行门口站一个迎宾,根据四个大厅的业务繁忙程度来引导新储户到最闲的大厅。
我的要求是:仍然只是1个大厅、10个窗口,但只允许10个储户同时进大厅。大厅里有10个储户时,第11个储户会在门口处被迎宾拒绝进入。储户可以等几分钟再来,也可以等几小时再来,也可以不再来。
使用 datasnap 吧。你的这个要求很容易实现的。给你一篇文章参考。http://blog.csdn.net/aroc_lo/archive/2010/02/28/5333773.aspx看过之后,你才发觉 Midas/Socket/Scktsrvr 可以扔了。拥抱 datasnap 吧。