分布式環(huán)境下單點(diǎn)通信的問題
非常感謝老師的講解,但是還有個(gè)疑問:
在分布式環(huán)境下如何進(jìn)行單點(diǎn)通信?
并不知道目標(biāo)用戶被分配在哪個(gè)服務(wù)器上
一有消息就向全部服務(wù)器推送?
非常感謝老師的講解,但是還有個(gè)疑問:
在分布式環(huán)境下如何進(jìn)行單點(diǎn)通信?
并不知道目標(biāo)用戶被分配在哪個(gè)服務(wù)器上
一有消息就向全部服務(wù)器推送?
舉報(bào)
2018-08-07
????HI同學(xué),向單個(gè)用戶推送不建議廣播gateway。
會(huì)話層
????這個(gè)架構(gòu)需要繼續(xù)演進(jìn),允許長(zhǎng)連接認(rèn)證(auth),這樣每個(gè)長(zhǎng)連接就對(duì)應(yīng)一個(gè)用戶ID(uid)。
????當(dāng)我們要給某個(gè)uid推送的時(shí)候,需要知道uid對(duì)應(yīng)的長(zhǎng)連接在哪些服務(wù)器上,所以我們需要實(shí)現(xiàn)一個(gè)會(huì)話層(session layer),最簡(jiǎn)單的就是搭建一套redis cluster,把uid與gateway之間的關(guān)系記錄下來(lái),然后基于客戶端心跳,去redis cluster中做刷新,避免關(guān)系過(guò)期。
????當(dāng)我們要給uid推送時(shí),可以由logic去session層獲取uid所在gateway,然后定向推送到對(duì)應(yīng)gateway,避免集群內(nèi)廣播。
登錄
????實(shí)際工程中,我們不會(huì)把帳號(hào)密碼登錄放在gateway里實(shí)現(xiàn),而是寫一個(gè)單獨(dú)的認(rèn)證服務(wù)(一般會(huì)與公司的賬號(hào)系統(tǒng)打通),完成認(rèn)證后發(fā)放一個(gè)生命期很短的TOKEN,比如JWT,這個(gè)TOKEN是可以自驗(yàn)證的。
????客戶端拿著token建到gateway的連接,然后auth提交token,由gateway直接驗(yàn)證有效,完成會(huì)話的建立。