DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: liangjiping168
今日帖子: 16
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2018/3/1 9:19:18
标题:
老话重提:Datasnap究竟能承受多大的负载能力? 浏览:2376
加入我的收藏
楼主: 一个产品,
客户端:预计20000(2万)个客户端。
服务器:mysql数据库,100张左右的数据表
最大的表差不多50个字段,上亿行记录,基本都是varchar和数字类型(差不多有5张这样的大表)。
还有一张图片表,图片大小1K,以Image字段类型存储图像,行数预计千万行级别。

服务器硬件,目前是阿里云,2核8G,Windows Server 2012;

应为业务需求应该采用长链接,全天候24H。
这样的产品,以Datasnap构架来做,合适吗?能拖得起吗?
----------------------------------------------
-
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2018/3/1 9:38:28
1楼: 单端口1300以内的长连接没问题
加载数据得要看你怎么设计了
----------------------------------------------
就怕想不到,没有做不到的
作者:
男 wangyunyong (新秀) ★☆☆☆☆ -
盒子活跃会员
2018/3/1 9:42:06
2楼: 20000(2万)个客户端肯定要做应用服务器的负载,一台应用服务器肯定不行。
----------------------------------------------
-
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2018/3/1 9:53:21
3楼: 上亿行记录 ,好恐怖啊。。。

我200w记录就已经有点慢,最多1000w记录
----------------------------------------------
kittyapp
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2018/3/1 10:06:12
4楼: 搞错了,应该不指1300
是我的测试客户端程序错了,用线程创建连接加载数据后,没有把数据释放,导致测试户端卡死,我等下在测试下5W+的连接
----------------------------------------------
就怕想不到,没有做不到的
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2018/3/1 10:16:01
5楼: 随便个应用服务器都能支持,为何一定要delphi写服务端??
----------------------------------------------
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2018/3/1 10:37:36
6楼: Tomcat的性能与最大并发配置

当一个进程有 500 个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。



当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。

     具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给 JVM 的内存越多性能也就越高,但也会加重 GC 的负担。
     操作系统对于进程中的线程数有一定的限制:
      Windows 每个进程中的线程数不允许超过 2000
      Linux 每个进程中的线程数不允许超过 1000
      另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用。
      Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
       Tomcat 默认的 HTTP 实现是采用阻塞式的 Socket 通信,每个请求都需要创建一个线程处理。这种模式下的并发量受到线程数的限制,但对于 Tomcat 来说几乎没有 BUG 存在了。
       Tomcat 还可以配置 NIO 方式的 Socket 通信,在性能上高于阻塞式的,每个请求也不需要创建一个线程进行处理,并发能力比前者高。但没有阻塞式的成熟。
       这个并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算,那并发能力势必会下降。如果每个请求都含有很多的数据库操作,那么对于数据库的性能也是非常高的。
       对于单台数据库服务器来说,允许客户端的连接数量是有限制的。
       并发能力问题涉及整个系统架构和业务逻辑。
       系统环境不同,Tomcat版本不同、JDK版本不同、以及修改的设定参数不同。并发量的差异还是满大的。


maxThreads="1000" 最大并发数 

minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

acceptCount="700"// 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理



配置实例:

<Connector port="8080" protocol="HTTP/1.1"   minSpareThreads="100"   maxSpareThreads="500"      maxThreads="1000"   acceptCount="700" 

          connectionTimeout="20000"
          redirectPort="8443" />
----------------------------------------------
kittyapp
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2018/3/1 10:40:11
7楼: 随便个应用服务器都能支持  20000(2万)个客户端 ,是不准确的。

必须用服务器集群。

另外即使可以支持2w连接,但数据库的读写 才是系统最大的瓶颈。。。
----------------------------------------------
kittyapp
作者:
女 google220 (google220) ★☆☆☆☆ -
普通会员
2018/3/1 11:30:09
8楼: 数据库,请用SSD RAID10;可搞。
----------------------------------------------
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2018/3/1 12:00:56
9楼: 单个DATASNAP中间件是无法支持2W个长连接的,用DATASNAP中间件群集是可以的。
我有DATASNAP中间件群集方案——支持负载均衡,自动故障转移,且可以随着应用规模的不断扩展自由地扩展DATASNAP中间件群集(中间服务不需要中止),且中间件还支持数据库群集。
如果不使用长连接而使用短连接,单个DATASNAP中间件可以支持更多的客户端数量。这点是可以肯定的。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2018/3/1 12:01:03
9楼: 我是这样计算的,我们目前大概每年新增500个客户,一个客户10个客户端左右,则一年递增5000客户端。做了4年预算2万。

