|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2018/3/1 9:19:18 |
标题: |
老话重提:Datasnap究竟能承受多大的负载能力? |
浏览:2376 |
|
加入我的收藏 |
楼主: |
一个产品, 客户端:预计20000(2万)个客户端。 服务器:mysql数据库,100张左右的数据表 最大的表差不多50个字段,上亿行记录,基本都是varchar和数字类型(差不多有5张这样的大表)。 还有一张图片表,图片大小1K,以Image字段类型存储图像,行数预计千万行级别。
服务器硬件,目前是阿里云,2核8G,Windows Server 2012;
应为业务需求应该采用长链接,全天候24H。 这样的产品,以Datasnap构架来做,合适吗?能拖得起吗?
----------------------------------------------
- |
作者: |
|
2018/3/1 9:38:28 |
1楼: |
单端口1300以内的长连接没问题 加载数据得要看你怎么设计了
----------------------------------------------
就怕想不到,没有做不到的
|
作者: |
|
2018/3/1 9:42:06 |
2楼: |
20000(2万)个客户端肯定要做应用服务器的负载,一台应用服务器肯定不行。
----------------------------------------------
-
|
作者: |
|
2018/3/1 9:53:21 |
3楼: |
上亿行记录 ,好恐怖啊。。。
我200w记录就已经有点慢,最多1000w记录
----------------------------------------------
kittyapp
|
作者: |
|
2018/3/1 10:06:12 |
4楼: |
搞错了,应该不指1300 是我的测试客户端程序错了,用线程创建连接加载数据后,没有把数据释放,导致测试户端卡死,我等下在测试下5W+的连接
----------------------------------------------
就怕想不到,没有做不到的
|
作者: |
|
2018/3/1 10:16:01 |
5楼: |
随便个应用服务器都能支持,为何一定要delphi写服务端??
----------------------------------------------
|
作者: |
|
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
|
作者: |
|
2018/3/1 10:40:11 |
7楼: |
随便个应用服务器都能支持 20000(2万)个客户端 ,是不准确的。
必须用服务器集群。
另外即使可以支持2w连接,但数据库的读写 才是系统最大的瓶颈。。。
----------------------------------------------
kittyapp
|
作者: |
|
2018/3/1 11:30:09 |
8楼: |
数据库,请用SSD RAID10;可搞。
----------------------------------------------
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
|
作者: |
|
2018/3/1 12:00:56 |
9楼: |
单个DATASNAP中间件是无法支持2W个长连接的,用DATASNAP中间件群集是可以的。 我有DATASNAP中间件群集方案——支持负载均衡,自动故障转移,且可以随着应用规模的不断扩展自由地扩展DATASNAP中间件群集(中间服务不需要中止),且中间件还支持数据库群集。 如果不使用长连接而使用短连接,单个DATASNAP中间件可以支持更多的客户端数量。这点是可以肯定的。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
|
作者: |
|
2018/3/1 12:01:03 |
9楼: |
我是这样计算的,我们目前大概每年新增500个客户,一个客户10个客户端左右,则一年递增5000客户端。做了4年预算2万。
订单表,每个客户一天的订单估计是200个平均数,一年则7万左右,500个客户则是3500万,4年预算差不多1.4亿行订单,还有订单子表记录数会更多。
不使用长连接,能解决问题吗? Delphi无能为力?
----------------------------------------------
-
|
作者: |
|
2018/3/1 13:30:57 |
10楼: |
负载问题涉及到多个方面,不仅是软件开发工具的事情. 服务器性能\网络\数据库\业务量\应用等等. 我们大家是无法准确判断的,只能根据经验,但会存在极大误差. 所以请你自己多做测试.
从你的表述看负载也是逐渐累加的过程,你有充足的时间进行优化.
个人意见如下: 1.你们云服务器跟网络不够用.(都在上面跑,还有数据训之类的) 2.数据库mysql的优化需要一些功底. 3.不用datasnap改为底层的socket会极大提高效率. 4.长链接不是好的机制.
----------------------------------------------
-
|
作者: |
|
2018/3/1 13:52:16 |
10楼: |
额,,,,,已确认 单个DATASNAP中间件最多支持1300个长连接, 可能是WINDOWS的限制 也有可能是INDY的限制 有时间在去翻源代码
----------------------------------------------
就怕想不到,没有做不到的
|
作者: |
|
2018/3/1 21:19:41 |
11楼: |
首先,mysql单表根本就承载不了亿级的数据。 另外,长链接的极限就是65536,具体多少就要看你用的模型以及内存的规划。 最后,一般来说,大数据的瓶颈都在数据库里,这个要看你自己如何去设计你的数据结构。
但是,可以提一点,win系统如果不用iocp模型、linux不用epoll模型,那么基本也就在1千左右的并发。
----------------------------------------------
--
|
作者: |
|
2018/3/2 0:26:38 |
12楼: |
肯定是可以的,因为你不是并发20000,采用DataSnap以REST的方式给客户端调用,采用短连接的方式;数据库采用线程池的方式; 主要还是要看你的程序怎么写;
----------------------------------------------
-
|
作者: |
|
2018/3/2 0:29:59 |
13楼: |
其实现在写程序并不需要太专注一个程序的效率有多高,有很多方案的;可以多启动几个DataSnap服务实例,每实例占用一个端口,再部署一个前端服务如Nigx之类的进行负载均衡就可以了。 方案很多,看你怎么架构而已。
----------------------------------------------
-
|
作者: |
|
2018/3/2 8:01:40 |
14楼: |
最好用J2EE开发,delphi不适合这种高并发的应用场景。
----------------------------------------------
-
|
作者: |
|
2018/3/2 8:31:54 |
15楼: |
关于并发、效果是个动态的概念,若只是简单的OLTP应用,20亿记录跟性能也没啥关系 就像从北京到上海3个小时是很快了,但若距离只是1公里,10分钟也是非常慢的了 主要还是看应用特点、负荷情况
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
|
作者: |
|
2018/3/2 11:52:02 |
16楼: |
多谢各位提醒。我打算使用短链接来测试一下负荷。 对datasnap有信心,是因为之前写了一个程序的外挂小工具,运行有几年了,客户端也有大几千个,短链接。同时执行的高并发也是有的,我设计了0点到6点的随机时间点所有客户端都在这个时间段上传数据。
刚刚看了一下一个大表,目前单表有9850页X1000行,也差不多千万级别,效率还算好。mysql。
对于datasnap负载能力官方貌似也比较少有类似文章 另外关于数据库的操作效率增加一个datasnap中间层也不确定比ado直连低多少?
----------------------------------------------
-
|
作者: |
|
2018/3/2 14:18:45 |
17楼: |
用 IOCP 在线 1W+ 的路过,单服务器。
----------------------------------------------
-
|
作者: |
|
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, 应该可以上万吧
----------------------------------------------
一路风雨走过,因为有你们
|
作者: |
|
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的人力成本会更高。
我的经验,做大型项目时,免费的往往比付费的成本会更高。
另外,隐含着一个问题,大家都没提到。我提醒你一下,这么多数量的长连接,你数据库都连不上。数据库的连接数也是有瓶颈的。
----------------------------------------------
-
|
作者: |
|
2018/3/2 21:17:43 |
21楼: |
楼上,没有短连接,只有无状态。
----------------------------------------------
-
|
作者: |
|
2018/3/2 22:25:12 |
22楼: |
mysql有分区表,按天存储订单,每天凌晨做报表或汇总表或查询表的统计作业(按天处理),这样处理起来,量不是问题。
长连接非必要最好不使用,datasnap做大量连接的长连接不是个好选择,且ds只做数据获取和db.select/insert/update/delete,还不如弄个iis/tomcat搞个简单的中间件。
ds是阻塞+线程模式,win的进程是有线程数限制 如采用异步+队列模式的作业模式,则可减少线程数的依赖,典型的模式是iocp的工作模式(io线程+业务服务线程模式)
其它:客户端多了,请注意设计多台服务器分布式负载结构,保证可横向扩展,别一挂全挂。
----------------------------------------------
-
|
作者: |
|
2018/3/2 22:36:41 |
23楼: |
DB的设计及外部程序对DB的连接要求决定了你整体平台提供的服务能力
更少的业务服务线程数,服务更多的业务请求数,一般的做法就是队列服务模式,db的延时性的批量操作(入库类),内存结构的预加载(读配置类),及高耗时性的查询类的限制类。也就说通常所说的读写分离的一些具体作法。
db的连接数是有限的,业务服务线程限定于N(配置值),所以也不需要所谓的连接池概念,因为一个业务线程就配置了一个连接,不断开,不停的服务请求。 连接池的处理只是一些场景适用,请不要相信池是万能的。
----------------------------------------------
-
|
作者: |
|
2018/3/3 0:07:47 |
24楼: |
20楼:阿里云1w+长连接的服务器,我在运行的三个!没什么问题,流量设置成按量付费就行。 在逻辑上要控制好队列、连接池,不然一起返回太多大数据,容易堵死。
----------------------------------------------
-
|
作者: |
hexi (Hexi) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2018/3/24 19:03:37 |
25楼: |
你的数据库规模并不大,可能用户并发访问大。 建议采用分布式微服务架构。能用内存缓存的就缓存,减少数据库访问。 数据库可以采用1主多从架构。 例如: 入库和访问分开。采用通过消息中间件耦合各个数据库访问模块。 图片服务器: 采用内存缓存层+数据库访问层+DB 应用服务器:如果内存够大,把大部分数据或常用建立到内存中。再通过消息中间件将更新的数据传输到持久化程序,进行保存。 使用统一的SSL卸载、认证、日志及负载均衡软件进行统一接入。
----------------------------------------------
-
|
作者: |
|
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/
|
|