代理 集群 服务发现 多核 堆 扩展, 这些是相关联的一类意思.
服务器扩展的目的是尽量压榨服务器的计算能力.
服务器扩展包括垂直扩展和水平扩展.
垂直扩展
可以简单地理解为提升单机服务器的性能. 包括硬件方面: 升级设备, 软件方面: 启用某些技术手段.
水平扩展
可以简单地理解为增加服务器数量已满足更多的用户需求.
一个好的服务器系统应该能提供垂直扩展和水平扩展两项技能, 提供最佳的服务器伸缩能力, 满足各种规模的软件需求.
Colyseus
如果你缺乏后台开发经验或者在开发多人在线游戏时遇到麻烦, 那么开源服务器 Colyseus 及其技术团队将成为你的救星. Colyseus 是一款易用, 好用的多人在线游戏服务器, 这一点已被诸多 HTML5 和手机游戏证明.
Proxy
Proxy 被称做代理, 它作为一个主入口, 通过查询 Redis 里存储的 Presence, 选择合适的 服务器进程进行连接.
通过查表找到合适的服务器的过程, 叫做服务发现.
上图蓝色方块代表服务器进程, 即 Colyseus Server, 可以是异地不同的实体计算机, 也可以是一个CPU上的不同内核上面运行的不同进程.
一个CPU上创建多进程多服务器, 这样的应用叫多核应用; 多个不同地域, 不同性能的服务器组合为一个应用所使用, 这样的应用服务叫做堆.
方块里面可想而知就是该服务器所创建和管理的Room了.
Colyseus Arena
部署 Colyseus 服务器的最简单解决方案, 让您可以 Get To Fun Faster™
Arena Cloud 是一站式托管解决方案, 可让您专注于多人游戏开发. 它在服务器托管的基础上, 为开发人员提供企业级服务器管理, 基础设施建设, 开发运营和规模扩展等服务. 使用 Arena, 只需在直观的管理仪表板上点击几下, 即可完成 Colyseus 服务器的配置, 管理和更新.
点击这里注册 Arena Cloud 账户
Arena Cloud 服务器部署地区
可以在全球多地使用 Arena Cloud, 并可应要求提供客户指定区域部署.
- 北弗吉尼亚州 (美国 - 东部 1)
- 俄亥俄州 (美国 - 东部 2)
- 北弗吉尼亚州 (美国 - 东部 3 | 可免费试用)
- 北加利福尼亚州 (美国 - 西部 1)
- 孟买 (亚太地区 - 南部 | 可免费试用)
- 爱尔兰 (欧洲 - 西部)
- 法兰克福 (欧洲 - 中部 | 可免费试用)
- 首尔 (亚太地区 - 东北部)
- 圣保罗 (南美 - 东部) -- 根据客户要求提供
运行代理
首先全局安装 Proxy:
npm install -g @colyseus/proxy
配置两个环境变量:
PORT
代理监听的端口号.REDIS_URL
Redis 的路径, Proxy 用它来查表, Colyseus 向它报告自己的 Presence.
运行:
colyseus-proxy
Proxy + Colyseus + PM2 组合
- 安装
@colyseus/proxy
(npm install --save @colyseus/proxy
) - 配置
RedisPresence
- 配置
MongooseDriver
- 为每个服务器配置不同的端口号
- 使用 PM2 管理 Colyseus 和 Proxy 的运行
服务器配置代码:
import { Server, RedisPresence } from "colyseus";
import { MongooseDriver } from "colyseus/lib/matchmaker/drivers/MongooseDriver"
// binds each instance of the server on a different port.
const PORT = Number(process.env.PORT) + Number(process.env.NODE_APP_INSTANCE);
const gameServer = new Server({
presence: new RedisPresence({
url: "redis://127.0.0.1:6379/0"
}),
driver: new MongooseDriver(),
})
gameServer.listen(PORT);
console.log("Listening on", PORT);
推荐使用 PM2 管理服务器进程. PM2 可以自动缩放 Node.js 进程 (包括Colyseus和Proxy) 数量.
npm install -g pm2
PM2 配置文件 ecosystem.config.js
:
// ecosystem.config.js
const os = require('os');
module.exports = {
apps: [
{
port : 80,
name : "colyseus-proxy",
script : "./node_modules/@colyseus/proxy/bin/proxy",
instances : 1, // 可以放大进程数量
exec_mode : 'cluster',
env: {
PORT: 80,
REDIS_URL: "redis://127.0.0.1:6379/0"
}
},
{
port : 8080,
name : "colyseus",
script : "lib/index.js", // 入口点文件
watch : true, // 可选参数
instances : os.cpus().length,
exec_mode : 'fork', // 这里不要使用堆模式.
env: {
DEBUG: "colyseus:errors",
NODE_ENV: "production",
}
}
]
}
下面就是启动程序了.
pm2 start
如果服务代码使用 TypeScript, 要在
pm2 start
启动前,
使用npx tsc
编译为 JS 文件.
输出信息如下:
[PM2][WARN] Applications colyseus not running, starting...
[PM2] App [colyseus] launched (2 instances)
┌──────────┬────┬─────────┬────────┬───┬─────┬───────────┐
│ Name │ id │ mode │ status │ ↺ │ cpu │ memory │
├──────────┼────┼─────────┼────────┼───┼─────┼───────────┤
│ proxy │ 0 │ cluster │ online │ 0 │ 0% │ 7.4 MB │
│ colyseus │ 1 │ fork │ online │ 0 │ 0% │ 15.4 MB │
│ colyseus │ 2 │ fork │ online │ 0 │ 0% │ 12.3 MB │
└──────────┴────┴─────────┴────────┴───┴─────┴───────────┘
使用 `pm2 show <id|name>` 查看应用详情
使用 pm2 logs
查看日志.