代理 集群 服务发现 多核 堆 扩展, 这些是相关联的一类意思.

服务器扩展的目的是尽量压榨服务器的计算能力.
服务器扩展包括垂直扩展和水平扩展.

垂直扩展
可以简单地理解为提升单机服务器的性能. 包括硬件方面: 升级设备, 软件方面: 启用某些技术手段.

水平扩展
可以简单地理解为增加服务器数量已满足更多的用户需求.

一个好的服务器系统应该能提供垂直扩展和水平扩展两项技能, 提供最佳的服务器伸缩能力, 满足各种规模的软件需求.

Colyseus

如果你缺乏后台开发经验或者在开发多人在线游戏时遇到麻烦, 那么开源服务器 Colyseus 及其技术团队将成为你的救星. Colyseus 是一款易用, 好用的多人在线游戏服务器, 这一点已被诸多 HTML5 和手机游戏证明.

Proxy

0_1661949801213_2df713c7-e9ef-4d14-995b-83726bf830f6-image.png

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 查看日志.