ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力
 因此,您希望跨分布式主題使用ActiveMQ進(jìn)行發(fā)布-訂閱,并且要可靠。 您可以只使用永久訂閱,對(duì)不對(duì)? 可以,但是,如果將群集與ActiveMQ一起使用,則可能會(huì)遇到意外行為。 我最近在一個(gè)客戶端上,我注意到了這一行為,并且還注意到在使用Weblogic JMS集群時(shí)也存在相同的行為。 那么有什么問(wèn)題,ActiveMQ可以解決什么問(wèn)題呢? 好吧,我假設(shè)您閱讀了標(biāo)題,所以您可能有個(gè)主意……但我還是會(huì)繼續(xù)前進(jìn)…… 
考慮這種情況。 您有經(jīng)紀(jì)人A和經(jīng)紀(jì)人B。它們?cè)趦蓚€(gè)方向上都聯(lián)網(wǎng)在一起,形成一個(gè)完全網(wǎng)格類(lèi)型的經(jīng)紀(jì)人網(wǎng)絡(luò) 。 又名,群集。 然后,您將使用故障轉(zhuǎn)移URL failvoer:(tcp://hostA,tcp://hostB)擁有一個(gè)訂戶FOO。 這意味著訂戶將從故障轉(zhuǎn)移傳輸中的節(jié)點(diǎn)列表中隨機(jī)選擇一個(gè)URL,然后連接到該代理。 到目前為止,一切都很好。 假設(shè)故障轉(zhuǎn)移URL選擇了要連接的代理B,訂閱者在代理B上創(chuàng)建了對(duì)主題TEST.TOPIC的持久訂閱。在TEST.TOPIC ,代理網(wǎng)絡(luò)將確定B上有一個(gè)新的TEST.TOPIC 。因此,如果經(jīng)紀(jì)人A上有任何生產(chǎn)者,那么經(jīng)紀(jì)人A應(yīng)該將消息轉(zhuǎn)發(fā)給經(jīng)紀(jì)人B(消費(fèi)者在哪里)。 
現(xiàn)在讓我們說(shuō)訂戶FOO決定斷開(kāi)與代理B的連接。這是很好的,因?yàn)檫@是持久預(yù)訂,因此消息應(yīng)該保留,并且如果訂戶FOO返回,它應(yīng)該能夠檢索傳遞到主題TEST.TOPIC任何消息。 TEST.TOPIC不在時(shí)。 但是如果訂戶FOO使用故障轉(zhuǎn)移傳輸直接連接到代理A,會(huì)發(fā)生什么? 最終將創(chuàng)建一個(gè)新的持久訂閱(它不會(huì)使用與網(wǎng)絡(luò)創(chuàng)建的持久訂閱相同的..,因?yàn)樵撚脩襞c網(wǎng)橋綁定),但是它將無(wú)法訪問(wèn)代理中可能存在的任何消息B.當(dāng)制片人發(fā)送更多的消息給A,它也將嘗試著給經(jīng)紀(jì)人B的是在那里用戶原是 。 現(xiàn)在想象一下可以連接,斷開(kāi)連接并重新連接到集群中不同代理的多個(gè)訂閱服務(wù)器。 您最終將導(dǎo)致訂閱泄漏,到處都是消息丟失。 uck 這同樣適用于真實(shí)的故障情況,在這種情況下,訂戶FOO不會(huì)自愿斷開(kāi)連接,而是代理B崩潰,并且訂戶FOO被迫重新連接到代理A。您仍然會(huì)丟失消息。
好吧,事實(shí)證明,這種行為在具有分布式主題的Weblogic和集群JMS服務(wù)器上也存在(大致等同于我上面描述的代理網(wǎng)絡(luò))。 那么,我們將不能可靠地進(jìn)行分布式發(fā)布訂閱嗎? 好吧,我不確定WLS如何解決它,但是ActiveMQ有一個(gè)很棒的解決方案,稱為Virtual Topics 。 對(duì)于分布式pup-sub來(lái)說(shuō),這是一個(gè)很棒的功能,但即使在單代理部署中,它也克服了持久訂閱者的限制。
有什么限制?
考慮一下…您正在使用主題TEST.TOPIC.的持久訂閱者TEST.TOPIC. 事實(shí)證明,對(duì)消息的處理要花很長(zhǎng)時(shí)間,因此您希望讓另一個(gè)訂戶在同一消息通道上偵聽(tīng)以“平衡”工作負(fù)載。 嘗試一下。 您會(huì)很快發(fā)現(xiàn)JMS規(guī)范不允許這樣做,因?yàn)槌志糜嗛喺弑仨毦哂形ㄒ坏腸lientId和durableName并且不能有多個(gè)訂閱者在偵聽(tīng)相同的消息流。
那么,您如何在池化連接的應(yīng)用程序服務(wù)器中部署訂戶。 您正在嘗試在多個(gè)持久訂戶之間共享連接。 好了,您將再次遇到持久訂閱者clientId和持久名稱的限制。
 回到我們的分布式發(fā)布訂閱問(wèn)題。 如果使用虛擬主題,則可以解決我上面描述的問(wèn)題。 虛擬主題在幕后使用隊(duì)列(對(duì)于消費(fèi)者來(lái)說(shuō)……請(qǐng)閱讀虛擬主題上的Apache文檔,它有一些很好的示例),使用隊(duì)列,您可以將消息重播給您(例如,當(dāng)訂戶重新連接到A時(shí),它是消息不會(huì)丟失,因?yàn)榭梢灾夭ハ?#xff09;,或者如果B代理由于某種原因而發(fā)生故障(失敗),則可以讓從屬服務(wù)器在其位置等待重播否則可能丟失的消息。 有關(guān)更多詳細(xì)信息,請(qǐng)查看有關(guān)具有持久訂閱者的分布式主題的ActiveMQ常見(jiàn)問(wèn)題解答,因?yàn)槲椰F(xiàn)在就開(kāi)始編寫(xiě)它。 
參考: ActiveMQ群集,持久訂閱者和虛擬主題,可從Christian Posta Software博客的JCG合作伙伴 Christian Posta那里搶救出來(lái)。
翻譯自: https://www.javacodegeeks.com/2013/02/activemq-clustering-durable-subscribers-and-virtual-topics-to-the-rescue.html
總結(jié)
以上是生活随笔為你收集整理的ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: linux如何查看路由表linux如何查
- 下一篇: vivo手机连电脑不显示不出来(vivo
