长连接转发会阻塞吗?我想对后端的请求做一个并发控制,超出的来自前端连接暂时不处理,会阻塞吗,会断开吗?
我也有比较丰富的workerman开发经验,做个聊天服务端、物联网服务端、内网穿透、端口转发等等。但是上面这个问题,还是比较纠结。
我想做的是这样的,后端运行的是图片转换的http服务,但是很吃硬件,超出内存会出错,所以要限制并发,而且一次请求响应的时间很长。
所以来自前端的连接,我打算通过workerman做个代理。基本的流程下:
可以看到,实际上流程很简单。
这里要注意的是:
所以我的问题是:
是不是需要做特殊的代码处理。
因为我能想到的代码基本如下:
$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;
}
可能会断开,浏览器可能会在一定时间内没收到响应就返回超时,这个时间猜测在1分钟左右。
另外外网环境连接超过1分钟不通讯连接可能就被路由节点清理了。
workerman作为网络代理不会发生阻塞。
好的。
这里的前端只是相对于这个流程来说,实际上会用队列的消费者发起请求,
实际上前端、路由、后端都在一个局域网下,
打算用workerman 多进程守护,发起curl请求,因为设计文件传输,感觉用http简单靠谱一点。
十分感谢。
只要不会阻塞就好。如果还是会断开的话,实在不行这部分就放弃http的方式,自己写tcp连接。
十分感谢
onmessage事件触发时,也不会阻塞吗?