1

我正在使用azure服務總線主題作爲我的解決方案的消息代理。根據我對每個訂閱的理解,Azure消息總線保持虛擬隊列,所以在接收端的消息順序不應受到干擾。Azure服務總線主題訂閱者接收訂單

但在現實中卻是有點不同,我的方案

  • 輸入大致每兩秒鐘後,(時間戳是正確的,我已經驗證它)
  • 如果我斷開了一段時間的接收器,消息開始在Azure上針對訂閱進行排隊。
  • 那麼如果我再次連接接收器,接收代碼很快就會收到消息,但是訂單不會被保留?
  • 然而如果予保持連接的客戶,消息,以便接收(兩秒後1個消息)

接收代碼

SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicname, subscription_name); 

       // Configure the callback options. 
       OnMessageOptions options = new OnMessageOptions(); 
       options.AutoComplete = false; 
       options.AutoRenewTimeout = TimeSpan.FromMinutes(1); 

       // Callback to handle received messages. 
       Client.OnMessage((message) => 
       { 
        try 
        { 
         // Process message from queue. 
         string payload = message.GetBody<string>(); 
         var myData = JsonConvert.DeserializeObject<MyData>(payload); 
         if(myData != null) 
         { 

          //Timestamp is not in order, when I connect after few minutes 
          Debug.WriteLine("SBC ==> " + myData.Timestamp); 

         } 
         // Remove message from queue. 
         message.Complete(); 
        } 
        catch (Exception) 
        { 
         // Indicates a problem, unlock message in queue. 
         message.Abandon(); 
        } 
       }, options); 

輸出

SBC ==> 5/23/2017 1:06:43 PM 
SBC ==> 5/23/2017 1:06:45 PM 
SBC ==> 5/23/2017 1:07:23 PM 
SBC ==> 5/23/2017 1:07:19 PM 
SBC ==> 5/23/2017 1:07:27 PM 
SBC ==> 5/23/2017 1:07:07 PM 
SBC ==> 5/23/2017 1:06:49 PM 
SBC ==> 5/23/2017 1:07:47 PM 
SBC ==> 5/23/2017 1:06:47 PM 
SBC ==> 5/23/2017 1:08:03 PM 
SBC ==> 5/23/2017 1:06:55 PM 
SBC ==> 5/23/2017 1:06:51 PM 
SBC ==> 5/23/2017 1:07:03 PM 
SBC ==> 5/23/2017 1:07:51 PM 
SBC ==> 5/23/2017 1:06:57 PM 
SBC ==> 5/23/2017 1:07:05 PM 
SBC ==> 5/23/2017 1:07:39 PM 
SBC ==> 5/23/2017 1:07:43 PM 
SBC ==> 5/23/2017 1:06:59 PM 
SBC ==> 5/23/2017 1:07:09 PM 
SBC ==> 5/23/2017 1:06:53 PM 
SBC ==> 5/23/2017 1:07:33 PM 
SBC ==> 5/23/2017 1:07:25 PM 
SBC ==> 5/23/2017 1:07:57 PM 
SBC ==> 5/23/2017 1:08:13 PM 

任何人都可以解釋爲什麼是這樣嗎?這對我有點困惑?

回答

2

雖然天藍色的服務總線將自身定義爲FIFO(先進先出),但只有在不間斷的會話期間纔有效。當你與經歷:

但是如果我保持連接的客戶端,郵件,以便

要解決這個問題,你可以用不同的方式接收。 在下面的鏈接中查看ReceiveAndDelete和PeekLock模式。

Service Bus Docs

這裏有一些相關的堆棧溢出的職位,可以幫助您。

How to accomplish FIFO with Azure service bus topics

How to gurantee azure queue FIFO

編輯

This link contains some details on the FIFO

下面是從該文件,指定你需要爲了得到FIFO使用消息會話的報價。

服務總線隊列中保證的FIFO模式需要使用消息傳遞會話。如果應用程序在處理Peek &鎖定模式下收到的消息時崩潰,則在隊列接收器下一次接受消息傳遞會話時,它將在其生存時間(TTL)期限過期後開始發送失敗消息。

文件似乎相當缺乏關於執行消息會話但是從我的理解是從MessageSession類,以及它的AcceptMessageSession方法

+0

感謝您的意見,請您參考MSDN上的一些文檔,其中「您遇到的問題是,當您斷開接收器時,超時的消息會在一段時間後開始重試。這會導致他們失去他們發送的訂單.'描述?這將是非常有幫助的。 –

+0

將添加到答案。 – NPhillips

+0

已經刪除了從問題中引用的部分,因爲無法爲其提供可靠來源。前一段時間我遇到過這個問題,那是我對這個問題的理解,但是我的話當然很重要,因爲沒有文檔可以支持它。 您可能會覺得這篇博文有用,但我懷疑它有點過時了: http://www.ben-morris.com/dont-assume-message-ordering-in-azure-service-bus/ – NPhillips

2

就像@NPhillips說,你需要使用的郵件會話功能ASB實現FIFO行爲。這意味着幾件事情,這是必須注意的:

  1. 接收器將只處理一個單個會話的時間
  2. 並行處理是不可能的,你會下降到每一次的任何一個消息它需要處理。
  3. 發件人需要爲每個郵件分配會話ID。

最好的樣本和解釋將由ASB團隊發佈在GitHub here上。

相關問題