1

azure 용으로 두 개의 WebJob을 개발 중입니다. 하나는 주제를 사용하여 서비스 버스 대기열에 메시지를 넣고 다른 하나는 동일한 주제를 사용하여 ServiceBusTrigger에 가입합니다.FIFO로 작동하는 Microsoft Azure 서비스 버스 대기열

메시지는 서비스 버스 대기열로 올바르게 보내지 만 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에 도착할 때 순서대로 처리해야하기 때문에 순서를 지원하도록 설정된 서비스 버스 대기열에 알리는 것이 문제를 해결할 것이라고 생각했습니다. –

+0

얼룩이 어떻게 도착 하느냐에 따라,이를 달성하기 위해 커스텀 로직을 만들 수 있습니다. blob이 순서대로 오는지 확실하다면 blob 트리거를 사용하지 않는 것이 어떻습니까? –

0

SessionId 또는 PartitionKey를 사용하면 메시지가 동일한 메시지 브로커에서 처리됩니다.

참조 : https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning

는 "세션 ID는 :. 메시지가 BrokeredMessage.SessionId 속성 집합이있는 경우, 서비스 버스는 파티션 키 등이 속성을 사용하여 이러한 방법으로, 동일한 세션에 속하는 모든 메시지가 처리됩니다 동일한 메시지 브로커를 사용하면 서비스 버스가 세션 순서의 일관성은 물론 메시지 순서를 보장 할 수 있습니다. "

관련 문제