Azure Service Bus 메시지 중복 처리

Azure Service Bus를 사용하여 메시지 중복을 처리하는 방법에 대해 알아봅니다. 특히, ReceiveAndDelete와 PeekLock 수신 모드의 차이점과 각각의 특징을 설명합니다.

메시지 수신 모드

  1. ReceiveAndDelete: 이 모드에서는 메시지를 한 번만 읽고 즉시 삭제합니다. 이 방식은 간단하지만, 애플리케이션이 중간에 실패하면 해당 메시지는 영구적으로 손실될 수 있습니다.

  2. PeekLock: 기본 설정인 이 모드는 두 단계로 이루어진 수신 과정을 통해 메시지를 안전하게 처리할 수 있게 합니다. 먼저 메시지를 잠그고, 애플리케이션이 이를 처리한 후 Complete 메서드를 호출하여 최종적으로 메시지를 제거합니다. 만약 애플리케이션이 메시지를 처리하지 못하면 Abandon 메서드를 호출하여 다른 수신자가 다시 처리할 수 있도록 할 수 있습니다.

public static void SendMessageTwice()
{
    var busUtil = new AzureBusUtility();
    busUtil.CreateQueue("OrderQueue");

    var orderQueueClient = busUtil.GetQueueClient("OrderQueue");
    var order = CreateOrder(1);
    var msg = busUtil.CreateMessage(order);

    // 동일한 메시지를 두 번 보내는 것은 허용되지 않음
    orderQueueClient.SendMessage(msg);
    orderQueueClient.SendMessage(new AzureBusMessage(msg.Body) { MessageId = msg.MessageId });
    
    Console.WriteLine("메시지 전송 완료!");
}

동일한 BrokeredMessage 객체를 여러 번 보내는 것은 지원되지 않으므로, 새로운 인스턴스를 생성해야 합니다. 메시지 고유성은 MessageId로 결정됩니다.

PeekLock 모드에서의 중복 수신

다음은 PeekLock 모드에서 동일한 메시지를 여러 수신자가 어떻게 처리하는지 보여주는 예제입니다:

public static void ProcessMessages()
{
    var busUtil = new AzureBusUtility();
    var receiver1 = busUtil.GetReceiver("OrderQueue", ReceiverMode.PeekLock);
    var receiver2 = busUtil.GetReceiver("OrderQueue", ReceiverMode.PeekLock);

    var msg1 = receiver1.Peek();
    Console.WriteLine($"첫 번째 수신자: {msg1.MessageId}");

    var msg2 = receiver2.Receive();
    Console.WriteLine($"두 번째 수신자: {msg2.MessageId}");
    msg2.Complete();

    Console.WriteLine("수신 완료!");
}

첫 번째 수신자는 메시지를 조회만 하고, 두 번째 수신자는 메시지를 실제로 처리하고 Complete을 호출합니다. 이렇게 하면 첫 번째 수신자가 메시지를 완료하지 않았을 때에도 두 번째 수신자가 같은 메시지를 받을 수 있습니다.

태그: Azure ServiceBus 메시지큐 중복처리 PeekLock

5월 22일 21:54에 게시됨