长连接转发会阻塞吗?对后端的请求做一个并发控制,会阻塞吗,会断开吗?

augushong

问题描述

长连接转发会阻塞吗?我想对后端的请求做一个并发控制,超出的来自前端连接暂时不处理,会阻塞吗,会断开吗?

我也有比较丰富的workerman开发经验,做个聊天服务端、物联网服务端、内网穿透、端口转发等等。但是上面这个问题,还是比较纠结。

我想做的是这样的,后端运行的是图片转换的http服务,但是很吃硬件,超出内存会出错,所以要限制并发,而且一次请求响应的时间很长。

所以来自前端的连接,我打算通过workerman做个代理。基本的流程下:

可以看到,实际上流程很简单。

这里要注意的是:

  • 要控制对后端的并发
  • 不要直接断开前端请求(连接onConnect之后先不要处理,等后端空闲了在转发到后端)
  • 后端的响应时间可能很长

所以我的问题是:

  • 等待后端空闲时收到的连接会断开吗(因为这中间不会传输心跳以维持链接,这是个Http的请求)
  • 后端的响应时间是比较长的,会发生阻塞吗?

是不是需要做特殊的代码处理。
因为我能想到的代码基本如下:

$worker::$serverConnectionCount = 0;
$worker::$clientConnectionHub = [];

$worker->onWorkerStart = function(){
    Timer::add(function(){
        if($worker::$serverConnectionCount <4) {
            $client_conn = array_pop($worker::$clientConnectionHub);
            $server_conn =  new AsyncTcpConnection('后端服务地址')

            $client_conn->pipe($server_conn);
            $server_conn->pipe($client_conn);
            //实际上应该自定义实现转发,可以在onClose时调整$serverConnectionCount的值
            $worker::$serverConnectionCount++;

        }
    },10)
}
$worker->onConnect  = function($connection){
    $worker:$clientConnectionHub[] = $connection;

}
662 2 0
2个回答

walkor

等待后端空闲时收到的连接会断开吗(因为这中间不会传输心跳以维持链接,这是个Http的请求)

可能会断开,浏览器可能会在一定时间内没收到响应就返回超时,这个时间猜测在1分钟左右。
另外外网环境连接超过1分钟不通讯连接可能就被路由节点清理了。

后端的响应时间是比较长的,会发生阻塞吗?

workerman作为网络代理不会发生阻塞。

  • augushong 2022-12-16

    好的。
    这里的前端只是相对于这个流程来说,实际上会用队列的消费者发起请求,
    实际上前端、路由、后端都在一个局域网下,
    打算用workerman 多进程守护,发起curl请求,因为设计文件传输,感觉用http简单靠谱一点。
    十分感谢。
    只要不会阻塞就好。如果还是会断开的话,实在不行这部分就放弃http的方式,自己写tcp连接。
    十分感谢

augushong

onmessage事件触发时,也不会阻塞吗?

  • 暂无评论
年代过于久远,无法发表回答
🔝