在 Wildlife,我们于 2015 年底、2016 年初开始制作同步多人游戏。当时,我们的大多数后端系统都是用 node.js 编写的,原因有几个。它具有良好的性能和可扩展性,尤其是与 Java 或 Python 等其他语言相比时。它是我们的软件工程师最精通的编程语言,最重要的是,它是当下流行的编程语言。

因此,我们可以使用几个很好的开源项目来构建我们的系统。其中一个项目是 Pomelo,“一个用于 node.js 的快速、可扩展的游戏服务器框架”,正如他们在 Github 上的自述文件中所写。

但是,为什么我们需要一个游戏服务器框架呢?以一种非常简单的方式,对于一个复杂的游戏,我们需要不同类型的服务器。

我们可以称它们为(不那么微的)服务。这些服务(或服务器类型)中的每一个都有不同的职责,并且需要以独立的方式进行扩展。例如,我们有连接器,这些连接器是玩家(或他们的手机)所连接的服务器,用于处理身份验证和授权等基本操作。我们有比赛(和魔术)实际发生的游戏服务器。我们有元游戏服务器,游戏中的其他操作会在其中发生,例如卡牌升级、获取排行榜等。

对游戏服务器的需求与元游戏服务器完全不同,我们需要所有这些服务器横向扩展和缩减,因为我们的需求非常大,会随着特殊日期、功能发布和一天中的不同时间而波动.

该框架的一大职责是确保我们能够以透明和有效的方式编排所有这些不同的服务器。服务器需要知道存在哪些其他服务器,与它们的类型无关,还需要能够相互通信,经常在其他服务器中执行操作。我们将这些功能称为服务发现和 RPC(远程过程调用)。

该框架的另一个主要职责是游戏(客户端)需要连接到服务器。这些连接通常是长期存在的,并且具有严格的低延迟要求。能够向正在玩同一场比赛的多个玩家广播消息也非常重要。

Pomelo 确实简化了这两项职责,并且是我们推出第一款同步多人游戏的绝佳工具。但是该框架的维护者并没有保持最新,并且使用了一个非常旧的 node.js 版本(是的,回调地狱!)。当我们发现错误时,我们发送了 PR,但由于代码未维护,因此需要很长时间才能合并这些更改(如果有的话)。

最重要的是,最终,它的一些错误或设计选择不允许它以我们需要的规模满足我们的需求。由于服务器过多,用于指示服务器是否处于活动状态的 ping 消息的广播足以使服务器过载。如果服务器位于不同的区域,处理 RPC 也非常困难。

随着 Pomelo 达到我们的极限,我们开始考虑下一步应该构建什么。我们的价值观之一是:我们通过研究进行创新。这意味着在承诺做一些新的事情之前,我们会努力了解什么有效,什么无效。因为我们多年来一直使用 Pomelo 作为我们游戏服务器的框架,所以我们对它非常了解:它的优点和缺点。这使我们能够保持好的一面,改变坏的一面,并改进可能更好的东西。

在 2018 年初,我们已经将 Go 作为后端系统的主要语言使用了很长一段时间。

2016 年年中,从在 node.js 中构建服务到 Go 的转变主要基于 Go 令人敬畏的并发机制,这是为我们数百万玩家构建可扩展系统的关键。此外,由于我们有很多服务器,低资源使用率是一个非常相关的特性,因为它降低了我们的基础架构成本和复杂性。

那时,我们构建 Pitaya,Wildlife 自己的可扩展游戏服务器框架是一个完美的选择。

从 Pomelo,我们保留了客户端-服务器通信的分布式设计和协议。我们所做的最大改变在于服务发现和 RPC 的方法,因为它们是我们使用 Pomelo 的游戏中主要生产问题的根源。

在添加方面,我们希望 Pitaya 具有内置的可观察性功能,因此我们使其支持 Jaeger等OpenTracing 兼容框架 它还支持已经实现的 Prometheus 和 Statsd  。这是使用 Go 的最好的事情之一。因为我们如此沉浸在它的社区和令人惊叹的开源项目中,它不仅帮助我们创建了一个更高效的框架,还推动我们使用其他用 Go 编写的开源项目,例如 etcd 和 NATS

关于 Pitaya 在 Wildlife 中的成功和采用,该框架已经在我们的主要游戏中使用了几年,并帮助我们成功推出了一些迄今为止我们做过的最令人惊叹的游戏,例如 Tennis Clash 和 Zooba

我们的游戏工程师肯定更开心,因为我们还想创建相关项目,让使用 Pitaya 的项目开发更容易。一个例子是 pitaya-bot,一个用于集成和压力测试的机器人框架。由于 Go 的低内存和 CPU 占用空间以及令人惊叹的分析工具 pprof ,我们的 SRE 和基础设施工程师更开心。

对我们来说,将 Pitaya 构建为一个开源项目非常重要,这样其他人也可以使用它来构建令人惊叹的项目。在我们从过去另一个惊人的开源项目中受益匪浅之后,这是合乎逻辑的选择。作为奖励,我们可以让其他人通过为项目做出贡献来帮助我们改进框架。

希望这篇文章解释了我们为什么要构建 Pitaya 以及​​为什么 Go 是这样做的正确选择。在下一篇文章中,我们将深入解释 Pitaya 的一些功能和技术决策。

如果您像我们一样喜欢构建具有挑战性的新项目和 Go,那么您可以成为我们团队的一员!看看我们的 可用职位 ,我们希望很快见到你!