订单表,每个客户一天的订单估计是200个平均数,一年则7万左右,500个客户则是3500万,4年预算差不多1.4亿行订单,还有订单子表记录数会更多。

不使用长连接,能解决问题吗?
Delphi无能为力?
----------------------------------------------
-
作者:
男 zhangpuqing (pupu) ★☆☆☆☆ -
普通会员
2018/3/1 13:30:57
10楼: 负载问题涉及到多个方面,不仅是软件开发工具的事情.
服务器性能\网络\数据库\业务量\应用等等.
我们大家是无法准确判断的,只能根据经验,但会存在极大误差.
所以请你自己多做测试.

从你的表述看负载也是逐渐累加的过程,你有充足的时间进行优化.

个人意见如下:
1.你们云服务器跟网络不够用.(都在上面跑,还有数据训之类的)
2.数据库mysql的优化需要一些功底.
3.不用datasnap改为底层的socket会极大提高效率.
4.长链接不是好的机制.
----------------------------------------------
-
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2018/3/1 13:52:16
10楼: 额,,,,,已确认
单个DATASNAP中间件最多支持1300个长连接,
可能是WINDOWS的限制
也有可能是INDY的限制
有时间在去翻源代码
----------------------------------------------
就怕想不到,没有做不到的
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2018/3/1 21:19:41
11楼: 首先,mysql单表根本就承载不了亿级的数据。
另外,长链接的极限就是65536,具体多少就要看你用的模型以及内存的规划。
最后,一般来说,大数据的瓶颈都在数据库里,这个要看你自己如何去设计你的数据结构。

但是,可以提一点,win系统如果不用iocp模型、linux不用epoll模型,那么基本也就在1千左右的并发。
----------------------------------------------
--
作者:
男 mousesoft (MouseSoft) ★☆☆☆☆ -
盒子活跃会员
2018/3/2 0:26:38
12楼: 肯定是可以的,因为你不是并发20000,采用DataSnap以REST的方式给客户端调用,采用短连接的方式;数据库采用线程池的方式;
主要还是要看你的程序怎么写;
----------------------------------------------
-
作者:
男 mousesoft (MouseSoft) ★☆☆☆☆ -
盒子活跃会员
2018/3/2 0:29:59
13楼: 其实现在写程序并不需要太专注一个程序的效率有多高,有很多方案的;可以多启动几个DataSnap服务实例,每实例占用一个端口,再部署一个前端服务如Nigx之类的进行负载均衡就可以了。
方案很多,看你怎么架构而已。
----------------------------------------------
-
作者:
男 jurafish (jurafish) ★☆☆☆☆ -
普通会员
2018/3/2 8:01:40
14楼: 最好用J2EE开发,delphi不适合这种高并发的应用场景。
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2018/3/2 8:31:54
15楼: 关于并发、效果是个动态的概念,若只是简单的OLTP应用,20亿记录跟性能也没啥关系
就像从北京到上海3个小时是很快了,但若距离只是1公里,10分钟也是非常慢的了
主要还是看应用特点、负荷情况
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2018/3/2 11:52:02
16楼: 多谢各位提醒。我打算使用短链接来测试一下负荷。
对datasnap有信心,是因为之前写了一个程序的外挂小工具,运行有几年了,客户端也有大几千个,短链接。同时执行的高并发也是有的,我设计了0点到6点的随机时间点所有客户端都在这个时间段上传数据。

刚刚看了一下一个大表,目前单表有9850页X1000行,也差不多千万级别,效率还算好。mysql。

对于datasnap负载能力官方貌似也比较少有类似文章
另外关于数据库的操作效率增加一个datasnap中间层也不确定比ado直连低多少?
----------------------------------------------
-
作者:
男 xebaobei (神仔) ▲▲▲▲△ -
普通会员
2018/3/2 14:18:45
17楼: 用 IOCP 在线 1W+ 的路过,单服务器。
----------------------------------------------
-
作者:
男 chinaz (有缘人) ★☆☆☆☆ -
神秘会员
2018/3/2 17:44:35
18楼: 继续datasnap继续研究,看了一本书,李维老师的,如何让datasnap的rest服务,支持上千个客户端连接呢?
 找到delphi的源文件Web.WebReq,拷贝到你的程序目录下,找到

constructor TWebRequestHandler.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCriticalSection := TCriticalSection.Create;
  FActiveWebModules := TList.Create;
  FInactiveWebModules := TList.Create;
  FWebModuleFactories := TWebModuleFactoryList.Create;
  FMaxConnections := 32;
  FCacheConnections := True;
end;

把  FMaxConnections := 32; 改为 FMaxConnections := 0;

