1

我開發蔚藍2個WebJobs:這是訂閱使用同一主題的ServiceBusTrigger一個將使用主題可以將消息在服務總線隊列和另一個。微軟Azure服務總線隊列工作作爲FIFO

的消息被正確地發送到服務總線隊列,但是當運行訂閱的消息不被在FIFO基礎處理的ServiceBusTrigger的WebJob。

對於這使消息在服務總線隊列WebJob的代碼如下:

NamespaceManager namespaceManager = NamespaceManager.Create(); 

// Delete if exists 
if (namespaceManager.TopicExists("SampleTopic")) 
{ 
    namespaceManager.DeleteTopic("SampleTopic"); 
} 

TopicDescription td = new TopicDescription("SampleTopic"); 
td.SupportOrdering = true; 
TopicDescription myTopic = namespaceManager.CreateTopic(td); 

SubscriptionDescription myAuditSubscription = namespaceManager.CreateSubscription(myTopic.Path, "ImporterSubscription"); 

TopicClient topicClient = TopicClient.Create("SampleTopic"); 
for(int i = 1; i <= 10; i++) 
{ 
    var message = new BrokeredMessage("message"+i);     
    topicClient.Send(message); 
} 
topicClient.Close(); 

的WebJob其subscrited到服務總線觸發具有下面的代碼:

namespace HO.Importer.Azure.WebJob.TGZProcessor 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      JobHostConfiguration config = new JobHostConfiguration(); 
      config.UseServiceBus(); 
      JobHost host = new JobHost(config); 
      host.RunAndBlock(); 
     } 

     public static void WriteLog([ServiceBusTrigger("SampleTopic", "ImporterSubscription")] string message, 
      TextWriter logger) 
     {     
      Console.WriteLine(message)); 
     } 
    } 
} 

我怎樣才能實現從FIFO隊列中處理消息?

在此先感謝!

回答

2

雖然Azure的服務總線可以嘗試提供FIFO喜歡的功能,它是最好不要假定這種行爲與基於券商排隊系統。本莫里斯有一個很好的帖子Don’t assume message ordering in Azure Service Bus的事實,假設與異步消息傳遞幾乎是一個謬論和原因。

+0

謝謝!我需要做的是在上傳到容器時處理blob。其中一個必要條件是,它們需要按照到達blob的順序進行處理,所以我認爲通知設置爲支持排序的服務總線隊列可以解決問題。 –

+0

根據blob如何到達,您可以構建自定義邏輯來實現此目的。如果你確實知道blob順序存在,爲什麼不使用blob觸發器呢? –

0

使用SessionId或PartitionKey,這將確保消息由同一個消息代理處理。

參見:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning

「的SessionID:如果一個消息具有BrokeredMessage.SessionId屬性集,然後服務總線使用此屬性作爲分區鍵通過這種方式,屬於同一個會話的所有消息都被處理同一個消息代理,這使服務總線能夠保證消息順序以及會話狀態的一致性。「

相關問題