[英]Azure Service Bus Topic Subscriber receiving order
我正在使用azure服務總線主題作為解決方案的消息代理。 據我了解,對於每個訂閱,Azure消息總線都會保留一個虛擬隊列 ,因此在接收消息的結束順序時不應受到干擾。
但實際上有點不同,在我的情況下
接收碼
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
有人可以解釋為什么嗎? 這讓我有點困惑?
雖然天藍色服務總線將其自身作為FIFO(先進先出)提供,但實際上僅在不中斷的會話期間有效。 如您所經歷的:
但是,如果我保持客戶端連接狀態,則會按順序接收消息
要解決此問題,您可以使用其他模式。 在下面的鏈接中查看ReceiveAndDelete和PeekLock模式。
這是一些相關的堆棧溢出文章,可能會對您有所幫助。
編輯
以下是該文檔的引文,該引文指定您需要使用消息傳遞會話才能獲得FIFO。
服務總線隊列中有保證的FIFO模式需要使用消息傳遞會話。 如果應用程序在處理以“偷窺和鎖定”方式接收的消息時崩潰,則隊列接收者下一次接受消息傳遞會話時,將在其生存時間(TTL)期限到期后從失敗的消息開始。
在實現消息會話方面,文檔似乎相當缺乏,但據我了解,它來自MessageSession
類,它是AcceptMessageSession
方法。
就像@NPhillips所說的那樣,您需要使用ASB的Message Sessions功能來實現FIFO行為。 這意味着幾件事,需要注意:
最好的樣本和解釋將是一個張貼由ASB團隊在GitHub上這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.