項目需要調(diào)用外部查詢接口,此接口有概率會超時,由于項目處理的請求可能是持續(xù)不斷的,比如每秒受理10個請求,如果進程受理該請求后,調(diào)用外部查詢接口又超時了,那么這個進程可能會超時阻塞25秒(curl設(shè)置的超時時間是25秒)。此時系統(tǒng)可能就癱瘓了 無法受理請求了 需要等進程閑置才能恢復(fù)可訪問性
通過在webman社區(qū)問答的搜索和學(xué)習(xí),我嘗試將進程數(shù)量設(shè)置得很大 4核心的服務(wù)器 我設(shè)置了100個進程 但是問題并沒有消失 反而讓我摸不著頭腦 因為系統(tǒng)進程阻塞的時候 100個進程里面可能就幾個癱瘓了 其他的還是閑置的 但是系統(tǒng)卻無法受理新的請求了 甚至我ssh鏈接的終端也會很卡頓 因為我對linux系統(tǒng)不是很了解 這個問題我只能描述為: 1.webman有足夠大量的進程 2.服務(wù)器核心數(shù)不多(核心數(shù)量多要花錢 舍不得) 3.少量幾個進程癱瘓后其他進程并沒有分擔(dān)壓力(活好像都派給那幾個進程了,分?jǐn)偛痪?這個是推測猜想,另top命令查看cpu占用不到20%。) 4.對此現(xiàn)象我推測問題要么是webman進程派遣的請求不均勻或者核心數(shù)量少而進程數(shù)量多導(dǎo)致的cpu上下文切換消耗極大?
5.請教一下大佬,不想過度升級服務(wù)器的前提下 如何提高webman IO密集型請求的并發(fā)數(shù)量
升級workerman到v5 配合workerman/http-client 協(xié)程用法處理外部http請求
composer require workerman/workerman ^5.0.0-beta.7
composer require revolt/event-loop ^1.0.1
composer require workerman/http-client ^2.0.1
老大 我有點不理解 我現(xiàn)在的項目是webman框架 您的意思是讓我把這塊業(yè)務(wù)獨立出來 用workerman框架嗎
還是說 可以直接在webman里面用這個協(xié)程http-client?
老大我還是有點不明白
worker進程是阻塞的 分配到worker的請求也需要同步返回結(jié)果 那么用了這個協(xié)程的http-client 就不會阻塞該進程了嗎
我實在沒搞懂 有大佬能解答一下嗎
worker進程本身是非阻塞的,但是開發(fā)者的業(yè)務(wù)代碼可能有阻塞調(diào)用,比如pdo,curl等,導(dǎo)致進程阻塞。
workerman/http-client 是非阻塞的庫,只調(diào)用它不會阻塞進程。
老大 協(xié)程用法提升太大了 之前cpu占用很低 程序卻卡死了
現(xiàn)在測試超大并發(fā) 很快就處理完了 并發(fā)時cpu占用率也很高 說明協(xié)程的cpu利用率非常高
但是我遇到了一個新的問題
簡單說我的業(yè)務(wù)流程
客戶端->worker->查詢?nèi)浇涌?>返回給客戶端
當(dāng)有大量客戶端請求時,我的項目就會卡住 現(xiàn)在引入?yún)f(xié)程查詢外部接口 已經(jīng)解決了這個問題
但是請求結(jié)果有點亂套 比如客戶端a、b、c請求的結(jié)果應(yīng)該是 A B C
但是協(xié)程情況下 客戶端a獲得的結(jié)果可能是 B
或者 客戶端a 對應(yīng)的協(xié)程有獲取到結(jié)果A 但是卻分配給B了 自己在webman的控制器流程里面結(jié)果卻是空
我修改了好幾遍 希望把問題描述清楚 但是好像還是有點繞 老大幫忙看看吧
這協(xié)程我真不知道咋調(diào)試了 推測可能的原因是每次都會調(diào)用一個靜態(tài)類
之前一個請求對應(yīng)一個進程對應(yīng)一個靜態(tài)類對象
現(xiàn)在多個請求對應(yīng)一個進程對應(yīng)多個靜態(tài)類對象
而靜態(tài)類 多個對象其實是和類掛鉤的 所以一個變了 別的對象都跟著變了 這個是現(xiàn)在的推測 我還在研究
問題已經(jīng)解決了 是我的代碼問題 就是我上面說的 我的webman控制器調(diào)用了一個靜態(tài)類 http請求結(jié)果賦予給靜態(tài)類的某個靜態(tài)屬性了 改成非靜態(tài)類 實例化后 就行了
另外我看論壇好多說協(xié)程沒啥用的 我只能說 就我遇到的問題 服務(wù)器配置翻倍都沒啥效果 進程開100多個也沒效果
現(xiàn)在老大出的這個協(xié)程請求太nb了 針對io堵塞 或者 請求超時 的情況 改善的不是一點點
之前壓測系統(tǒng)直接卡死 現(xiàn)在壓測 不僅處理完成的時間少了一半 而且管理后臺一點不卡 worker也不busy
感謝webman 感謝老大 我頭也不疼了
如果業(yè)務(wù)需要,必須在pdo事務(wù)中請求第三方接口(請求失敗回滾/成功提交),這種情況下使用攜程用法處理HTTP請求,最終還是導(dǎo)致阻塞的吧?不知道有沒有優(yōu)化的方向呢。
現(xiàn)在的業(yè)務(wù)類似webmanAI助手這個應(yīng)用。用戶使用服務(wù)需要調(diào)ChatGpt接口并且扣除余額(PDO事務(wù)),不知道怎么分離比較合適。