可擴展性
該文檔可能隨時更新.
要想將 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}