2010-02-04 70 views
1

我們目前有一個應用程序,它使用服務代理將消息排隊以發送到通過Web服務接口與外部系統通信的外部系統。服務代理 - 與外部應用程序通信時的多個隊列與單個隊列

目前我們只與一家公司集成,所以一個隊列就足夠了 - 但是我們需要開始向多個使用相同Web服務接口的公司傳遞消息。

我想知道如果一個單一的隊列系統是足夠的,或者我們應該有一個隊列,每個公司。由於每個公司都有一個隊列,所以我擔心會擴大規模,因爲我們可能有很多隊列,然後有很多連接來檢查隊列。

只有一個隊列,我們​​可以根據需要添加更多的閱讀器。但是,如果我們無法與其中一個外部系統進行通信(例如連接問題),則該消息不存在問題,並且我們希望重試該消息,但我們不希望延遲那些公司的消息系統已經啓動。我想知道人們目前是如何處理類似的情況?

我們可以重新插入郵件,但是我擔心的是我們不保證發貨順序。

回答

3

我假設通過「重新插入」一條消息,你的意思是回滾收到它的事務。其效果是,該消息將作爲來自給定對話的第一條消息再次可用於接收(因此您不必擔心保留傳送順序)。也就是說,這種方法存在問題,即poison message handling。如果從給定隊列中連續接收5個回滾,則隊列將被禁用。

Klaus Aschenbrenner's book中詳細描述的替代方法是具有掛起請求的表格。一旦被激活的過程收到來自Service Broker隊列的請求消息,它就會嘗試執行Web服務調用。如果由於某種原因而失敗,請求將被放入掛起的請求表中並每隔一段時間重試一次(您可以使用conversation timers安排重試)。這樣,如果Web服務不可用,則不會阻止Service Broker讀取器爲其他公司服務(假定第一個請求的超時時間足夠短)。而且由於無論Web服務調用是否成功,都會提交接收,因此不會遇到有害消息問題。

+0

我的意思是重新插入的意思是,你將消息從隊列中取出並重新放入,所以你不會收到有毒消息。然而,你失去了訂單交付 - 我會按照你的建議查看掛起的請求表。 – spooner 2010-02-04 18:28:42

+0

買了這本書,並給我我需要的一切。感謝您的高舉。 我認爲我的問題是我在考慮將郵件保留在隊列中的問題太多,而不是試圖在更合適的地方使用數據庫的其他功能(例如重試表)。 – spooner 2010-02-05 13:16:35

+0

很高興我能幫到你。許多Service Broker的使用模式涉及一個表格,該表格保存處理相關消息(通常由會話組ID標識)之間的應用程序狀態,以便隊列讀取器可能確實是異步的。 – 2010-02-05 17:55:40