[RABBITMQ] RPC 패턴과 pub/sub패턴에서의 ack 사용차이

기본적으로 noAck, durable 옵션으로 큐에서의 삭제와 ack의 사용을 조정할수있다.


1. Publish/Subscribe

로그를 쌓는 서비스를 예를 들어보면

보내는(pub)서버와 처리하는(subs)서버가 있겠다.

pub에서 메세지를 보내고 큐에 쌓인다. subs 서버는 이를 하나씩 꺼내어 처리한다.

큐에 보낸 메세지를 잃어 버리지 않기 위해서는 durable 옵션으로 큐를 생성하고

큐에 전송시 persistent 옵션을 주면된다.

그러면 rabbitmq가 죽더라고 큐에 들어간 내용들은 재기동시 다시 살아난다.

하지만 subs서버가 큐에서 꺼낸 메세지를 작업중 죽는다면 메세지는 소실된다.

이를 위해 consume함수 옵션(noAck)을 사용한다. 기본적으로 noAck를 하면 자동으로 ack가 실행되고

큐에서 사라진다. 하지만 noAck 옵션을 false로 선언하면 subs서버에서 작업을 처리한후 ack를 보내야한다.

pub/sub


2. RPC(req/res)

The RPC client must consume in no-ack mode.

This is because there is no queue for the reply message to be returned to

if the client disconnects or rejects the reply message.

RPC 클라이언트는 반드시 consume을 사용할 때 no-ack 모드를 사용해야한다.

클라이언트에서 연결이 끊기거나 reject 에러가 나면 서버에서 전달할 방법이 없기 때문이다.

reply queue는 요청시 생성되고 결과받고 사라지는 임시큐이다.

메세지가 유실되면 안되는 서비스의 처리는 별도로 처리하는 것이 맞겠다.

rpc

공유