2013-02-07 18 views
2

背景:如何重發消息給特定用戶?

我們有一個基於MassTransit的消息子系統。它工作的很好,只需要很少的問題即可提供數千條消息。到目前爲止,失敗的消息被自動推送到xxx_error隊列。這也很好。

我們甚至有我們自己的基於Web的管理控制檯來查看消息隊列並重新發送失敗的消息。該工具基於BusDriver示例,並直接在MSMQ上工作 - 它將郵件從xxx_error複製到xxx,並且它們被重新發送。

現狀:

我們考慮遷移到RabbitMQ的,它似乎更快,更具可擴展性。但是,當然,MSMQ管理控制檯變得毫無用處,我不想寫另一個版本的控制檯來處理RabbitMQ隊列。我寧願去一個通用的路由,我把失敗的消息放到我自己的存儲庫中,這個存儲庫將獨立於MSMQ傳輸。

聽起來很容易。這是我們有一個具體問題的地方。

失敗消息的存儲庫將包含(除其他屬性外)消息正文和消息訂戶名稱。稍後,我可以訪問存儲庫,反序列化消息並將其重新發送給特定訂戶。

但是,我們不希望bus.Publish(msg)作爲消息將再次擊中所有訂戶,而不是以前失敗的訂戶。我們想要的是將消息重新發送給一個用戶。

這似乎可能的:

senderbus.GetEndpoint(new Uri("rabbitmq://servername/subscriber1")).Send(msg); 

senderbus.GetEndpoint(new Uri("msmq://localhost/subscriber1")).Send(msg); 

(取決於所使用的傳輸)。通過這種方法,該消息被傳送給唯一的特定用戶。

現在的問題是:

請問這是建議的方法?我們有什麼替代方案?

可能的問題是,這種方法可能會忽略當前訂閱的信息並將消息直接傳遞給訂閱者隊列。但是,用戶可能不再訂閱該類型的消息。所以,代碼應該是這樣的:

if (subscriber1 still subscribes to messages of msg.GetType()) <- how do to this? 
    senderbus.GetEndpoint(new Uri("rabbitmq://servername/subscriber1")).Send(msg); 

在此先感謝您的任何意見。

回答

0

我不會。

不知道你的管理控制檯在做什麼,但是RabbitMQ的控制檯可以做的只是將消息從隊列移動到隊列。我正在尋找自己的功能,希望有一個腳本,我可以專門用於這一點。

要記住一件棘手的事情是,端點!=消費者。一個端點爲該總線上的所有消費者提供服務,而端點地址對於存儲和重新發布而言是微不足道的,而個人消費者則不會。

什麼人建議是冪等消費者:http://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning

我不會擔心消費者不訂閱特定的消息,用於建立路由信息,你正在尋找升級使用靜態類型。在升級過程中注意這些消息。

+0

我不太明白你所說的。例如,對於公共交通來說,我相信一個隊列==消費者(儘管這對於使用RMQ的其他消息模型來說可能不是這樣)。最終,我們決定堅持使用地鐵團隊提供的BusDriver工具。在RMQ隊列之間移動消息時,該工具按預期工作。但是,我支持你的幫助,並感謝這個答案。我相信MassTransit沒有它應得的觀衆 - 這是一個很好的框架,只有很小的社區。 –

+0

這很酷,儘管在MassTransit中queue == endpoint == IServiceBus實例,所以除非每個總線實例只有一個訂戶,否則所有訂閱特定消息類型的消費者都會將消息發送到該隊列。 https://groups.google.com/forum/?fromgroups#!forum/masstransit-discuss是**討論MassTransit的地方,得到了作者的驚人支持。 乾杯 –

+0

接受你的答案,因爲它似乎是唯一的一個:) –

相關問題