因?yàn)槎鄠€(gè)worker是競(jìng)爭(zhēng)消費(fèi)的,沒(méi)有辦法保證一一對(duì)應(yīng)。我看現(xiàn)在的解決方案只有使用channel注冊(cè)訂閱的方式,還有其它方案可以解決嗎
對(duì)于純workerman環(huán)境:
一個(gè)socket連接一旦連接到哪個(gè)worker進(jìn)程,那么后續(xù)這個(gè)連接上的消息依然還是由相應(yīng)的這個(gè)worker進(jìn)程來(lái)處理的;【worker節(jié)點(diǎn)依賴(lài)內(nèi)核調(diào)度實(shí)現(xiàn)】
再比如gatewayworker環(huán)境:
也有類(lèi)似的實(shí)現(xiàn)機(jī)制,gateway轉(zhuǎn)發(fā)連接連接到businessworker時(shí),一開(kāi)始隨機(jī)路由選擇一個(gè)worker進(jìn)程,在此之后同一連接繼續(xù)轉(zhuǎn)發(fā)來(lái)的消息就會(huì)自動(dòng)交由給先前路由好的那個(gè)進(jìn)程?!緒orker節(jié)點(diǎn)依賴(lài)內(nèi)核調(diào)度實(shí)現(xiàn),轉(zhuǎn)發(fā)節(jié)點(diǎn)之間則依賴(lài)應(yīng)用實(shí)現(xiàn)】
對(duì)于純workerman環(huán)境:有沒(méi)有內(nèi)核版本限制呢,我看3.9以上使用了端口復(fù)用SO_REUSEPORT可以實(shí)現(xiàn)同一個(gè)連接一直由同一個(gè)worker處理(內(nèi)核根據(jù)tcp四元組hash負(fù)載均衡)。
進(jìn)程的負(fù)載均衡是需要開(kāi)啟端口復(fù)用機(jī)制、workerman已經(jīng)支持、另linux內(nèi)核好像是需要2.6以上即可。
每個(gè)worker 維持部分連接。所以單進(jìn)程或者使用channel可以。換個(gè)角度想,可不可以每個(gè)進(jìn)程開(kāi)啟一個(gè)udp內(nèi)部端口,接收廣播,有這個(gè)id就做事,沒(méi)就不管。廣播如果有廣播風(fēng)暴,用redis隊(duì)列呢?或者消息隊(duì)列,同理在我這,我就處理,沒(méi)有我就不管。
開(kāi)啟一個(gè)udp內(nèi)部端口,接收廣播,有這個(gè)id就做事,沒(méi)就不管,channel就是這個(gè)原理。redis或者消息隊(duì)列用不了,會(huì)阻塞