我们实际解决的问题
我们需要支持Treasure Hunt游戏模式中拥有成千上万的并发玩家。由于游戏采用事件驱动架构,每个玩家的移动、物品拾取和宝藏收集都会触发大量事件,这些事件需要服务器快速高效地处理。问题在于事件总线容易拥堵,导致不可预测的延迟和卡顿。
我们最初尝试的(以及为什么失败)
起初,我们试图通过引入多个事件总线实例来缓解拥堵,每个实例都有自己的事件处理器。我们还实现了一个负载均衡器来将流量分配到多台服务器上。然而,这种设置最终导致了"服务器农场效应",负载均衡器会将流量重定向到已经拥堵的服务器,结果造成了更大的停滞。
事后的反思,我们应该认识到我们的方法侧重于“分摊痛苦”而非“减轻痛苦”。通过将拥堵分散到多台服务器上,我们只是推迟了不可避免的停滞,而不是真正解决问题的根本原因.
架构决策
经过团队一系列激烈的讨论,我们决定采取不同的方法。我们引入了一个名为“事件分块”的概念,将相关事件分组为更大的块,并批量处理它们。这使我们能够显著减少实时处理的事件数量,使系统变得更加高效和可扩展。
我们还使用 Amazon SQS 实现了一个自定义事件队列,并采用了一种消息驱动架构。这使我们能够将事件处理卸载到工作节点,让主服务器专注于处理游戏逻辑和玩家输入。
从这次经历中,我们获得的一个关键洞察是理解正在处理的事件的具体性质的重要性。通过分析事件模式和频率,我们能够优化事件分块和消息驱动架构,以更好地满足我们游戏的需求。
数字说明了什么
在推出新架构后,我们成功实现了暂停时间的显著减少,从平均10分钟降至不到5秒。提升的可扩展性也使我们能够处理更大的用户群,我们的服务器轻松支持超过5,000名并发用户。
这些指标还显示,事件分块方法将实时处理的事件数量减少了10倍,相应地降低了服务器负载。我们还观察到延迟显著降低,从平均200毫秒减少到不到50毫秒.
我会做不同的改变
如果我能重新做一次,我会更加专注于理解正在处理的事件的具体性质以及底层系统需求。我也会投入更多时间分析事件模式和频率,以指导事件驱动架构的设计。
我打算进一步探索更高级的负载均衡技术,例如基于机器学习的负载均衡器,以识别并将流量重定向到负载较轻的服务器。我也会考虑实施更复杂的监控和警报系统,以检测拥堵的早期预警信号,从而从一开始就防止系统停滞。
总之,构建可扩展的Hytale服务器的经验让我认识到解决复杂工程问题需要采取整体性方法的重要性。通过理解系统的具体需求,分析底层系统和数据,并实施针对性解决方案,我们可以创建更高效、可扩展的系统,以满足用户的需求。











