2011-09-07 83 views
8

如果我是建設使用消息隊列幾十個出版商/用戶的系統,看來我有一些網絡配置選項:本地與在發佈/訂閱消息遠程隊列

  1. 我能有一個聚集經紀人所有機器使用 - 每臺機器不會有一個本地隊列
  2. 我可以每個本地機器上安裝代理,並使用存儲並轉發消息傳遞給遠程機器

不同的技術似乎強制執行不同的配置 - 例如MS MQ要求每臺機器都有自己的本地隊列,而Tibco EMS似乎經常用於羣集中,而每個用戶沒有本地隊列。

沒有本地隊列的缺點是什麼,影響決策的因素是什麼?

回答

5

沒有提供持久消息存儲的本地隊列意味着您無法保證消息傳遞。在本地使用類似RabbitMQ的集羣中的代理實例爲您提供持久的機制來存儲要傳遞的消息。如果您必須通過網絡連接連接到遠程代理才能發送持久消息,則網絡故障的風險更高。

MSMQ也是存儲轉發的,但它不提供任何集羣路由功能。這意味着應用程序必須完成這項工作(或者在它的頂部有一個圖層,例如MassTransit或NServiceBus爲您完成)。

當我想到TIBCO時,我想到應用程序服務器與之通信的EMS服務器集中式集羣,而不是在本地運行代理實例。環繞EMS和BusinessWorks應用程序服務器的GUI工具確實在該世界中推行了一個模型。

在本地存儲消息的任何分佈式情況下,重要的是要確保機器本身具有適當的消息存儲設備,並且具有快速的磁盤和足夠的磁盤以用於預期的消息積壓/容量。

+0

TIBCO EMS確實支持經紀人之間的路由,這將允許本地和中央服務器。最常見的設置是集中式集羣。此外,本地實例可能會招致更高的許可費用。 – stoft

3

我想冒險的地方隊列將是必要的在大多數情況下。

如果消息需要持久,則需要本地隊列。換句話說,如果與遠程隊列的連接不可靠,並且您希望消息最終到達其訂閱者,那麼您需要本地隊列的存儲轉發功能。

如果消息不需要持久化(在事件觸發後可能會丟失),那麼遠程共享隊列將是一個選項。

您可能想看看NServiceBus distributor model,這可能是您的兩種情況的混合:每臺計算機上的本地隊列將轉發到遠程代理/分發服務器羣集。

2

我不確定我是否同意MSMQ上的評論,因爲他們似乎過時了。也許我錯過了一些東西。

MSMQ支持這兩種情況。

在方案1中,客戶端將使用事務遠程接收(MSMQ 4.0及更高版本)。 作爲事務性的,接收是可靠的,並且消息持久(與在早期版本的MSMQ上中止接收將消息留在服務器上不同)。

在場景2中,存儲轉發傳出隊列將發送到客戶端上的本地事務隊列(再次可靠和耐用)。

可靠性和耐久性不應該成爲使用本地和遠程隊列的決策點。性能是MSMQ的特色。