본문으로 바로가기

basicReject vs basicNack

category 나의 주니어 개발 일기/RabbitMQ 2022. 12. 6. 00:53
728x90
반응형
SMALL

https://www.rabbitmq.com/nack.html

 

Negative Acknowledgements — RabbitMQ

Negative Acknowledgements Consumers in AMQP 0-9-1 can choose to use manual acknowledgements of deliveries. The AMQP 0-9-1 specification defines the basic.reject method that allows clients to reject individual, delivered messages, instructing the broker to

www.rabbitmq.com

스프링에서 @RabbitListener 어노테이션을 사용해서 consume 하는 코드가 있다.

보통 default 로 auto ack 신호가 rabbitmq 서버로 전송되기 때문에

자동으로 q의 메시지는 삭제된다.  그러나 문득 궁금하였다.

누군가가 consume 한 메시지를 받으면 ack, 못받으면 nack 할수 있는 방법이 있을까?

 

찾아보니 당연히 있었다.

 

 

위의 공식문서에도 나와있지만

reject 는 단일메시지에서 사용

nack 은 단일 또는 복수메시지에서 주로 사용한다.

 

nack 이 조금 더 extend 하다고 생각하면되며 주로 nack이 범용적으로 사용된다.

 

예제코드를 확인하자

   @RabbitListener(queues = "001")
    public void consume1(String message, Channel channel,
                       @Header(AmqpHeaders.DELIVERY_TAG)long tag) throws IOException {

        try {
            log.info("message {}",message);
        
            //거부하고 싶을땐 nack
            //reject과의 차이점은 reject은 단일데이터, nack은 단일 또는 복수 데이터를 다루며 nack이 좀더 extend한 버전임

            channel.basicNack(tag,false,true);
        }catch(Exception ex) {
            ex.printStackTrace();
            // handle exception
        }

    }

consume 속도는 2000/s 를 넘고 있는데 ack 메시지가 오고있지 않기 때문에 메시지를 없애지 않고 있다.

이를 이용하여 추후 누군가가 정확하게 메시지를 받았을때 basicAck 를 전송하는 코드만 추가 한다면 상대방이 받았을때 q의 메시지가 삭제될수 있게 핸들링 할수 있다.

728x90
반응형
LIST