Skip to content

[RabbitMQ] Message durability(메시지 잃어버리지 않기 : durable=true, props=PERSISTENT_TEXT_PLAIN) -2

2012/01/26

Message durability

지난 포스트에서는 Consumer가 message는 queue에서 정상적으로 받았지만 처리를 완료하기 전에 비정상적으로 종료되었을 경우를 대비해서 ack를 이용해 정상 처리된 message만 queue에서 삭제되도록 처리하는 방법에 대해 정리했습니다.

하지만 만약  Consumer에 의해 처리를 기달리고 있는 message를 가지고 있는 queue(RabbitMQ Server)가 어떤 이상으로 인해 갑자기 죽거나 restart 할때 결국 message는 유실이 생기게 됩니다.

그리고 이를 방지하기 위해서는 다음과 같이 간단한 옵션값 조정을 통해 message를 유지할 수 있습니다.

1. 우선 channel에 queue를 만들때 지속성을 부여하여 해당 queue를 계속 기억하여 RabbitMQ Server가 재시작하더라도 같은 queue를 만들도록 설정합니다.

channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null); //queue를 선언할때 durable=true로 설정해 준다.

Tip 1. 만약 Produser나 Consumer에서 이미 queue를 durable=false로 설정한 상태로 시작한 후에는 true로 바꾸기 위해서는 RabbitMQ Server를 다시 시작하고 queue를 다시 만들어야 합니다.  Server를 다시 시작하지 않고 Produser나 Consumer만 true로 바꾼후에 실행시키면 다음과 같은 error가 납니다.

=ERROR REPORT==== 26-Jan-2012::10:30:45 ===
connection <0.1925.0> (running), channel 1 - error:
{amqp_error,precondition_failed,
            "parameters for queue 'hello' in vhost '/' not equivalent",
            'queue.declare'}

만약 서버를 다시 시작하고 싶지 않다면 다른 이름의 queue를 만들면 됩니다.

2. 1번을 적용후 queue에는 지속성을 부여하여 restart 후에도 유지되지만 message 개수는 0으로 초기화 됩니다. 즉, 추가로 Produser에서 publish 할때 message 에 대해서도 persistent 속성을 부여해야 합니다.

channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

여기 까지 모두 적용을 완료한다면 Consumer가 죽거나 RabbitMQ Server가 죽더라도 Produser가 보낸 message에 대한 유실을 막을 수 있습니다.

물론, RabbitMQ Server가 죽어 있는 동안에는 Produser에서 publish 할려고 했던 message에 대해서는 각자 서비스에서 예외 처리를 해야합니다.

No comments yet

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: