拥有每月8735 万活跃用户的 Farmville 是 Facebook 上最流行的游戏,也是因特网上最流行的 web game 之一。为了支持 scale out,这一应用被部署在云中,广泛地使用了缓存,有能力在顶峰时期关闭一些功能,并很好的运用了性能监测和管理。
按照来自开发该游戏的 Zynga 公司的开发者 Luke Rajlich 的说法,FarmVille 于 2009 年 6 月上线,4 天之后就达到了 100 万的用户,60 天内就达到了 1000 万。拥有每月 8000 万的活跃用户,FarmVille 影响到了 20% 的 Facebook 用户以及超过总数 1% 的世界人口。要在这样短的时间内在这样的规模下 scaling out,需要一定的硬件和软件解决方案。
InfoQ 采访了 Luke Rajlich 以了解更多的架构信息。首先,这一应用运行在云中的虚拟 Linux 服务器上,所以它可以方便的请求和接受额外的计算资源。该应用运行在基本的 LAMP 栈上,这里的 P 指的是 PHP。该应用广泛的使用了缓存:
基于上来说我们的应用是面向对象的,MVC 应用,有一个定制的 DB/Cache 接口。我们对于缓存相当依赖,特别是 memcache,用以支持我们的负载。同时,我们也有水平分区 (shard) 的数据库。
为了应付峰值的流量,这一应用依赖于在短时间内增加额外的容量:
从架构上来说,我们能够快速的增加容量,因为应用的负载可以被划分到任意的层次 (负载均衡,web 服务器,memcache,数据库)。同时,我们对于在任意层次增加容量有专门的形式化的程序。因此,增加容量的操作很容易管理并且能快速的执行。同时我们运行于虚拟的环境之上,因此我们可以快速的增加容量而不用预备额外的硬件资源,这一点非常明显的减少了从我们决定增加容量到我们实际增加所必需的硬件资源之间的时间。我们逐步的采用了配置工具,比如 puppet,以此减少了增加额外硬件所需要的开销。剩下的困难的部分首先在于如何知道和发现应用的哪一部分会破坏性能。为了顾及这一考虑,我们对于前面所提的服务降级投入了许多时间,同时还花费了大量的精力投入到应用性能的监控上面。
这一游戏有好些个部件,当性能成为瓶颈的时候“我们可以有效的关闭在平台上使用的不太重要的功能”,以此缓解对应用的需求:
还有好些个其它的组件 [在游戏本身以外],比如朋友阶梯,送礼请求,等等。我们可以将这些元素从游戏本身剥去,因为游戏本身的基本部分不会受到这些组件性能的影响。这是至关重要的,因为我们的游戏主要是一个基于时间的游戏,用户在特定的时间回到游戏执行特定的操作。如果我们存在宕机时间这些特定的操作将会产生巨大的用户体验的影响,因此我们想要避免产生这种情况。
这一应用的读写比例高达 3:1,他们广泛地使用缓存来处理它,在跟 Todd Hoff 的采访中 Rajlich 揭示了其中的奥秘:
用户的状态包含了大量的数据,这些数据具有微妙而复杂的关系。举例来说,在一个农场中,物体相互之间不能冲突,所以如果一个用户在农场上建了一所房子,在后台需要检查在用户的农场不会有其它的物体占据了重叠的空间。与其它的大部分的主要是读操作的主流网站,比如 Google 或 Facebook 不同的是,FarmVille 有着相当重的写操作负载。数据读写的比例是 3:1,这是一个高得惊人的写比重。FarmVille 后端最主要的请求之一就是一些更改玩游戏的用户状态的请求,为了增强伸缩性,我们致力于使我们的应用主要与缓存部件交互。
FarmVille 与 Facebook 平台之间的顶峰流量达到了 3GB/s,所以客户端应用程序需要关闭一些对平台的请求来避免阻塞通信链接:
FarmVille 与 Facebook 平台之间的流量是巨大的:在顶峰时刻,两者之间的流量基本达到 3GB/s,同时在缓存集群和应用程序之间又有 1.5GB/s 的流量。此外,因为性能可以差异较大,应用程序具有动态的关闭任何到后台调用的能力。我们可以拨号进行微调,以关闭迅速增加的更多的对于后端平台的调用。此外我们还使得所有到后台的调用都避免阻塞应用本身的加载。这里的思想是,就算所有其它的都失效了,玩家至少仍可以玩游戏。
对于性能监控和管理“我们使用了 nagios 来警报,munin 来监控,以及 puppet 来做配置。我们极大地利用了系统内部状态来追踪程序所使用的服务的性能,比如 Facebook,DB,以及 Memcache。此外,当我们发现性能降低的时候,我们基于样本来调节一个请求的 IO 事件。”
附注一下,根据根据Inside Social Games 分析师Justin Smith 的说法,FarmVille 背后的公司Zynga,去年获得了4.9 亿美元的收入,今年有望超过8.35 亿。
评论