可扩展性
该文档可能随时更新.
要想将 Colyseus 扩展至多进程或多服务器, 您需要拥有 Redis, MongoDB 以及一个动态代理.
Redis¶
下载并安装 Redis. 然后创建 RedisPresence
:
import { Server, RedisPresence } from "colyseus";
const gameServer = new Server({
// ...
presence: new RedisPresence(),
});
const colyseus = require("colyseus");
const gameServer = new colyseus.Server({
// ...
presence: new colyseus.RedisPresence(),
});
其中 presence
用于进程间调用房间的 "预留席位" 功能, 还用于让开发者可以在房间之间共享数据. 详情请参阅 Presence API.
每个 Colyseus 进程还会用 presence
API 注册自身的 processId
和网络位置, 以便使用 动态代理 服务. 优雅关闭时, 进程会自我注销.
MongoDB¶
下载安装 MongoDB 并安装 mongoose
包:
npm install --save mongoose
使用 MongooseDriver
:
import { Server, RedisPresence } from "colyseus";
import { MongooseDriver } from "@colyseus/mongoose-driver"
const gameServer = new Server({
// ...
driver: new MongooseDriver(),
});
const colyseus = require("colyseus");
const MongooseDriver = require("@colyseus/mongoose-driver").MongooseDriver;
const gameServer = new colyseus.Server({
// ...
driver: new MongooseDriver(),
});
您可以将 MongoDB 的连接 URI 传递给 new MongooseDriver(uri)
构造函数, 或者设置并赋值一个名为 MONGO_URI
的环境变量.
这里的 driver
用于在房间匹配时存储和查询可用的房间.
运行多个 Colyseus 进程¶
想要在一个服务器中运行多个 Colyseus 实例, 您需要让每个实例监听不同的端口号. 推荐使用 3001
, 3002
, 3003
这样的端口. Colyseus 进程 不应 对外公开, 而应该只公开 动态代理.
强烈推荐使用 PM2 process manager 管理多个 Node.js 应用实例.
PM2 提供名为 NODE_APP_INSTANCE
的环境变量, 对于每个进程这个变量数字是唯一的, 可以用其界定端口号.
import { Server } from "colyseus";
// 给每个实例绑定各不相同的端口号.
const PORT = Number(process.env.PORT) + Number(process.env.NODE_APP_INSTANCE);
const gameServer = new Server({ /* ... */ })
gameServer.listen(PORT);
console.log("Listening on", PORT);
npm install -g pm2
使用如下 ecosystem.config.js
配置:
// ecosystem.config.js
const os = require('os');
module.exports = {
apps: [{
port : 3000,
name : "colyseus",
script : "lib/index.js", // 主入口页面
watch : true, // 可选
instances : os.cpus().length,
exec_mode : 'fork', // 注意: 不要使用 cluster 模式.
env: {
DEBUG: "colyseus:errors",
NODE_ENV: "production",
}
}]
}
现在您就可以开启多个 Colyseus 进程了.
pm2 start
PM2 和 TypeScript
建议在运行 pm2 start
之前, 使用 npx tsc
编译 .ts 文件. 或者您可以为 PM2 安装 TypeScript 解释器 (pm2 install typescript
) 并设置 exec_interpreter: "ts-node"
(更多参考).
动态代理¶
@colyseus/proxy 作为动态代理, 自动监控 Colyseus 进程的创建和释放, 以确保 WebSocket 连接通向正确的服务器上正确进程的正确房间.
动态代理应该作为唯一公开门户绑定至 80
/ 443
端口. 所有请求必须通过这个代理.
npm install -g @colyseus/proxy
环境变量¶
配置下列环境变量来满足您的需求:
PORT
是代理运行的端口.REDIS_URL
是各个 Colyseus 进程里使用的同一个 Redis 实例的路径.
运行代理¶
colyseus-proxy
> {"name":"redbird","hostname":"Endels-MacBook-Air.local","pid":33390,"level":30,"msg":"Started a Redbird reverse proxy server on port 80","time":"2019-08-20T15:26:19.605Z","v":0}