강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

jhj13062004님의 프로필 이미지
jhj13062004

작성한 질문수

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

16.DeadLetterQueue를 이용한 재처리

DLQ 관련 질문

해결된 질문

작성

·

48

·

수정됨

0

image.png

위와 같이 로그가 찍혔으면,

DLQ에서 ack 상태가 되어야하는것 아닐까요?

@RabbitListener(queues = RabbitMQConfig.DLQ)
public void process(String message) {
    System.out.println("DLQ Message Received: " + message);

    try {
        String fixMessage = "success";

        rabbitTemplate.convertAndSend(
                RabbitMQConfig.ORDER_EXCHANGE,
                "order.completed.shipping",
                fixMessage
        );
        System.out.println("DLQ Message Sent: " + fixMessage);
    } catch (Exception e) {
        System.err.println("### [DLQ Consumer Error] " + e.getMessage());
    }
}

위의 코드인 경우 AUTO 모드로 동작해서 자동으로 DLQ에서 처리가 되면 ACK 을 받을 것이라 생각했는데, DLQ에서 unack 상태로 남아있어서 여쭤봅니다!
이후에 애플리케이션을 종료하면 DLQ에서는 다시 ready 상태가 되고, 애플리케이션을 실행하면 이를 실행하고

image.png

와 같이 로그가 찍힌 다음에 다시 unack 상태가 됩니다.

좋은 강의 감사드립니다 :)

답변 2

0

코드빌런님의 프로필 이미지
코드빌런
지식공유자

안녕하세요. 수강자님 auto 모드일때 미처리 (에러든 예외든) 된 상태는 unacked 가 맞습니다. DLQ도 어쨋든 큐이기 때문에 단순히 DLQ로 이동한 것만으로는 처리가 됐다고 보기 어렵고 컨슈머가 재 처리 해주어야 합니다.

 

다시 정상 처리 되었다면 ack 가 되어야 합니다.

ack가 되지 않았다면 정상적으로 처리가 안됐다는 뜻이므로 consumer를 다시 점검해야 합니다.
실제 처리 한건지 안한건지 코드에서 로그 등으로 확인해보고 MANUAL 모드에서 직접 채널에 basicAck, basicNack 으로 확인해시면 좀 더 이해가 빨리 되실겁니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. jhj13062004님.

Dead Letter Queue(DLQ) 관련하여 메시지의 unack 상태에 대한 질문을 다루어보겠습니다.

DLQ에서의 ack 처리

  1. Spring AMQP의 기본적인 동작:

    • Spring AMQP에서 @RabbitListener 어노테이션을 사용할 때, 기본 설정은 AUTO 모드입니다. 이는 메시지를 성공적으로 처리하면 Spring이 자동으로 ACK를 전송하여 메시지가 정상 처리되었음을 RabbitMQ에게 알리는 설정입니다.
  2. unack 상태의 가능성:

    • 메시지가 처리된 이후에도 unack 상태로 남아있는 경우, 메시지 처리 중 예외 발생, 네트워크 문제, 연결 문제 등 다양한 문제가 원인이 될 수 있습니다.
    • 코드 내에서 메시지를 발행한 후 반드시 ACK가 보내졌는지 확인해야 합니다. 예외 발생 시 catch 블록을 통해 이를 로깅하고 추가적으로 리트라이 로직 등을 추가할 수 있습니다.
  3. 해결 방안:

    • unack 상태로 남지 않게 하려면 manualAck 모드를 활용하여 소비자가 메시지를 수동으로 ack, nack 처리하도록 설정할 수 있습니다. 이를 통해 처리 완료 시 명시적으로 ack 메시지를 보낼 수 있습니다.
    • 설정 코드에서는 AcknowledgeMode.MANUAL을 설정하고 Channel 객체를 통해 channel.basicAck() 메소드를 사용하여 수동으로 ack 하는 방법을 고려해 보세요.

결론적으로, 비정상적인 메시지 소비 상황을 철저히 로그하고, 상황에 따라 수동 ack 설정을 사용해 보시는 것을 권장합니다. 이를 통해 메시지가 unack 상태로 남는 현상을 방지할 수 있습니다.

아래 추가로 도움이 될 만한 관련 질문 링크를 참조하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jhj13062004님의 프로필 이미지
jhj13062004

작성한 질문수

질문하기