我正在重新思考 Facebook 应用程序和云计算时代的大型多人游戏。
假设我要在现有的开放协议之上构建一些东西,并且我想同时为 1,000,000 名玩家提供服务,只是为了确定问题的范围。
假设每个玩家都有一个传入消息队列(用于聊天等),平均还有一个传入消息队列(公会、区域、实例、拍卖......),所以我们有 2,000,000 个队列。一名玩家一次将收听 1-10 个队列。每个队列平均每秒可能有 1 条消息,但某些队列将具有更高的速率和更多的侦听器(例如,级别实例的“实体位置”队列)。让我们假设系统排队延迟不超过 100 毫秒,这对于轻度面向动作的游戏(但对于 Quake 或 Unreal Tournament 之类的游戏)来说是可以的。
从其他系统来看,我知道在单个 1U 或刀片服务器上为 10,000 个用户提供服务是一个合理的期望(假设没有其他昂贵的东西,比如物理模拟或诸如此类的东西)。
因此,对于交叉开关集群系统,客户端连接到连接网关,连接网关又连接到消息队列服务器,我们将获得每个网关 10,000 个用户和 100 个网关机器,每个队列服务器有 20,000 个消息队列和 100 个队列机器。同样,仅用于一般范围。每台 MQ 机器上的连接数量很少:大约 100 个,用于与每个网关通信。网关上的连接数会高很多:客户端 10,100 + 到所有队列服务器的连接。(最重要的是,为游戏世界模拟服务器或其他东西添加一些连接,但我现在正试图将其分开)
如果我不想从头开始构建它,我将不得不使用一些现有的消息传递和/或排队基础设施。我能找到的两个开放协议是 AMQP 和 XMPP。XMPP 的预期用途有点像这个游戏系统所需要的,但是开销非常明显(XML,加上详细的存在数据,加上必须在上面构建的各种其他通道)。AMQP 的实际数据模型与我上面描述的更接近,但所有用户似乎都是大型企业型公司,工作负载似乎与工作流相关,而不是实时游戏更新相关。
有没有人有这些技术或其实现的白天经验,你可以分享?