微服务扩展新途径:Messaging
【編者按】服務(wù)編排是微服務(wù)設(shè)置的一個(gè)重要方面。本文在利用 ActiveMQ 虛擬話題來(lái)實(shí)現(xiàn)這一目標(biāo)的同時(shí),還會(huì)提供實(shí)用性指導(dǎo)。文章系國(guó)內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。
目前,微服務(wù)使用已十分普遍,利用服務(wù)編排(而不是服務(wù)編制)來(lái)進(jìn)行微服務(wù)互動(dòng)的想法也很常見(jiàn)。本文將講述如何通過(guò) ActiveMQ 虛擬話題來(lái)設(shè)置服務(wù)編排和基于服務(wù)互動(dòng)的可擴(kuò)展事件。
服務(wù)互動(dòng)類(lèi)型
服務(wù)互動(dòng)類(lèi)型主要有兩種:同步和異步。
在同步互動(dòng)中,服務(wù)使用者會(huì)發(fā)出請(qǐng)求,然后在操作完成、收取回復(fù)前阻止其他活動(dòng)運(yùn)行,HTTP 協(xié)議就是一個(gè)很好的同步互動(dòng)例子。通常情況下,這種互動(dòng)與請(qǐng)求-回復(fù)互動(dòng)類(lèi)型、 HTTP 協(xié)議都是相關(guān)的(當(dāng)然,也可以利用異步請(qǐng)求或消息傳遞來(lái)登記、請(qǐng)求回調(diào)函數(shù)的結(jié)果,不過(guò)這種做法不太常見(jiàn))。
在異步互動(dòng)中,服務(wù)使用者發(fā)出的請(qǐng)求不用在操作完成后才可以運(yùn)行。一旦請(qǐng)求確認(rèn)被收到,服務(wù)使用者就可以接著做其他的活動(dòng)。這種類(lèi)型支持互動(dòng)溝通采用發(fā)布-訂閱模式,例如:不需要服務(wù)使用者調(diào)用其他服務(wù)操作,只需要生產(chǎn)者提出事件,等待感興趣的使用者做出反應(yīng)即可。
除了這些技術(shù)層面的考慮,還應(yīng)該注意考量服務(wù)互動(dòng)的其他層面:耦合和責(zé)任。
如果服務(wù) A 要和服務(wù) B 互動(dòng),是要服務(wù) A 來(lái)調(diào)用服務(wù) B(編制),還是讓服務(wù) B 去訂閱正確的時(shí)間(編排)呢?
在服務(wù)編制中需要有一個(gè)中心實(shí)體(即例子中的服務(wù) A),去了解被調(diào)用的其他服務(wù)。利用編排方法,可以將這個(gè)責(zé)任分配給個(gè)體服務(wù),由它們來(lái)負(fù)責(zé)訂閱“有意思的”事件。
如果想要了解更多關(guān)于本話題的內(nèi)容,請(qǐng)查閱 Building Microservices。接下來(lái),本文將集中討論如何使用消息傳遞實(shí)現(xiàn)服務(wù)編排。
通過(guò)消息傳遞進(jìn)行服務(wù)編制
服務(wù)編制是通過(guò)隊(duì)列實(shí)現(xiàn)消息傳遞的。隊(duì)列能夠在競(jìng)爭(zhēng)使用者模式下實(shí)現(xiàn)負(fù)載均衡,并且確保消息和使用者一一對(duì)應(yīng)。
假設(shè)存在一個(gè)與“郵件服務(wù)”互動(dòng)的“客服服務(wù)”,最簡(jiǎn)單的實(shí)現(xiàn)方法就是使用一個(gè)允許“客戶(hù)服務(wù)”給“郵件隊(duì)列”發(fā)送消息的隊(duì)列。如果“客戶(hù)服務(wù)”需要跟“忠誠(chéng)值服務(wù)”互動(dòng),“客戶(hù)服務(wù)”就要給“忠誠(chéng)值服務(wù)”再發(fā)一條消息。這種辦法下,“客戶(hù)服務(wù)”需要了解“郵件服務(wù)”和“忠誠(chéng)值服務(wù)”這兩者,并且把正確的消息發(fā)給對(duì)應(yīng)的隊(duì)列。簡(jiǎn)而言之,整個(gè)互動(dòng)過(guò)程都是由“客戶(hù)服務(wù)”編制的。
使用隊(duì)列的一個(gè)好處就是它可以輕松擴(kuò)展使用者,并開(kāi)啟多個(gè)“忠誠(chéng)值服務(wù)”和“郵件服務(wù)”,從而將負(fù)載均衡地分布于不同的使用者間。
通過(guò)消息傳遞進(jìn)行服務(wù)編排
使用服務(wù)編排方式時(shí),“客戶(hù)服務(wù)”卻不需要了解“忠誠(chéng)值服務(wù)”和“郵件服務(wù)”。因?yàn)椤翱蛻?hù)服務(wù)”只要對(duì)“客戶(hù)話題”發(fā)出一個(gè)事件,“忠誠(chéng)值服務(wù)”和“郵件服務(wù)”就會(huì)去了解客戶(hù)事件協(xié)議,并訂閱正確的話題——話題的發(fā)布-訂閱語(yǔ)意會(huì)確保每個(gè)事件同時(shí)被分發(fā)給兩個(gè)訂閱者。
擴(kuò)展服務(wù)編排
話題執(zhí)行發(fā)布-訂閱,而不是競(jìng)爭(zhēng)使用,這使得使用者的擴(kuò)展變得更加困難。如果(橫向)擴(kuò)展“忠誠(chéng)值服務(wù)”并在兩個(gè)實(shí)例中進(jìn)行試驗(yàn),可以發(fā)現(xiàn)它們會(huì)收到同樣的事件,這樣擴(kuò)展的話并沒(méi)有什么益處(除非服務(wù)是等冪的)。
ActiveMQ 虛擬話題解決方案
因此需要一種融合了話題和隊(duì)列的綜合形式,充分發(fā)揮這兩個(gè)功能:既能夠利用“客戶(hù)服務(wù)”的發(fā)布-訂閱來(lái)發(fā)布事件,確保所有服務(wù)都能收到該事件;也可以通過(guò)競(jìng)爭(zhēng)的使用者,使個(gè)體服務(wù)實(shí)例實(shí)現(xiàn)負(fù)載均衡并進(jìn)行擴(kuò)展。
實(shí)現(xiàn)該形式的方法有很多,可以利用 Camel 和 ActiveMQ :
- 第一個(gè)方法就是用一個(gè)簡(jiǎn)單的 Camel 路由來(lái)吸收“客戶(hù)話題”事件,并把它們同時(shí)發(fā)送給“忠誠(chéng)值隊(duì)列”和“郵件隊(duì)列”。這是很容易實(shí)現(xiàn)的,不過(guò)每當(dāng)有新服務(wù)對(duì)“客戶(hù)服務(wù)”事件感興趣時(shí)都需要重新更新 Camel 路由。而且,如果在代理之外單獨(dú)運(yùn)行 Camel 路由,把消息從某一話題轉(zhuǎn)入到其事先設(shè)定好的隊(duì)列中去,就會(huì)帶來(lái)不必要的網(wǎng)絡(luò)開(kāi)銷(xiāo)。
- 上述方法的一個(gè)改進(jìn)方案,就是在 ActiveMQ 代理流程中使用 ActiveMQ Camel plugin 來(lái)運(yùn)行 Camel 路由。這樣的話,雖然仍需要在訂閱者發(fā)生變更時(shí)更新 Camel 路由,但是路由是在代理過(guò)程中發(fā)生的,因此不會(huì)產(chǎn)生網(wǎng)絡(luò)開(kāi)銷(xiāo)。
- 不過(guò)還有更好的方案,就是將訂閱該話題的隊(duì)列 W/O 全部進(jìn)行編碼,但是要借用 ActiveMQ 虛擬話題的聲明法(這也是撰寫(xiě)本文的主要原因)。
ActiveMQ 虛擬話題是將訂閱隊(duì)列發(fā)布到話題中的方法,通過(guò)一個(gè)簡(jiǎn)單的命名慣例——所要做的就是確定話題或隊(duì)列的命名慣例,無(wú)論是自定義的還是默認(rèn)的都可以。
舉個(gè)例子:
- 可以先創(chuàng)建一個(gè)與 VirtualTopic.> 表達(dá)式相匹配的話題名,如 VirtualTopic.CustomerTopic,
- 然后讓“忠誠(chéng)度服務(wù)”調(diào)用 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 隊(duì)列,
- 那么消息代理就會(huì)將 VirtualTopic.CustomerTopic 話題中的所有事件都轉(zhuǎn)發(fā)給
Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 隊(duì)列。 - 然后可以通過(guò)開(kāi)啟多個(gè)服務(wù)實(shí)例來(lái)擴(kuò)展忠誠(chéng)度服務(wù),所有實(shí)例都從 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 隊(duì)列中調(diào)用。
- 同樣的,之后再用同樣的命名慣例為郵件服務(wù)創(chuàng)建隊(duì)列:Consumer.Email.VirtualTopic.CustomerTopic,這個(gè)功能允許用戶(hù)以特定方式來(lái)簡(jiǎn)單命名話題和隊(duì)列,并且無(wú)需編碼就能訂閱。
結(jié)論
以上所述只是最近出版的著作 Camel Design Patterns 里介紹的多種模式之一。正因?yàn)榻?jīng)常將Camel 與 ActiveMQ 一起使用,書(shū)中也就收錄了一些 ActiveMQ 模式內(nèi)容。
另外,用編排擴(kuò)展微服務(wù)還可以通過(guò)事件驅(qū)動(dòng)來(lái)實(shí)現(xiàn),這里就是一篇介紹這種方法的推薦文章。
本文轉(zhuǎn)自 OneAPM 官方博客
原文地址:https://dzone.com/articles/scalable-microservices-through-messaging
總結(jié)
以上是生活随笔為你收集整理的微服务扩展新途径:Messaging的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Leetcode题目解答汇总
- 下一篇: array专题3-一道题目不断分析就会慢