1

azure用の2つのWebJobを開発しています.1つはトピックを使用してService Bus Queueにメッセージを入れ、もう1つはServiceBusTriggerに同じトピックを使用して購読します。Microsoft Azure Service Bus QueueがFIFOとして機能する

メッセージはサービスバスキューに正しく送信されますが、ServiceBusTriggerに登録されたWebJobを実行すると、これらのメッセージはFIFOベースで処理されません。

サービスバスキューにメッセージを入れるWebJobためのコードは以下の通りです:

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)); 
     } 
    } 
} 

:サービス・バスのトリガにsubscritedさ

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を次のコードを持っていますキューからメッセージをFIFOとして処理するにはどうすればよいですか?

ありがとうございます!

答えて

2

Azure Service Busは、FIFOのような機能を提供しようとする可能性がありますが、ブローカベースのキューイングシステムではこの種の動作を想定しないほうがよいでしょう。 Ben Morris氏は、非同期メッセージングを使用した注文がほぼ間違いであり、それが理由であるという事実について、良い投稿Don’t assume message ordering in Azure Service Busを持っていました。

+0

ありがとうございます!私がする必要があるのは、blobがコンテナにアップロードされているときにblobを処理することです。必要なものの1つは、ブロブに到着する順に処理する必要があるため、注文をサポートするように設定されているサービスバスキューに通知することで問題が解決されると考えました。 –

+0

ブロブがどのように到着するかによって、これを実現するカスタムロジックを構築することができます。ブロブが正しい順序で入っていることが分かっている場合は、代わりにブロブトリガーを使用しないでください。 –

0

SessionIdまたはPartitionKeyを使用すると、メッセージが同じメッセージブローカーによって確実に処理されます。

を参照してください:のSessionIdはhttps://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning

は「:メッセージがBrokeredMessage.SessionIdプロパティが設定されている場合は、Service Busは、パーティションキーとして、このプロパティを使用しています。この方法は、同じセッションに属するすべてのメッセージがによって処理されますこれにより、Service Busはメッセージの順序付けとセッション状態の一貫性を保証することができます。

関連する問題