业务是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
这样有点绕:
客户端->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协议的问题,可能对你有帮助。