Skip to content

gateway worker 分离部署 ​

什么是 Gateway Worker 分离部署 ​

GatewayWorker 有三种进程,Gateway 进程负责网络 IO,BusinessWorker 进程负责业务处理,Register 进程负责协调 Gateway 与 BusinessWorker 之间建立 TCP 长连接通讯。我们可以把 Gateway BusinessWorker Register 分开部署在不同的服务器上,当业务进程 BusinessWorker 出现瓶颈时,单独增加 BusinessWorker 服务器提升系统负载能力。同理,如果 Gateway 进程出现瓶颈,则增加 Gateway 服务器。Register 服务只有在进程启动的时候协调 Gateway 与 BusinessWorker 建立 TCP 连接,集群运行起来后通讯量极低,不会成为系统瓶颈。

部署示例 ​

以 Applications/Todpole 为例,假如需要部署 4 台服务器 (192.168.0.1/4) 提供高可用服务,192.168.0.1/2 运行 gateway 服务和 register 服务,192.168.0.3/4 运行 BusinessWorker 服务。

gateway worker 分离部署扩容步骤 ​

  1. 设置服务器 192.168.0.1/2 上 start_register.php 监听本机内网 ip,例如 new Register('text://192.168.0.1:1236'); (为了服务安全,请不要将 1236 端口暴露给外网)

  2. 删除服务器 192.168.0.1/2 上的 start_businessworker.php。配置 start_gateway.php 中的 lanIp=192.168.0.x 与本机 ip 一致。配置 registerAddress 为 ['192.168.0.1:1236','192.168.0.2:1236'] ,start_gateway.php 文件最终类似下面配置。

文件 Applications/Todpole/start_gateway.php

php
<?php
use \Workerman\Worker;
use \GatewayWorker\Gateway;

// gateway
$gateway = new Gateway("Websocket://0.0.0.0:8282");
$gateway->name = 'TodpoleGateway';
$gateway->count = 4;
// ==== 注意这里配置的是本机内网ip ====
$gateway->lanIp = '192.168.0.1'; // 服务器192.168.0.2 上为 192.168.0.2
// ==== 注意这里配置 ====
$gateway->registerAddress = ['192.168.0.1:1236', '192.168.0.2:1236'];
$gateway->startPort = 2000;
$gateway->pingInterval = 10;
$gateway->pingData = '{"type":"ping"}';

...
  1. 打开 192.168.0.3/4 两台服务器,删除 start_gateway.php 和 start_reigster.php。设置 start_businessworker.php 的 registerAddress 为 ['192.168.0.1:1236', '192.168.0.2:1236']

  2. 逐台启动

至此,GatewayWorker 分布式部署完毕。

一些问题及解答 ​

为什么将 Gateway 与 BusinesWorker 分别部署在不同的服务器上? ​

首先说明的是不一定非要将 Gateway BusinessWorker 分开部署,但是推荐分开部署,原因如下:

1、由于 Gateway 只负责网络 IO,只要服务器带宽够用,绝大多数情况下 Gateway 服务器不会成为瓶颈,所以在很长时间我们只需要一台或者少数几台 Gateway 服务器即可。由于我们不想 BusinessWorker 影响到 Gateway,所以将 Gateway 和 BusinessWorker 分开部署

2、BusinessWorker 主要负责业务逻辑。当请求量增大时,由于可能 BusinessWorker 业务比较复杂,负载可能会明显升高,这时我们只要单纯增加 BusinessWorker 服务器即可,Gateway 服务器则一般不需要变动,也就是不用通知客户端 Gateway 的 ip 列表有所变动

3、当系统 BusinessWorker 负载较低,需要下线服务器时,我们只需要下线 BusinessWorker 服务器即可,无需变动 GateWay 服务器,也就不会导致客户端链接因为服务器下线而断开。

当 BusinessWorker 服务器集群负载较低时,需要下线一些机器怎么实施? ​

只需要停止 BusinessWorker 的服务,运行 php start.php stop ,然后下线即可。Gateway 服务器会自动感知有 BusinessWorker 服务器下线,不会再将请求转发给下线的机器,整个下线过程中不影响服务质量。

当 Gateway 服务器集群负载较低时,需要下线一些机器怎么实施? ​

首先还是要说明下 Gateway 服务器一般情况下不会成为系统瓶颈,所以一般你很长时间内 Gateway 服务器数量是一个稳定的值,一般一台即可

下线 Gateway 服务器,首先停止服务,运行 php start.php stop ,此时会导致该服务器上已有的客户端链接断开,然后下线服务器即可。此时 BusinessWorker 会感知到有 Gateway 服务器下线,会自动断开与 Gateway 进程的联系。

如何给 Gateway 添加负载均衡 ​

负载均衡方案是通用的,你可以用 nginx 代理、云厂商自带的 TCP 负载均衡、或者在 gateway 域名 DNS 上添加多条 A 记录。