用workerman(使用GatewayWorker框架)做服务端,app连接经常出现无法连接的情况。

homemoon

业务是IO阻塞型的。
技术方案是:

客户端(pc/app-android设备/app-iOS设备) 连接 imws服务器(workerman+GatewayWorker框架);
客户端(同上) 发送 数据;
imws服务器 接收,转发给 业务服务器(通过http协议执行API);
业务服务器 接收转发,进行业务处理,再调取GatewayClient发送websocket,信息再发送回给客户端(同上)。

(为什么采取这样的方式?是因为之前的业务已经成熟了,如各种API。此时只想引入workerman解决即时通讯的,而即时通讯产生的数据通过各种队列延时几百毫秒再写入。)

大部分时候是OK的,但总会出现客户端(主要是app,PC端挺好的)连接不上imws服务器的情况(5%-10%吧,特别是移动网络环境下),目前是属于内测,所以初步排除用户并发大的原因。

这是运行状态:(只有一台服务器,business业务,gateway,register都部署在同一台服务器)

--------------------------------------GLOBAL STATUS--------------------------------------------
Workerman version:3.3.4          PHP version:7.0.12
start time:2016-12-30 18:39:29   run 0 days 15 hours   
load average: 0.11, 0.04, 0.05   event-loop:select
3 workers       21 processes
worker_name        exit_status     exit_count
ChatBusinessWorker 0                0
ChatGateway        0                0
Register           0                0
---------------------------------------PROCESS STATUS-------------------------------------------
pid memory  listening                worker_name        connections total_request send_fail throw_exception
19262   2M      none                     ChatBusinessWorker 17          40392          0         0              
19264   2M      none                     ChatBusinessWorker 17          40295          0         0              
19263   4M      none                     ChatBusinessWorker 17          40869          0         0              
19266   2M      websocket://0.0.0.0:7272 ChatGateway        10          4788           0         0              
19265   4M      none                     ChatBusinessWorker 17          40754          0         0              
19267   2M      websocket://0.0.0.0:7272 ChatGateway        8           4076           0         0              
19268   2M      websocket://0.0.0.0:7272 ChatGateway        9           4838           0         0              
19271   2M      websocket://0.0.0.0:7272 ChatGateway        11          4891           0         0              
19269   2M      websocket://0.0.0.0:7272 ChatGateway        6           3745           0         0              
19272   2M      websocket://0.0.0.0:7272 ChatGateway        9           4482           0         0              
19270   2M      websocket://0.0.0.0:7272 ChatGateway        10          4945           0         0              
19274   2M      websocket://0.0.0.0:7272 ChatGateway        10          4976           0         0              
19273   2M      websocket://0.0.0.0:7272 ChatGateway        12          5112           0         0              
19275   2M      websocket://0.0.0.0:7272 ChatGateway        12          3512           0         0              
19276   2M      websocket://0.0.0.0:7272 ChatGateway        11          4038           0         0              
19277   2M      websocket://0.0.0.0:7272 ChatGateway        10          4886           0         0              
19278   2M      websocket://0.0.0.0:7272 ChatGateway        8           4522           0         0              
19281   2M      websocket://0.0.0.0:7272 ChatGateway        7           5288           0         0              
19279   2M      websocket://0.0.0.0:7272 ChatGateway        10          4257           0         0              
19282   2M      text://0.0.0.0:1236      Register           20          774            0         0              
19280   2M      websocket://0.0.0.0:7272 ChatGateway        9           5008           0         0              
5163 1 0
1个回答

walkor

这样有点绕:
客户端->imws->httpapi->imws->客户端
这样有点绕,如果httpapi返回的稍微慢一点,会导致对应imws进程的后续请求排队,导致消息延迟。

推荐这种方式:
http://www.workerman.net/gatewaydoc/work-with-other-frameworks/README.html

也就是客户端直接httppost到api服务器,然后api服务器需要推送的时候利用gatewayClient发给客户端即可。
这种方式可以避免因为api服务器阻塞导致消息阻塞。

连不上问题:
app偶尔连不上问题看看能否给下app链接失败的错误日志。因为连不上有很多种类的原因呢,链接拒绝 超时 ws握手失败等很多

建议升级下workerman,目前版本的workerman修复了一个websocket协议的问题,可能对你有帮助。

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