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