BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

网易开源基于Node.js的游戏服务器框架pomelo

| 作者 崔康 关注 0 他的粉丝 发布于 2012年11月25日. 估计阅读时间: 8 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

最近,网易在Github上开源了基于Node.js的游戏服务器框架——pomelo。它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助开发人员省去游戏开发枯燥中的重复劳动和底层逻辑的开发。 pomelo不但适用于游戏服务器开发, 也可用于开发高实时Web应用。

pomelo框架包括三部分:

  • 框架, pomelo的核心, 与以往单进程的游戏框架不同, 它是高性能、分布式的游戏服务器框架,并且使用很简单。
  • 库, 包括了开发游戏的常用工具库, 如人工智能(ai)、寻路、aoi等。
  • 工具包, 包括管理控制台、 命令行工具、压力测试工具等。

pomelo的主要特性:

  • 快速、易上手的游戏开发模型和API。
  • 高可伸缩的多进程架构, 支持MMO的场景分区和其它各类分区策略。
  • 方便的服务器扩展机制,可快速扩展服务器类型和数量。
  • 方便的请求、响应、广播、服务器通讯机制, 无需任何配置。
  • 注重性能,在性能、可伸缩性上做了大量的测试、优化。
  • 提供了较多扩展组件,包括游戏开发常用的库和工具包。
  • 提供了完整的MMO demo代码(客户端html5),可以作为很好的开发参考。
  • 基于socket.io开发,支持socket.io支持的多种语言客户端。

网易pomelo开发团队在项目主页上列举了推荐pomelo的理由:

高并发、高实时的游戏服务器的开发是很复杂的工作。跟Web应用一样,一个好的开源容器或开发框架可以大大减少游戏开发的复杂性,让开发变得更加容易。遗憾的是目前在游戏服务器开发领域一直没有太好的开源解决方案。 pomelo将填补这个空白, 打造一款完全开源的高性能(并发)游戏服务器框架。

pomelo的优势有以下几点:

  • 架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, Node.js的网络IO优势提供了高可伸缩性。
  • 使用非常容易, 开发模型与Web应用的开发类似,基于convention over configuration的理念, 几乎零配置, API的设计也很精简, 很容易上手。
  • 框架的松耦合和可扩展性好, 遵循Node.js微模块的原则, framework本身只有很少的代码,所有component、库、工具都可以用npm module的形式扩展进来。任何第三方都可以根据自己的需要开发自定义module。
  • 提供完整的开源MMO游戏demo参考(基于HTML 5)。 一个超过1万行代码的游戏demo,使开发者可以随时借鉴demo的设计与开发思路。

pomelo为什么采用Node.js开发?

Node.js自身特点与游戏服务器的特性惊人的吻合。 在Node.js的官方定义中, fast、scalable、realtime、network这几个特性都非常符合游戏服务器的要求。游戏服务器是个网络密集型的应用,对实时性要求极高,而Node.js在网络io上的优势也完全可以满足这点。使用Node.js开发游戏服务器的优势总结:

  • io与可伸缩性的优势。io密集型的应用采用Node.js是最合适的, 可达到最好的可伸缩性。
  • 多进程单线程的应用架构。Node.js天生采用单线程, 使它在处理复杂逻辑的时候无需考虑线程同步、锁、死锁等一系列问题, 减少了很多逻辑错误。 由多进程Node.js组成的服务器群是最理想的应用架构。
  • 语言优势。使用javascript开发可以实现快速迭代,如果客户端使用HTML 5,更可实现代码共用。

网易pomelo开发团队介绍了游戏服务器的运行架构:

一个真正高可扩展的游戏运行架构必须是多进程的。Google的gritsgame,、Mozilla的browserquest 都采用了Node.js作为游戏服务器开发语言, 但它们都采用了单进程的Node.js服务器,缺乏扩展性,这使它们可以支撑的在线用户数量是很有限的(这两个游戏主要是作为HTML5游戏的 demo)。而多进程的架构可以很好的实现游戏服务器的的扩展性,达到支撑较多在线用户、降低服务器压力等要求。

该游戏运行架构表面上看与web应用运行架构很类似,connector类似于web应用的apache/nginx等web服务器,后端的服务器群类似于web应用中的应用服务器(如tomcat),但实际上存在着很大的差别:

  • 长连接与短连接。web应用使用基于http的短连接以达到最大的可扩展性,游戏应用采用基于socket(websocket)的长连接,以达到最大的实时性。
  • 分区策略不同。web应用的分区可以根据负载均衡自由决定, 而游戏则是基于场景(area)的分区模式, 这使同场景的玩家跑在一个进程内,以达到最少的跨进程调用。
  • 有状态和无状态。web应用是无状态的, 可以达到无限的扩展。 而游戏应用则是有状态的, 由于基于场景的分区策略,它的请求必须路由到指定的服务器, 这也使游戏达不到web应用同样的可扩展性。
  • 广播模式和request/response模式。web应用采用了基于request/response的请求响应模式。而游戏应用则更频繁地使用广播,由于玩家在游戏里的行动要实时地通知场景中的其它玩家, 必须通过广播的模式实时发送。这也使游戏在网络通信上的要求高于web应用。

pomelo framework的组成架构如图所示:

图片来源: Github网易pomelo项目介绍

  • server management, pomelo是个真正多进程、分布式的游戏服务器。因此各游戏server(进程)的管理是pomelo很重要的部分,框架通过抽象使服务器的管理非常容易。
  • network, 请求、响应、广播、RPC、session管理等构成了整个游戏框架的脉络,所有游戏流程都构建在这个脉络上。
  • application, 应用的定义、component管理,上下文配置, 这些使pomelo framework的对外接口很简单,并且具有松耦合、可插拔架构。

pomelo的架构设计目标:

  • 服务器(进程)的抽象与扩展:在web应用中, 每个服务器是无状态、对等的, 开发者无需通过框架或容器来管理服务器。但游戏应用不同, 游戏可能需要包含多种不同类型的服务器,每类服务器在数量上也可能有不同的需求。这就需要框架对服务器进行抽象和解耦,支持服务器类型和数量上的扩展。
  • 客户端的请求、响应、广播:客户端的请求、响应与web应用是类似的, 但框架是基于长连接的, 实现模式与http请求有一定差别。广播是游戏服务器最频繁的操作, 需要方便的API, 并且在性能上达到极致。
  • 服务器间的通讯、调用:尽管框架尽量避免跨进程调用,但进程间的通讯是不可避免的, 因此需要一个方便好用的RPC框架来支撑。
  • 松耦合、可插拔的应用架构:应用的扩展性很重要, pomelo framework支持以component的形式插入任何第三方组件, 也支持加入自定义的路由规则、 自定义的filter等。

感兴趣的读者可以访问Github网易pomelo项目主页了解更多详情。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT