2017-02-18 46 views
3

我剛開始使用Azure ServiceBus。有一件事我不完全清楚,而且我很難找到答案。Azure ServiceBus:所有主題訂戶都必須處理消息

如果我在訂閱消息上調用message.Complete(),是否意味着此消息不再傳遞給其他訂閱者,還是我只爲當前訂閱者完成此消息?換句話說,服務總線是否跟蹤每個用戶或每次訂閱的消息?

在我的具體使用情況下,我想通過對消息進行處理所有用戶,而不僅僅是任意/一個用戶。這完全可能與主題有關嗎?

回答

3

消息重複旨在由單個消費者的競爭來處理。否則,它將被視爲消息重複。

如果您需要將相同的消息發送給同一邏輯用戶的多個實例,則每個用戶必須擁有自己的具有默認過濾器的專用訂閱隊列。

例如:使用雲服務時,您需要爲每個CS角色實例創建一個訂閱者。每個訂閱隊列都必須是唯一可識別的,唯一標識符必須是確定性的。一種選擇是使用CS實例ID。每當進程向外擴展時,實例ID將被追加到訂閱隊列中。這種方法也有一個挑戰。進程擴展時,可能還有未處理的消息。

5

您的問題已經得到解答,但似乎有混淆(訂閱\訂戶),以及什麼是建議的用例。

考慮一個簡單的隊列,其中一端放置消息,另一端彈出它們。這是ServiceBus隊列的行爲方式。
現在考慮一個隊列,你仍然把消息放在一端,但是然後它分裂成多個端口,你可以從中彈出消息。這描述了一個主題(放置消息的位置)和訂閱(您彈出消息的位置)。

在主題\預訂中,主題中的消息是已將複製到預訂。所以每個訂閱都獨立於其他訂閱。這就像隊列的不同副本。

現在,您從客戶端接收消息的客戶端應用程序就是您稱爲訂戶的東西。每個客戶(訂戶)都是爲了連接到一個訂閱。在這種情況下,訂閱者不會競爭消息,並且每個訂閱者可以像處理其他消息一樣處理相同的消息。另一方面,如果你有很多連接到相同訂閱的客戶端應用程序(訂閱者),那麼它們自然會競爭相同的消息。

希望這解釋了你得到的答案(這看起來有衝突,但實際上只是使用相同的術語)。底線是最終你可以用ServiceBus做兩種情況。