GatewayWorker部署集群,处理通讯中的高并发(方法及官方的坑) [ 2.0 版本 ]
Gateway类使用时遇到的坑
(GatewayWorker1实例,GatewayWorker2实例,...)集合在一起(即:
Gateway::$registerAddress = ['127.0.0.1:1237','127.0.0.1:1238'];),叫集群,使用Gateway类向这些集群发送信息时,官方给出:
/**
* 注册中心地址
*
* @var string|array
*/
public static $registerAddress = '127.0.0.1:1236';
说可以使用数组的形式将这些实例搞在一起,但读源码时,发现无论你放多少个实例,它只读数组第一个,在Gateway类中有这么个方法:getAllGatewayAddressesFromRegister(),获取通过注册中心获取所有 gateway 通讯地址,即(registerAddress里面的所有实例地址的注册地址),就在这里官方有一段代码,自查,这里就不贴出来,我只贴出来完整的可以实现集群的代码:
/**
* 获取通过注册中心获取所有 gateway 通讯地址
*
* @return array
* @throws Exception
*/
protected static function getAllGatewayAddressesFromRegister()
{
static $addresses_cache, $last_update;
$time_now = time();
$expiration_time = 1;
$register_addresses = (array)static::$registerAddress;
if(empty($addresses_cache) || $time_now - $last_update > $expiration_time) {
$arr = [];
$event = "";
foreach ($register_addresses as $key => $register_address) {
$client = null;
set_error_handler(function(){});
$client = stream_socket_client('tcp://' . $register_address, $errno, $errmsg, static::$connectTimeout);
if (!$client) {
throw new Exception('Can not connect to tcp://' . $register_address . ' ' . $errmsg);
}
fwrite($client, '{"event":"worker_connect","secret_key":"' . static::$secretKey . '"}' . "\n");
stream_set_timeout($client, 5);
$ret = fgets($client, 655350);
if (!$ret || !$data = json_decode(trim($ret), true)) {
throw new Exception('getAllGatewayAddressesFromRegister fail. tcp://' .
$register_address . ' return ' . var_export($ret, true));
}
$event = $data['event'];
$arr = array_merge($arr,$data['addresses']);
}
$last_update = $time_now;
$cache = ['event'=>$event,'addresses'=>$arr];
$addresses_cache = $arr;
}
if (!$addresses_cache) {
throw new Exception('Gateway::getAllGatewayAddressesFromRegister() with registerAddress:' .
json_encode(static::$registerAddress) . ' return ' . var_export($addresses_cache, true));
}
return $addresses_cache;
}
这里我用的方式是用一台服务器不同端口做集群处理高并发,使用一个短连接做登录转发优质的tcp端口,将并发进行分流处理,让不同端口承受几千上万台机器同时连接到我的通讯地址上,这样就减少了同一端口带来的压力。有不懂的可以联系我QQ(1770249651)
〆、辞旧° 陕西汉中
注册时间:2019-07-18
最后登录:2021-06-08
在线时长:8小时3分
最后登录:2021-06-08
在线时长:8小时3分
- 粉丝0
- 金钱55
- 威望20
- 积分335
共 0 条评论