如果workerman實(shí)現(xiàn)分布式處理,是不是需要通過socket進(jìn)行多臺(tái)服務(wù)器的通訊,那么這個(gè)socket的通訊模式,和fastcgi相比,好在什么地方?
嗯,目標(biāo)需求是一個(gè)游戲服務(wù)器
需要用3臺(tái)Server對(duì)游戲的邏輯進(jìn)行處理
一臺(tái)Gateway,進(jìn)行連接管理。
那如果Gateway向Server發(fā)送處理請(qǐng)求,是不是必然需要通過Socket進(jìn)行通訊。
還是通過共享內(nèi)存,大家都去訪問一個(gè)memcache機(jī)器之類的部署方式。
因?yàn)镕astCGI是基于Socket的一種模式,所以Gateway只需要設(shè)置好要請(qǐng)求FastCGI網(wǎng)關(guān)地址,然后進(jìn)行輪訓(xùn)請(qǐng)求就可以達(dá)到效果。
所以想問一下,如果是Worekerman,該怎么處理?
workerman中 Gateway和BusinessWorker之間的通訊是TCP長鏈接通訊。而FastCGI一般用于短鏈接通訊,使用FastCGI會(huì)有頻繁的創(chuàng)建鏈接TCP三次握手和斷開鏈接TCP四次握手的通訊過程,導(dǎo)致服務(wù)器網(wǎng)絡(luò)IO及CPU負(fù)載都會(huì)高一些,而且在創(chuàng)建鏈接時(shí)也會(huì)造成請(qǐng)求的等待,影響通訊的即時(shí)性。另外FastCGI協(xié)議比較復(fù)雜,解析起來也比較耗費(fèi)CPU,F(xiàn)astCGI更適合WEB類的應(yīng)用。相比workerman的協(xié)議是自己訂制的,簡(jiǎn)單高效。
哦,那我明白了
workerman里
Gateway會(huì)跟N臺(tái)服務(wù)器的BusinessWorker進(jìn)行長連接通信,從而實(shí)現(xiàn)分布式,是這個(gè)意思吧?
BusinessWorker進(jìn)程啟動(dòng)的時(shí)候會(huì)自動(dòng)讀取一個(gè)存儲(chǔ),這個(gè)存儲(chǔ)中保存著所有Gateway進(jìn)程內(nèi)部通訊的ip和端口,然后BusinessWorker與這些ip端口建立長鏈接,這時(shí)Gateway會(huì)自動(dòng)感知到有新的BusinessWorker加進(jìn)來,以后有客戶端請(qǐng)求到來時(shí)會(huì)自動(dòng)將請(qǐng)求按照規(guī)則(目前是隨機(jī)或者說是輪詢)發(fā)送到新加的BusinessWorker。
當(dāng)下掉一臺(tái)BusinessWorker時(shí),這臺(tái)BusinessWorker與Gateway的長鏈接會(huì)斷開,Gateway此時(shí)也會(huì)感知到,然后Gateway將斷開的長鏈接從自己與BusinessWorker的長連接池中去掉,就不會(huì)向下掉的BusinessWorker轉(zhuǎn)發(fā)客戶端請(qǐng)求了。
原理就是這樣,代碼見 Bootstrap/Gateway.php Bootstrap/BusienessWorker.php