業(yè)務(wù)是IO阻塞型的。
技術(shù)方案是:
客戶端(pc/app-android設(shè)備/app-iOS設(shè)備) 連接 imws服務(wù)器(workerman+GatewayWorker框架);
客戶端(同上) 發(fā)送 數(shù)據(jù);
imws服務(wù)器 接收,轉(zhuǎn)發(fā)給 業(yè)務(wù)服務(wù)器(通過http協(xié)議執(zhí)行API);
業(yè)務(wù)服務(wù)器 接收轉(zhuǎn)發(fā),進(jìn)行業(yè)務(wù)處理,再調(diào)取GatewayClient發(fā)送websocket,信息再發(fā)送回給客戶端(同上)。
(為什么采取這樣的方式?是因?yàn)橹暗臉I(yè)務(wù)已經(jīng)成熟了,如各種API。此時(shí)只想引入workerman解決即時(shí)通訊的,而即時(shí)通訊產(chǎn)生的數(shù)據(jù)通過各種隊(duì)列延時(shí)幾百毫秒再寫入。)
大部分時(shí)候是OK的,但總會(huì)出現(xiàn)客戶端(主要是app,PC端挺好的)連接不上imws服務(wù)器的情況(5%-10%吧,特別是移動(dòng)網(wǎng)絡(luò)環(huán)境下),目前是屬于內(nèi)測(cè),所以初步排除用戶并發(fā)大的原因。
這是運(yùn)行狀態(tài):(只有一臺(tái)服務(wù)器,business業(yè)務(wù),gateway,register都部署在同一臺(tái)服務(wù)器)
--------------------------------------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
這樣有點(diǎn)繞:
客戶端->imws->httpapi->imws->客戶端
這樣有點(diǎn)繞,如果httpapi返回的稍微慢一點(diǎn),會(huì)導(dǎo)致對(duì)應(yīng)imws進(jìn)程的后續(xù)請(qǐng)求排隊(duì),導(dǎo)致消息延遲。
推薦這種方式:
http://www.wtbis.cn/gatewaydoc/work-with-other-frameworks/README.html
也就是客戶端直接httppost到api服務(wù)器,然后api服務(wù)器需要推送的時(shí)候利用gatewayClient發(fā)給客戶端即可。
這種方式可以避免因?yàn)閍pi服務(wù)器阻塞導(dǎo)致消息阻塞。
連不上問題:
app偶爾連不上問題看看能否給下app鏈接失敗的錯(cuò)誤日志。因?yàn)檫B不上有很多種類的原因呢,鏈接拒絕 超時(shí) ws握手失敗等很多
建議升級(jí)下workerman,目前版本的workerman修復(fù)了一個(gè)websocket協(xié)議的問題,可能對(duì)你有幫助。