基于 node.js 的高可扩展游戏服务器框架 设计与实现
description
Transcript of 基于 node.js 的高可扩展游戏服务器框架 设计与实现
![Page 2: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/2.jpg)
提纲• Node.js与游戏服务器• 游戏服务器框架的可扩展性
– 游戏的可扩展性– 框架的可扩展性
![Page 3: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/3.jpg)
Node.js与游戏服务器• Pomelo
– 定位• Web ,社交, Mobile 游戏服务器
– 目标• 简化游戏开发
https://github.com/NetEase/pomelo
![Page 4: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/4.jpg)
Node.js与游戏服务器
• 什么是 node.js– Node.js is a platform built on Chrome's JavaScript runtime for
easily building fast, scalable network applications.
• Node.js 特性– 服务器端 js
– 事件驱动,异步 IO
– 单线程– 轻量– 快速开发
![Page 5: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/5.jpg)
Node.js与游戏服务器
• 为什么用 node.js
– 优势• IO
• 可扩展性• Javascript
• 社区
– 不足• CPU 密集计算
![Page 6: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/6.jpg)
游戏服务框架的扩展性
• 为什么扩展?• 如何扩展?
– 游戏服务器的特性– 框架的特性
![Page 7: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/7.jpg)
游戏服务器的扩展性• Web服务器
– 短连接– 无状态– 无限水平扩展
![Page 8: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/8.jpg)
游戏服务器的扩展性• 游戏服务器
– 长连接– 有状态– 响应时间 ~100ms
– 有策略的扩展
![Page 9: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/9.jpg)
游戏服务器的扩展性• 单服架构
– 所有处理均在一个进程内完成– 优点:简单– 缺点:扩展难度较大
![Page 10: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/10.jpg)
游戏服务器的扩展性• 模块化架构
– 将场景分离出来– 游戏世界随场景进行扩展– 设计和维护复杂
![Page 11: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/11.jpg)
游戏服务器的扩展性• BigWorld架构
– 无缝地图,无限大的世界– 强大的负载均衡
![Page 12: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/12.jpg)
游戏服务器的扩展性• 游戏服务器架构发展趋势
gateway
auth
chat
trade
db
AI
path-finding
![Page 13: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/13.jpg)
游戏服务器的扩展性• 扩展的策略
– 多进程单线程• 避免线程间的并发问题• 单一进程负责单一服务• 进程间通过消息进行通讯• 以服务为单位进行功能扩展• 使得游戏世界的扩展更容易
![Page 14: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/14.jpg)
游戏服务器的扩展性• 扩展的策略
– 服务器的类型与数量• 服务器类型为模板• 服务进程为实例• 以实例的数量进行水平扩展• 更合理的分配资源
![Page 15: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/15.jpg)
游戏服务器的扩展性• 扩展的策略
– 场景的分区策略• 避免分布式的状态同步• 以场景为单位分区• 场景内所有状态在同一个进程(玩家,怪物, NPC 等)• 无状态的服务可以分离出来(寻路等)
![Page 17: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/17.jpg)
游戏服务器的扩展性• 运行时进程结构
![Page 18: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/18.jpg)
游戏服务器的扩展性• 小结
– 游戏服务器是一个整体– 将问题分解,简化– 灵活扩展,合理分配资源– 从头开发比较复杂
![Page 19: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/19.jpg)
框架的扩展性• 设计目标
– 支撑游戏服务器的架构模型– 简化游戏服务器开发
![Page 20: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/20.jpg)
框架的扩展性• 考虑的问题
– 服务器整体规划– 单个服务进程的规划– 业务逻辑的实现和扩展– 框架的通用性
![Page 21: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/21.jpg)
服务器的整体规划• 服务器整体规划
– 服务进程的类型• 可能会有很多种类型的进程• 不同的类型可能有不同的特性
– 服务进程的数量• 不同类型的进程可能分配不同的数量
提取服务器的共性
![Page 22: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/22.jpg)
服务器的整体规划• 服务器的抽象
frontend
frontend
backend
backend
backend
backend
forward message
push messageby channel
rpc
master
![Page 23: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/23.jpg)
服务器的整体规划• Frontend Server
– 承载客户端连接– 维护 session 信息– 将请求分发给后端服务器– 向客户端推送消息
![Page 24: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/24.jpg)
服务器的整体规划
websocket rpc
before after
dispatcher
handler remote
session
filter
![Page 25: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/25.jpg)
服务器的整体规划• Backend Server
– 接收前端分发的请求– 实现业务逻辑– 提供远程服务– 通过 channel 向客户端推送消息
![Page 26: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/26.jpg)
服务器的整体规划
rpc
before after
dispatcher
handler remote
channel
filter
![Page 27: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/27.jpg)
服务器的整体规划• 服务类型的定制
frontend backend
基于 websocket 的 server 提供 rpc 服务的 server
area
chat
status
connector
![Page 28: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/28.jpg)
服务器的整体规划• 实现策略:惯例优先
– 按服务器类型划分目录– handler 实现请求处理逻辑– remote 实现远程调用接口– 一个工程管理所有代码– 开发者只要填空就可以了
server type
![Page 29: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/29.jpg)
服务器的整体规划• 配置文件指定实例数量
![Page 30: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/30.jpg)
服务进程的规划• 单个服务进程的规划
– 进程对外的服务能力– 服务的能力应该怎么获得– 能力的复用:继承 or 组合
![Page 31: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/31.jpg)
服务进程的规划• 组件系统
– 组件是服务的功能单元– 将组件组合到一起让进程具有相应的能力– 组件间通过一个统一的上下文进行协作– 将大软件分解为小模块
![Page 32: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/32.jpg)
服务进程的规划• 基于组件的扩展
app
handler
rpcproxy
rpcserve
r
connector
client
remotepeer
client
client
![Page 33: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/33.jpg)
服务进程的规划• 组件的生命周期
![Page 34: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/34.jpg)
服务进程的规划• 不同层次的抽象
connector
area chat status
frontend
backend
core
container
component
![Page 35: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/35.jpg)
业务逻辑的实现与扩展• 业务逻辑的实现
– 客户端请求的处理– RPC 的处理
![Page 36: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/36.jpg)
客户端请求• 服务流程的扩展
– 业务逻辑与前 / 后置逻辑分离– Handler 实现业务逻辑– Filter 负责前 / 后置逻辑,是服务流程的扩展点
![Page 37: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/37.jpg)
RPC
• RPC的作用– 服务器间通讯的基础– 隐藏底层通讯的细节
• 考虑的问题– 多进程间通讯– 路由控制– 协议切换
![Page 38: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/38.jpg)
RPC
• RPC Client
![Page 39: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/39.jpg)
RPC
• RPC Server
![Page 40: 基于 node.js 的高可扩展游戏服务器框架 设计与实现](https://reader035.fdocuments.net/reader035/viewer/2022081415/56813bae550346895da4e419/html5/thumbnails/40.jpg)
Q&A