基于订阅的服务通讯架构体系
? ? ? ? 說(shuō)到訂閱服務(wù)通訊一般都會(huì)想到基于隊(duì)列的消息生產(chǎn)和消費(fèi)模式,這也是在實(shí)際應(yīng)該中比較常用的方式。一般生產(chǎn)者把消息發(fā)送到隊(duì)列服務(wù)中心,然后消費(fèi)者去中心訂閱;然而這種方式需要一個(gè)消息服務(wù)中心,而在這里所說(shuō)的訂閱服務(wù)通訊則有點(diǎn)不一樣,因?yàn)樾枰`活的訂閱方式,所以需要去除中心化處理;但去除中心化那則需要考慮的事情想對(duì)復(fù)雜,最基礎(chǔ)的環(huán)節(jié)就是如何維護(hù)生產(chǎn)者和消費(fèi)者的關(guān)系,接下來(lái)講解如何實(shí)現(xiàn)這種方式。
中心化通訊方式
????? ? 由于在應(yīng)用中一般會(huì)使用隊(duì)列服務(wù)作為消息中心,所以生產(chǎn)者和消費(fèi)并沒(méi)有直接的關(guān)系,一個(gè)把消息投遞到中心,一個(gè)從中心中獲取。
? ? ? ??
去除中心化
????? ? 去除中心化其實(shí)就是生產(chǎn)和消費(fèi)并不依賴(lài)于中心服務(wù),每個(gè)生產(chǎn)和消費(fèi)自身就是一個(gè)中心服務(wù),簡(jiǎn)單地說(shuō)也不存在生產(chǎn)和消費(fèi)劃分;每個(gè)服務(wù)充當(dāng)生產(chǎn)的同時(shí)也是消費(fèi)者。
? ? ? ? ? ??
????? ? 去除中心后服務(wù)之間都可以構(gòu)建訂閱體系,即其中一個(gè)服務(wù)故障也不會(huì)影響其他訂閱服務(wù),這樣在可靠性和靈活性上對(duì)于中心化服務(wù)都有著很大的優(yōu)勢(shì);但有一個(gè)很明顯的問(wèn)題就是沒(méi)有中心服務(wù),服務(wù)之間是如何發(fā)現(xiàn)對(duì)方呢,這的確是一個(gè)麻煩的事情。
如何發(fā)現(xiàn)服務(wù)
????? ? 對(duì)于不同服務(wù)通訊需要做的事情是發(fā)現(xiàn)對(duì)方,一般的服務(wù)程序都有固定的地方(域名)和端口來(lái)告訴使用者,你可以通過(guò)這個(gè)地方connect進(jìn)來(lái)。既然需要去除中心化那自然就不會(huì)知道現(xiàn)在有什么服務(wù),所以需要制定一套服務(wù)自我發(fā)現(xiàn)機(jī)制來(lái)確保服務(wù)間可以自動(dòng)發(fā)現(xiàn)。
? ? ? ? ? ??
????? ? 既然我們不知道對(duì)方的服務(wù)地址和端口,那怎樣發(fā)現(xiàn)對(duì)方呢?其實(shí)每個(gè)服務(wù)可以把自己的服務(wù)信息通過(guò)UDP廣播出去,這樣其他服務(wù)就可以接收到相關(guān)的廣播,當(dāng)A接收到其他服務(wù)的UDP廣播后就會(huì)可以知道網(wǎng)內(nèi)有什么服務(wù),這樣就可以向具體的服務(wù)發(fā)起連接請(qǐng)求,并建立服務(wù)與服務(wù)之間的通訊。
消費(fèi)者注冊(cè)同步
????? ? 服務(wù)和服務(wù)之間已經(jīng)握手了,那消費(fèi)注冊(cè)就會(huì)變得比較簡(jiǎn)單,因?yàn)橄M(fèi)者隨便一臺(tái)服務(wù)上注冊(cè)都可以同步到同一集群中的所有服務(wù)上。
? ? ? ? ? ??
????????? ? 如果消費(fèi)者在多個(gè)服務(wù)注冊(cè),那整體的通訊結(jié)構(gòu)如下
? ? ? ? ? ??
?
代碼
- 消費(fèi)者
Route.DefaultNode.Open();mSwitch = new SubscribeSwitch();mSwitch.GetServiceSubscribe("HELLO").RegisterProcess<Hello>((o, e) =>{e.Reply(e.Data); }); - 生產(chǎn)者
Route.DefaultNode.Open();mSwitch = new SubscribeSwitch();Hello hello = new Hello { Name = "hello,how are you?" };hello = mSwitch.Send<Hello>("HELLO", hello); 在應(yīng)用代碼中不存所有服務(wù)地址的概念,只要節(jié)點(diǎn)服務(wù)打開(kāi)就會(huì)自動(dòng)向網(wǎng)內(nèi)進(jìn)行服務(wù)信息廣播,并發(fā)現(xiàn)網(wǎng)絡(luò)的其他服務(wù)節(jié)點(diǎn)。
存在問(wèn)題
????? ? 由于UDP廣播只能有效于局域網(wǎng)段,不適用于廣域網(wǎng),所以些通訊架構(gòu)體系也只適用于應(yīng)用內(nèi)部的集群通訊體系應(yīng)用,如果需要應(yīng)用到廣播網(wǎng),那則需要一個(gè)發(fā)現(xiàn)中心來(lái)確認(rèn)服務(wù)在廣域網(wǎng)下是可發(fā)現(xiàn)的。
?
總結(jié)
以上是生活随笔為你收集整理的基于订阅的服务通讯架构体系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mozilla 构建系统(转)
- 下一篇: 配置远程控制