〆、辞旧° 2020-10-31 23:08:06 5096次浏览 0条评论 0 0 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)

    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册