2011-03-31 98 views
2

我有一個應用程序通過WCF從許多其他應用程序接收數據。NService總線 - 獲取隊列上的所有掛起消息

我現在有客戶,也希望收到該數據的副本,但不同的客戶有不同的需求。

  • 客戶A想爲我們調用Web服務送他的數據
  • B客戶希望我們與
  • 客戶C想成立自己的系統中的數據通過電子郵件將他這將輪詢我提供的Web服務以接收他的數據。

我一直想使用NServiceBus很長一段時間,它似乎是一個很好的應用程序。我想我可以通過設置端點將數據以他們期望的格式/協議傳送給他們來處理客戶A和B。客戶C雖然,我很掙扎。

我在NService總線上看到的所有示例都涉及訂閱隊列並在消息進入時觸發事件。我想我在這裏要做的是當客戶撥打他的數據時,我會抓住隊列中的所有消息併發送給他們。

我的問題是,這是NServiceBus的正確應用還是這是工作的錯誤工具?如果是這樣,那裏有沒有代碼示例可以告訴我如何處理客戶C?

回答

3

這是一個很好的問題,因爲它切斷了基於消息系統的核心 - 特別是NServiceBus如何解決很多痛苦。

對於A和B,您肯定會朝着正確的方向前進 - 只需訂閱適當的消息,然後使用他們選擇的機制將數據轉發/推送給客戶。如果他們脫機,沒有什麼大不了的,基於消息的系統比其他人更優雅地處理故障。

有趣的是,客戶C的服務方式幾乎可以和A和B完全一樣,但只需要一些額外的步驟。首先,設置另一個預訂相應消息的NSB端點,然後使用客戶C指定的所需結構將它們寫入持久存儲。您可以將消息寫出到本地數據庫,JSON文件或甚至亞馬遜S3 blob。從那裏你只需要設置一些HTTP端點(不使用NServiceBus),允許客戶查詢和檢索適當的數據。如果您使用S3併發布JSON blob,您甚至可能甚至不需要安裝HTTP服務器 - 只需讓亞馬遜完成所有工作即可。

另一個非常酷的副作用是,如果未來的客戶D和E決定他們也想輪詢,但他們需要來自客戶C的彼此稍微不同的格式,則可以通過設置另一個處理程序它根據它們指定的格式寫出文件(或DB插入) - 所有這些都不會改變系統的行爲方式。

+0

我擔心這會成爲答案,因爲這意味着增加更多存儲等的複雜性,但它會完成工作。使用您提出的解決方案,我是否也會將NSB放在Web服務和持久性之間(在您的示例中爲s3),還是應該以「正常」同步方式構建它? – Brook 2011-04-01 13:12:30

+0

每當客戶直接詢問數據時,只需以最簡單的方式將數據提供給他們,不必擔心將NServiceBus添加到混合中。此外,你現在可能會增加「複雜性」,但你確實不會 - 通過保持關注點分開來保持簡單。這有助於隨着您的成長保持您的架構清潔和可擴展。 – 2011-04-02 03:57:24

+0

這可能應該是一個不同的問題,但有一個隊列,然後根據客戶(消息中的數據)切換交付機制,還是爲每個客戶建立一個單獨的隊列更好?我傾向於後者。 – Brook 2011-04-04 15:56:54

0

可以通過WCF公開一個端點,但是用於獲取消息到總線上。如果有人想要輪詢一項服務,我會單獨託管它,讓它們在被調用時進行管理。