RabbitMQ Java Client 라이브러리의 Channel 인터페이스

RabbitMQ 튜토리얼을 보면 여섯 가지 전송 방식에 대해 설명하고 있습니다.

  1. Simple (“Hello World!”)
  2. Work queues
  3. Publish/Subscribe
  4. Routing
  5. Topics
  6. RPC

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

각각의 동작에 대해서는 튜토리얼에 자세히 설명되어 있으며 쉽게 이해할 수 있도록 그림으로 표현되어 있습니다.

위의 여섯 가지 전송 방식에 대한 Java Client 샘플 코드를 비교해 보면 com.rabbitmq.client.Channel 인터페이스의 queueDeclare 메서드와 basicPublish 메서드를 어떻게 설정하는지에 따라 다른 방식으로 동작하는 것으로 보입니다. 따라서 두 메서드에 대해 상세히 알아보고자 합니다.

https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Channel.html

먼저 queueDeclare 메서드를 살펴보겠습니다.

AMQP.Queue.DeclareOk queueDeclare()
                           throws IOException

AMQP.Queue.DeclareOk queueDeclare(String queue,
                                  boolean durable,
                                  boolean exclusive,
                                  boolean autoDelete,
                                  Map<String,Object> arguments)
                           throws IOException

이름 그대로 큐를 선언하는 메서드입니다. 각 파라미터를 알아보겠습니다.

  • queue: 큐의 이름
  • durable: 서버 재시작에도 살아남을 튼튼한(?) 큐로 선언할 것인지 여부
  • exclusive: 현재의 연결에 한정되는 배타적인 큐로 선언할 것인지 여부
  • autoDelete: 사용되지 않을 때 서버에 의해 자동 삭제되는 큐로 선언할 것인지 여부
  • arguments: 큐를 구성하는 다른 속성

파라미터 없이 queueDeclare 메서드를 사용하면, 서버에 의해 명명된 배타적이고 자동 삭제되며 튼튼하지 않은 큐(server-named exclusive, autodelete, non-durable queue)로 선언됩니다.

 queuedurableexclusiveautoDelete
Simple"hello"falsefalsefalse
Work queues"task_queue"truefalsefalse
Publish/Subscribe
(Receiver)
server-namedfalsetruetrue
Routing
(Receiver)
server-namedfalsetruetrue
Topics
(Receiver)
server-namedfalsetruetrue
RPC
(Client)
server-namedfalsetruetrue
RPC
(Server)
"rpc_queue"falsefalsefalse

전송 방식에 따라 파라미터가 어떻게 달라지는지 비교하기 위해 표로 만들어 보았습니다. 표를 만들다 보니 queueDeclare 메서드를 파라미터 없이 사용하거나 queueDeclare 메서드 없이 exchangeDeclare 메서드를 사용하는 경우가 있었습니다.

exchangeDeclare 메서드를 살펴보겠습니다. 8가지 메서드가 있지만 샘플 코드에 있는 한 가지만 살펴보겠습니다.

AMQP.Exchange.DeclareOk exchangeDeclare(String exchange,
                                        String type)
                                 throws IOException

다른 속성 없이 자동 삭제되지 않고 튼튼하지 않은 거래소(non-autodelete, non-durable exchange with no extra arguments)를 선언하는 메서드입니다.

  • exchange: 거래소의 이름
  • type: 거래소 유형
 exchangetype
Publish/Subscribe"logs""fanout"
Routing"direct_logs""direct"
Topics"topic_logs""topic"

다음은 basicPublish 메서드를 살펴보겠습니다.

void basicPublish(String exchange,
                  String routingKey,
                  AMQP.BasicProperties props,
                  byte[] body)
           throws IOException

void basicPublish(String exchange,
                  String routingKey,
                  boolean mandatory,
                  AMQP.BasicProperties props,
                  byte[] body)
           throws IOException

void basicPublish(String exchange,
                  String routingKey,
                  boolean mandatory,
                  boolean immediate,
                  AMQP.BasicProperties props,
                  byte[] body)
           throws IOException

메시지를 발행(Publish)하는 메서드입니다. 세 가지 메서드 중 가장 많은 파라미터를 포함하고 있는 마지막 메서드의 파라미터에 대해 알아보겠습니다.

  • exchange: 메시지를 발행하는 거래소(?)
  • routingKey: 라우팅 키
  • mandatory: 필수(mandatory) 여부
  • immediate: 즉시(immediate) 여부 (RabbitMQ Server 미지원)
  • props: 라우팅 헤더 등 메시지의 다른 속성들
  • body: 메시지 본문
 exchangeroutingKeyprops
Simple"""hello"null
Work queues"""task_queue"MessageProperties
.PERSISTENT_TEXT_PLAIN
Publish/Subscribe"logs"""null
Routing"direct_logs""info"
"warning"
"error"
null
Topics"topic_logs""anonymous.info"
사용자 파라미터
null
RPC (Client)"""rpc_queue"new AMQP
.BasicProperties
.Builder()
.correlationId(corrId)
.replyTo(replyQueueName)
.build()
RPC (Server)""properties.getReplyTo()new AMQP
.BasicProperties
.Builder()
.correlationId(properties
.getCorrelationId())
.build()

정리를 하고자 정리를 하였으나 정리가 되지 않고 궁금증만 더 생기게 되었습니다. 장님 코끼리 만지듯 일부분만 건드려 보았습니다. 언제쯤 코끼리의 전체를 알 수 있게 될지 모르겠습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *