首先感謝大神提供這么好用框架
?背景:公司api項目以前用提t(yī)p框架,性能不高,qps才幾百?,F用workerman的WebServer來實現api開發(fā),性能非常好,相比以前nginx+php-fpm模式,性能提升幾十倍。
但是單機處理請求數是有極限的,所以想通過辦法水平擴展增加服務器來提高qps,目標是達到并發(fā)1萬,響應時間在100ms以內
?
可能的辦法:
1.nginx(1臺) + workerman(多臺) + DB(多臺):nginx負責所有請求分發(fā),workerman處理數據并返回給nginx。這種方案難點在于 nginx如何與worker通信,協(xié)議如何制定?客戶端通過nginx轉發(fā)給workerman處理,增加一層網絡開銷,性能是否會有影響?
?
[attach]1734[/attach]
? 說明:
? ? 2.1)啟動WebServer,開啟5個子進程,監(jiān)聽客戶端請求
? ? 2.2)? 啟動多個業(yè)務服務(假設服務為:Worker),并寫入自己的ip+port到文件中。
? ? 2.3)? 當有客戶端請求來時,WebServer建立到Worker異步tpc連接
? ? 2.4)? Worker處理完數據返回給WebServer
? ?2.5)? Worker返回數據給客戶端
在這個設計中,WebServer相當于gateway/worker模型中的gateway, 業(yè)務服務相當于worker進程。WebServer進程開啟一個定時器,讀取注冊的業(yè)務服務器ip+port,采用某種算法(假設隨機抽取)分發(fā)請求。不知道這種方案是否可行,有沒有需要改進的地方??(注:沒有用gateway/worker框架是因為和客戶端不需要長連接)
?
方案1,nginx可以直接做透明tcp代理,直接將請求轉發(fā)給后端的workerman,不用考慮nginx和workerman之間的通訊協(xié)議。缺點是加了一層nginx,性能有一點點損耗,另外量大了nginx自身容易出現瓶頸,如果nginx故障則可能出現全站不可用的問題。
?
方案2,對于webserver而言,方案2過于復雜了。
?
方案3,最簡單并且性能無損耗的是方案3 DNS輪詢,請求量小的時候看起來可能不太均衡,請求量大的話是趨近于均衡的。如果某臺服務器出現故障,會影響部分請求。
?
如果要想性能好并且均衡的話可以用lvs(阿里云的lbs)。如果某臺服務器出現故障會自動踢出。
?
如果我選的話我會選擇dns輪詢,其次是lvs(lbs)。