在Facebook应用和云计算时代,我正在重新思考大规模多人游戏。假设我要在现有开放协议的基础上构建一个服务于100万并发玩家的系统。
假设每个玩家都有一个传入消息队列(用于聊天等),平均还有一个传入消息队列(公会、区域、副本、拍卖等)。因此我们需要2,000,000条队列。每个玩家会同时监听1-10个队列。每个队列平均可能每秒接收到1条消息,但某些队列将具有更高的速率和更多的听众(例如,关于某个等级副本中实体位置的队列)。让我们假设系统排队延迟不超过100毫秒,这对于轻度动作取向的游戏来说是可以接受的,但对于Quake或虚幻锦标赛之类的游戏则不行。
从其他系统中,我知道在单个1U或刀片机箱上为10,000个用户提供服务是可以合理期望的(假设没有其他昂贵的操作,如物理模拟等)。
因此,使用交叉栏群集系统,客户端连接到连接网关,然后连接到消息队列服务器,我们将获得每个网关10000个用户,使用100个网关机器,每个队列服务器20000个消息队列,使用100个队列机器。再次强调,这只是一般范围的估计。每个MQ机器上的连接数量非常少:约为100个,用于与每个网关通信。网关上的连接数量将要高得多:10,100个用于客户端和所有队列服务器的连接。(除此之外,还需要添加一些用于游戏世界模拟服务器等的连接,但我现在试图将其分开处理)
如果我不想从头开始构建,那么我必须使用一些现有的消息传递和/或队列基础设施。我能找到的两个开放协议是AMQP和XMPP。 XMPP的预期用途更类似于这个游戏系统所需的,但开销非常明显(XML,加上冗长的存在数据,加上必须在其上构建的各种其他通道)。 AMQP的实际数据模型更接近我上面描述的内容,但所有用户似乎都是大型企业类型的公司,并且工作负载似乎与工作流相关,而不是实时游戏更新相关的。有没有人对这些技术或其实现具有白天经验可以分享一下?