关于gateway worker原理问题

ayamzh

client-->gateway 1-n -->business 1-n
是不是每个business启动时 主动找到所有的gateway 并建立一个tcp长连接。

而gateway接到请求数据后,会找一个空闲的business处理,而当business忙时,不在接受请求。

相当于gateway是异步非阻塞的, 儿business是同步的

3267 5 1
5个回答

ayamzh

business忙时 请求是在accept队列里排队么 还是在gateway里排队

  • 暂无评论
walkor

gateway接到请求数据后,会找一个空闲的business处理

目前是随机一个business处理,具体参考手册路由部分

  • ayamzh 2018-07-30

    了解。那这个business如果有未处理的完的请求,GATEWAY又进行了新的请求过来,这时候如果重启worker进程,那这个新请求是不是就丢掉了?

  • walkor 2018-07-30

    对,有可能

blogdaren

gateway将请求转发给一个随机的空闲 businessWorker 来处理:

$this->router = array("\\GatewayWorker\\Gateway", 'routerBind'); 
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
public static function routerBind($worker_connections, $client_connection, $cmd, $buffer)                                                       
{    
    if (!isset($client_connection->businessworker_address) || !isset($worker_connections)) {
        $client_connection->businessworker_address = array_rand($worker_connections);
    }    

    return $worker_connections;
}    
  • 暂无评论
ayamzh

gateway如果connect到bussiness时,完成三次握手后,进入了accept队列,但是这时候bussiness被平滑重启了,会不会丢掉这次请求数据啊

  • 暂无评论
walkor

如果bussinessWorker正在处理请求,则这个请求不会丢,但是gateway在businessWorker在处理请求的过程中仍然给这个businessWorker转发新的请求,这些新的请求可能会丢

  • ayamzh 2018-08-08

    额 那等于平滑重启有一定风险,有没有办法在平滑重启前,让gateway不在转发新情求

  • walkor 2018-08-08

    目前没有办法

年代过于久远,无法发表回答
🔝