写点什么

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

  • 2012-11-24
  • 本文字数:2552 字

    阅读完需:约 8 分钟

最近,网易在 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 项目主页了解更多详情。

2012-11-24 02:4016118
用户头像

发布了 501 篇内容, 共 284.5 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

wallys/new product/DR7915/MT7915+MT7975/WiFi6 MiniPCIe Module 2T2R

wallys-wifi6

阿里云技术专家郝晨栋:云上可观测能力——问题的发现与定位实践

阿里云弹性计算

DevOps 运维 可观测性

这样优化Spring Boot,启动速度快到飞起!

艾小仙

Java 微服务 springboot Eureka 微服务治理

李宏毅《机器学习》丨5. Tips for neural network design(神经网络设计技巧)

AXYZdong

机器学习 7月月更

开发动态 | StoneDB 2022年版本发布里程碑

StoneDB

云原生 #数据库 大数据 开源 #开源

tsconfig.json在配置文件中找不到任何输入,怎么办?

华为云开发者联盟

JavaScript 前端

学好Web前端开发能找到好工作吗

小谷哥

活动报名:如何零基础快速上手开源的 Tapdata Live Data Platform?

tapdata

开源 开源社区 Tapdata 实时数据

为Python打包创建一个世外桃源,解决打包太大且启动慢的问题

迷彩

pyinstaller 7月月更 Python打包

DistSQL 深度解析:打造动态化的分布式数据库

SphereEx

数据库 开源社区 ShardingSphere SphereEx #开源

还在用 ListView?使用 AnimatedList 让列表元素动起来

岛上码农

flutter ios 安卓开发 跨平台开发 7月月更

学习java开发技术有用吗?

小谷哥

8个方法管理 GitHub 用户权限

SEAL安全

git GitHub 安全 软件安全 软件供应链安全

算法题每日一练---第4天:图像模糊问题

知心宝贝

算法 前端 后端 7月月更

接口文档进化图鉴,有些古早接口文档工具,你可能都没用过

Liam

Postman 接口文档 API swagger API文档

java程序员培训班怎么选?

小谷哥

学习大数据技术之前做好这些准备

小谷哥

你离「TDengine 开发者大会」只差一条 SQL 语句!

TDengine

tdengine 开源 时序数据库

个人实战经验:数据建模 “账户数据是属于维度还是账户域 ”

金松(李博源)

数据仓库 数据建模 数据中台场景实践

跟我读论文丨Multi-Model Text Recognition Network

华为云开发者联盟

人工智能 文字识别 语言模型 视觉特征

智能运维场景解析:如何通过异常检测发现业务系统状态异常

云智慧AIOps社区

人工智能 机器学习 异常检测 智能运维 状态管理

如何快速开发一个简单实用的MES系统?

优秀

MES系统

“万物互联,使能千行百业”,2022 开放原子全球开源峰会 OpenAtom OpenHarmony 分论坛即将开幕

kk-OSC

开源 开放原子全球开源峰会

26岁从计算机视觉界“黄埔军校”博士毕业,他想为车打造一双慧眼

华为云开发者联盟

人工智能 计算机视觉 天才少年 激光感知

易观分析《2022年中国数据安全市场数据监测报告》正式启动

易观分析

技术

Tapdata 与优炫数据库完成产品兼容性互认证

tapdata

数据库 Tapdata 实时数据 交互式 优炫数据库

极客星球丨字节跳动一站式数据治理解决方案及平台架构

MobTech袤博科技

架构 运维 数据治理 全链路

2022年中国人工智能产业生态图谱

易观分析

人工智能

大数据培训机构如何选择

小谷哥

【干货】知识共享的障碍及解决方法

Geek_da0866

Review 后台管理系统实战:请求参数的 2 种封装风格

掘金安东尼

前端 编程范式 7月月更

网易开源基于Node.js的游戏服务器框架pomelo_Web框架_崔康_InfoQ精选文章