关于大规模服务器程序的设计

huliang66 2010-06-06 04:39:51
各位高手大家好,我现在在做一个数据采集系统,需要采集数万个设备的数据,设备做客户端,服务器做服务端。
他们之间的数据量很小。
我大概算了一下,一台服务器必须得连接1万台设备才能达到采集要求,整个流程是这样的:

1、服务器上启动监听端口,等待设备连接。
2、设备连接上了以后每隔几分钟会向服务器发送一段数据,服务器接收到数据后回复一个响应报文,同时服务器把接收到的数据存入数据库里面。
3、服务程序会不断的遍历数据库的一张表,一旦发现这张表里有他正在连接的设备的数据要发送时,取出数据,主动发送给设备,设备收到后,会返回报文,然后处理完存到数据库里面。
4、设备一旦上线会保持不断线,是长连接。
5、各个设备之间不需要通讯,也没有什么数据要互相同步,各个设备之和服务器之间通讯。



现在请教各位有什么好的设计模式
我现在想出的办法是
1:一个进程监听一个端口,等待连接200个设备,每个连接入的设备启动一个线程,每个线程占一个数据库连接,200个线程对应200个终端。然后启动50个进程,这样每台服务器就是50个进程*200个线程=1W个连接。

不知道这样稳定性如何,用的的windows 2008,不知道有没有连接数的限制?

2:使用IOCP


因为之前的项目都没有这么大的连接数,所以这种方式没有用到过,不知道是否是最适合这个项目。



大家还有什么好的办法?请赐教,如果有好的办法在加分。
...全文
255 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pro_X 2010-06-13
  • 打赏
  • 举报
回复
我们现在长用.IOCP没有问题
allen12345 2010-06-11
  • 打赏
  • 举报
回复
操作系统好像不能同时运行1万个线程吧,我试了一下,2千个左右。我的是XP系统
danscort2000 2010-06-09
  • 打赏
  • 举报
回复
10000个连接而已
好好规划一下
采用非阻塞TCP连接+SELECT就可以了
一个线程序专门负责LISTEN,取得连接后投递到全局连接结构
开1到N个线称,专门负责处理全局连接结构

全局连接结构
每个都放一个原子锁
有1-N个线程通过原子锁来轮循处理 这样比较有弹性

由一个主线程负责调度 1-N个线程,每过例如100MS循环一次

这样程序就非常有弹性了
dong364 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 pro_x 的回复:]
引用 6 楼 dong364 的回复:
1.首先如果这些设备是长连接的话,也就是服务端要维护1w个长连接,恐怕1台服务器应付不过来
我们普通PC机上,采用IOCP做的系统常年用户长连接超过3万都非常稳定,楼主的问题不在这里.
[/Quote]
3w个用户同时连接,长时间不断开,你试试
Pro_X 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dong364 的回复:]
1.首先如果这些设备是长连接的话,也就是服务端要维护1w个长连接,恐怕1台服务器应付不过来[/Quote]
我们普通PC机上,采用IOCP做的系统常年用户长连接超过3万都非常稳定,楼主的问题不在这里.
demonstyle 2010-06-07
  • 打赏
  • 举报
回复
第一种方式开这么多线程,效率差是肯定的了。
还是考虑下iocp,管理上万个链接是很轻松的。
huliang66 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 scq2099yt 的回复:]
使用IOCP,线程池+内存池(减少内存碎块的产生),我想你的系统应该也是7X24小时运行的吧,这个应该是应该用的,然后你要将从每个设备获取到的数据都存入到一个任务队列中,然后开一个线程专一从这个任务队列中取出数据,保存入库.必要时候可以使用cache机制,将重要的资料数据写入到磁盘中,在服务器程序重新启动后,免得还没有保存的数据丢失。
[/Quote]
前面有人发的我会看,谢谢。
Eleven 2010-06-07
  • 打赏
  • 举报
回复
IOCP+内存池方案。。。
china_ccboy 2010-06-07
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1866
看了楼上几位朋友说的。我也看了一下IOCP。这是一个可以做多服务端或多客户端的类。希望对楼主有用。
lijianli9 2010-06-07
  • 打赏
  • 举报
回复
使用IOCP,线程池+内存池(减少内存碎块的产生),我想你的系统应该也是7X24小时运行的吧,这个应该是应该用的,然后你要将从每个设备获取到的数据都存入到一个任务队列中,然后开一个线程专一从这个任务队列中取出数据,保存入库.必要时候可以使用cache机制,将重要的资料数据写入到磁盘中,在服务器程序重新启动后,免得还没有保存的数据丢失。
dong364 2010-06-07
  • 打赏
  • 举报
回复
并发连接数的限制体现在你的代码中的设置,一般2000个并发连接左右,windows对并发连接数的限制体现在你的服务器硬件配置,若你找一个128M内存的充当服务器,我想是肯定接受不了2000个并发连接
tianhaixin 2010-06-07
  • 打赏
  • 举报
回复
学习中……
scq2099yt 2010-06-07
  • 打赏
  • 举报
回复
使用IOCP,线程池+内存池(减少内存碎块的产生),我想你的系统应该也是7X24小时运行的吧,这个应该是应该用的,然后你要将从每个设备获取到的数据都存入到一个任务队列中,然后开一个线程专一从这个任务队列中取出数据,保存入库.必要时候可以使用cache机制,将重要的资料数据写入到磁盘中,在服务器程序重新启动后,免得还没有保存的数据丢失。

huliang66 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mori3000 的回复:]
呵呵,你这个需求,我的源码现成的已经上传了,免费下载,去查查我的帖子吧,里面有资源链接
[/Quote]
谢谢。
末日3000 2010-06-07
  • 打赏
  • 举报
回复
呵呵,你这个需求,我的源码现成的已经上传了,免费下载,去查查我的帖子吧,里面有资源链接
huliang66 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dong364 的回复:]
1.首先如果这些设备是长连接的话,也就是服务端要维护1w个长连接,恐怕1台服务器应付不过来,你需要做连接平衡,如一台服务器做连接调衡工作,由它负责把接收到的新连接调配给哪一台空闲一点的工作服务器,这台连接调配服务器跟其他工作服务器群一直保持链接,动态更新工作服务器的连接数情况。
2.每台服务器采用IOCP,管理好内存,比如可以考虑采用内存池的思想减少new分配内存引起的时间开销,每台服务器如果采……
[/Quote]

谢谢,连接平衡由两台F5来担当,这方面不用考虑。

windows服务器对这样的连接数有没有什么限制?

还有总是感觉IOCP这种模型很不方便调试,我说的第一种方式是不是效率很差或者是根本满足不了这样的需求?

请各位高手前辈指教!
huliang66 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyq5945 的回复:]
IOCP我也没使用过,不过IOCP就是windows为大量socket所做的设计,网上搜下应该一大堆资料。
[/Quote]
谢谢,我也搜了这方面的资料,了解了一下IOCP很适合这个,我还想了解下我的第一种方式怎样。

[Quote=引用 5 楼 zhouzhangkui 的回复:]
1、用IOCP
2、基于客户端太多的原因,可以相应的添加增加服务器设备,以分担服务器负荷;
[/Quote]
谢谢。
一共有15台服务器,服务器都是4CPU16G内存的。分担到每台服务器必须支持1W左右。
dong364 2010-06-06
  • 打赏
  • 举报
回复
1.首先如果这些设备是长连接的话,也就是服务端要维护1w个长连接,恐怕1台服务器应付不过来,你需要做连接平衡,如一台服务器做连接调衡工作,由它负责把接收到的新连接调配给哪一台空闲一点的工作服务器,这台连接调配服务器跟其他工作服务器群一直保持链接,动态更新工作服务器的连接数情况。
2.每台服务器采用IOCP,管理好内存,比如可以考虑采用内存池的思想减少new分配内存引起的时间开销,每台服务器如果采用ado连接数据库的话可以考虑采用ado.net的连接池思想减少创建和释放新的连接引起的时间开销。
周药师 2010-06-06
  • 打赏
  • 举报
回复
1、用IOCP
2、基于客户端太多的原因,可以相应的添加增加服务器设备,以分担服务器负荷;
zyq5945 2010-06-06
  • 打赏
  • 举报
回复
IOCP我也没使用过,不过IOCP就是windows为大量socket所做的设计,网上搜下应该一大堆资料。
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