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