SODME说腾讯单个游戏服务器支持2W个用户,
这样就单个服务器的通讯架构有没有更详细的讨论过,因为单个服务器是最基本的处理游戏业务逻辑的,我想这个应该和客户端是是长连接的SOCKET,在WINDOWS平台下前面已经有人提供了IOCP模型数据,可以支持到1W用户的长连接
,腾讯技术实力强点
机器配置再高点,可能在WINDOWS平台可以做到支持2W用户长连接的单个服务器.
但腾讯的游戏服务器是WINDOWS的SERVER吗,我估计不是的.
所以它应该不是采用WINDOWS下完成端口模型这种方式,
而在LINUX 或者UNIX下就没有完成端口模型这种可以使用,
这样UNIX下效率最高的是什么模型,直接自己使用EPOLL ?
或者采用ACE的PROACTOR模型来做呢.
要支持2W用户的长连接,线程模型又怎么安排呢,
是一个线程处理400个长连接然后用50个线程这种类似的吗,还是有什么更好的模型来实现这
2W用户长连接的数据通讯.
有了解的吗,可以详细讨论下它单个服务器怎么做到支持用户最大化的模型,
有了解中游平台的也可以说下
中游是深圳网域做的,应该这也有人了解的,说说吧
2006/4/12, Jacky <szche...@gmail.com>:
--
Donald
My Blog:http://flyingbug.blogjava.net
AIO是异步模型了,腾讯是用这种模型来实现的吗,异步模型那ACE
的PROACTOR就比较容易实现了在UNIX下的架构了?是这样的吗
嗯,这个信息是个方向
如果是使用EPOLL那应该是使用了同步读写的模型没有使用异步模型吧,是这样理解的吗,
1)单机最高容纳35,000人同时在线,对没有看错是这么多,由于它适用了Linux下高性能的网络处理模型ePoll技术,并且一系列高超的优化技术轻松破万人,当然为了稳定性考虑单机保持了2万人的容量,此时的带宽消耗为近30M;
2)采用共享内存方式高速完成进程间高速通讯;
3)服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构;
4)所有的游戏服务器不是直接和数据库联系,而是和数据proxy(qq管叫数据交换机和路由器)进行联系,由此带来的就是游戏用户数据的分布存储,我分析着应该是proxy上记录着这个用户数据所在的实际的dbserver的信息,然后定时的将最新的用户信息写回到db中去,这样就大大缓解了数据库服务器的压力,而且可以非常平滑的将数据分裂开来,数据库服务器也就可以无限的扩充,当然我觉得肯定有个数据库信息索引了用户的id和对应的存储地点的关联关系,这点就类似于google的原理了,所以对于数据库的硬件要求也就不是那么高了,qqgame的一组服务器通常是7台服务器,可以容纳5万人,其中就包含了数据库服务器,这点就不是棋牌游戏所常使用的数据集中存储了;
5)游戏服务器的网络和逻辑分开,不仅仅是层次上的分开,而是在进程上分开,然后中间通过共享通道进行管理和协调,并且增加了辅助线程,在主线程处理大压力的异步的操作的时候直接交给辅助线程处理,保障了游戏服务器的高效性运转。
大家讨论下呀,看来也不是什么很保密的,
QQGame的系统分析的文档外面也是有流传.
这是不是个病句呀?
ACE
Proactor能在Windows下和能支持aio的posix下的unix和linux下使用
这里的裂变方式是什么意思?
负载均衡阵列树状结构又是什么,谁能解释一下
AIO在SUN下是肯定可以用的,因为我正在移植,大问题没有
,还有些小问题,是用ACE_SUN_Proactor
这个类来实现的,在IBM的AIX下链接出错,可能有什么没有设置队,应该也是可以的.
这个贴子就没人讨论了?顶上去继续
具体点,假定服务器要保持2W稳定链接的SOCKET句柄
,因为还每隔30秒
或者60秒就需要遍历这些SOCKET看看是否有数据接收,是否活动的,
那遍历这
2W的活动句柄如果在一个线程中遍历那时间就不行了,
有什么好线程模型来管理这2W的活动句柄
2006/4/18, Jacky <szche...@gmail.com>:
不是编程语言里面的数组,是列表、集合,或类似概念的东西。。。由于插入、删除比较频繁,可能用list比较合适。
具体点吗?
如果你维护那个指针数组,是不是每个SOCKET句柄收到数据,你都要先查找一翻,把原来的记录给清了,在把刚收数据这个句柄放入数组里,
另外如果SOCKET每次收数据就要维护那个表,代价太大了吧,
SOCKET可能一秒种要收50次数据,那要对那个表维护50次吗,如果我定时遍历一个表,基本我只需要间隔定长时间比如
30秒维护一次.
所以我没觉得你那样有什么优势,是我没有理解你的想法吗?
不需要每次收到都去维护,超过5秒维护一次就够了。如果有句柄到list节点的映射(这个东西总该有的吧?一般都会映射到对象,可以由对象来保存一个list节点指向),移动一个list节点是非常快的,这个每隔5秒做一次维护就是移动节点到头部。
不过好像操作成本更高了,遍历处理2W个连接,找出超时的应该是很快的,不计发送的话,普通PC也能在几毫秒内完成。
> 3)服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构
>
> 这里的裂变方式是什么意思?
> 负载均衡阵列树状结构又是什么,谁能解释一下
照我的理解: 平面扩充
,假定你单台服务器支持2w用户,那你新增加一台服务器,那就扩容为
4w用户了,这时候 2w
-4W的用户都是增加负载在新加的服务器上,也就是说当是3w用户连接的时候,一个服务器是满负载着2w用户,另外一个服务器是
1w用户.
裂变式的扩充方式:与之相对应,当3w用户时候,每个服务器各负载
1.5w用户, 而不是一边2 w一边1w用户.
是这样的意思,因为是长连接,所以在客户端我没业务数据发送的时候,会定时(比如15秒)发送一次链路检测包,也就是说服务器每个保存的客户端socket句柄,正常情况下20秒内肯定有一次数据包可读,这样,超过20秒没有数据包的socket句柄,就会清除掉.
有什么好的方法管理?