就可以支持上千个客户端连接了,原来官方认为我们同时支持的客户端不超过32个,所以很多人认为datasnap只能在企业运用 :(


----------<
摘自http://bbs.2ccc.com/topic.asp?topicid=524327

如果用restful是短连接,连接后马上释放,服务器datasnap自维护了了一个sessionlist, 应该可以上万吧
----------------------------------------------
一路风雨走过,因为有你们
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/3/2 18:07:09
19楼: 在线数这东西,就和 僵尸粉 一样。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2018/3/2 19:07:09
20楼: 从我做项目的经验来说,你们项目经理经验少,而且想多了。

问题出在高估了服务器的负载能力。我的经验是现在租用的服务器能支持的最大长连接大概在2~3千吧。

服务器负载的问题不是Delphi来解决的。

长连接有必要么?是否能转换为短链接?这需要认真考虑。

既然是未来需求,而且存在成本和技术的问题,那就留给未来解决吧。
如果我是项目经理,我会搁置这问题。把当前目标定为1~2年内的需求。

另外,建议购买oracle数据库吧。这种级别的数据量,mysql的人力成本会更高。

我的经验,做大型项目时,免费的往往比付费的成本会更高。

另外,隐含着一个问题,大家都没提到。我提醒你一下,这么多数量的长连接,你数据库都连不上。数据库的连接数也是有瓶颈的。
----------------------------------------------
-
作者:
男 he_19_79 (he) ▲▲▲▲▲ -
普通会员
2018/3/2 21:17:43
21楼: 楼上,没有短连接,只有无状态。
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2018/3/2 22:25:12
22楼: mysql有分区表,按天存储订单,每天凌晨做报表或汇总表或查询表的统计作业(按天处理),这样处理起来,量不是问题。

长连接非必要最好不使用,datasnap做大量连接的长连接不是个好选择,且ds只做数据获取和db.select/insert/update/delete,还不如弄个iis/tomcat搞个简单的中间件。

ds是阻塞+线程模式,win的进程是有线程数限制
如采用异步+队列模式的作业模式,则可减少线程数的依赖,典型的模式是iocp的工作模式(io线程+业务服务线程模式)

其它:客户端多了,请注意设计多台服务器分布式负载结构,保证可横向扩展,别一挂全挂。
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2018/3/2 22:36:41
23楼: DB的设计及外部程序对DB的连接要求决定了你整体平台提供的服务能力

更少的业务服务线程数,服务更多的业务请求数,一般的做法就是队列服务模式,db的延时性的批量操作(入库类),内存结构的预加载(读配置类),及高耗时性的查询类的限制类。也就说通常所说的读写分离的一些具体作法。

db的连接数是有限的,业务服务线程限定于N(配置值),所以也不需要所谓的连接池概念,因为一个业务线程就配置了一个连接,不断开,不停的服务请求。
连接池的处理只是一些场景适用,请不要相信池是万能的。
----------------------------------------------
-
作者:
男 xebaobei (神仔) ▲▲▲▲△ -
普通会员
2018/3/3 0:07:47
24楼: 20楼:阿里云1w+长连接的服务器,我在运行的三个!没什么问题,流量设置成按量付费就行。
在逻辑上要控制好队列、连接池,不然一起返回太多大数据,容易堵死。
----------------------------------------------
-
作者:
男 hexi (Hexi) ★☆☆☆☆ -
盒子活跃会员
2018/3/24 19:03:37
25楼: 你的数据库规模并不大,可能用户并发访问大。
建议采用分布式微服务架构。能用内存缓存的就缓存,减少数据库访问。
数据库可以采用1主多从架构。
例如:
入库和访问分开。采用通过消息中间件耦合各个数据库访问模块。
图片服务器: 采用内存缓存层+数据库访问层+DB
应用服务器:如果内存够大,把大部分数据或常用建立到内存中。再通过消息中间件将更新的数据传输到持久化程序,进行保存。
使用统一的SSL卸载、认证、日志及负载均衡软件进行统一接入。
----------------------------------------------
-
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2018/3/25 15:39:11
26楼: 1)免费开源的MORMOT中间件
2)支持跨越D6~D10.2.3开发
3)使用HTTPS.SYS和WEBSOCKET通信
4)支持ORACLE,MYSQL,MSSQL数据库,不依赖三方数据引擎
5)请自备测试数据库
6)支持文件上传、下载
7)支持HTTP SESSION安全验证
8)REST中间件(HTTP通信,JSON序列)
9)MORMOT下载地址:https://github.com/synopse/mORMot



咏南中间件 QQ:254072148
咏南中间件QQ群:92449782(源码下载地址) 
咏南中间件博客:https://www.cnblogs.com/hnxxcxg/ (解压密码)
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS