본문 바로가기

개발

AMQP 프로토콜의 메시지 소비 과정

AMQP 프로토콜 사용하기

메시지를 발행을 실제로 실행하기 전에 다음과 같은 설정 단계를 거친다.

  1. Connection negotiation 과정
  2. 익스체인지 선언하기
  3. 큐 선언하기
  4. 큐와 익스체인지 연결하기
  5. RabbitMQ에 메시지 발행하기
  6. RabbitMQ에 메시지 소비하기

1. 클라이언트와 RabbitMq가 통신할때 형식을 정의하는 Connection negotiation 과정

  • 클라이언트 라이브러리는 amqp 프로토콜의 복잡한 통신 절차를 숨기고 있다
  • 라이브러리는 이런 동작을 신경쓰지 않을 수 있다는 것에 장점이 있다
  • rabbitmq와 첫번째 연결을 맺기 위해 클라이언트가 취해야 하는 단계를 알아보자.

  • rabbitmq는 코어서버와 통신하는 모든 부분에서 RPC(remote procedure call) 패턴으로 통신한다.
    • rabbitmq와 통신할 떄 발생하는 rpc는 일반적인 웹 기반 api와는 다르다.
    • amqp 스펙은 서버 클라이언트 모두 명령을 실행할 수 있다.
  1. amqp 통신을 시작할때 프로토콜 헤더를 클라이언트가 서버로 전송한다. (클라 -> 서버)
  2. 클라이언트 요청을 받은 rabbitmq는 Connection.start 명령으로 응답해 명령/응답 흐름을 시작한다.(서버)
  3. 클라이언트는 Connection.startOk 응답 프레임으로 RPC 요청에 응답한다. (서버 -> 클라)
  • 이 과정을 마치면 RabbitMq는 애플리케이션의 요청을 받을 준비를 마치게 된다.

2. 익스체인지 선언하기

  1. 클라이언트가 Exchange.Declare 명령을 전송하면 rabbitmq는 익스체인지를 생성한다.(클라 -> 서버)
    • Exchange.Declare 명령에 Exchange 이름과 유형을 사용해서 Exchange를 생성한다.
  2. Exchange.DeclareOk 메소드 프레임을 응답으로 전송한다.(서버 -> 클라)
    • 어떤 이유때문에 Exchange.Declare 명령이 실패하면, 실패한 이유가 들어가 있는 응답 코드와 텍스트 값을
      Channel.close 명령에 포함시켜 전송하고 Exchange.Declare 명령이 전송된 채널을 닫는다. (클라 -> 서버)

3. 큐 선언하기

  1. 익스체인지를 생성한 후 rabbitmq에 Queue.declare 명령을 보내 큐를 생성한다.(클라 -> 서버)
  2. Exchange.Declare 명령과 유사한 통신 정차로 진행됨.
  • Queue.declare 명령이 실패하면 채널이 닫힌다.

4. 큐와 익스체인지 연결하기

  1. 큐가 선언되었으면, 익스체인지와 큐를 연결해야 한다.
    • 큐를 익스체인지에 연결하는 명령인 Queue.bind는 한 번에 하나의 큐만 지정한다.
  2. 클라이언트는 서버에 Queue.bind 명령을 내린다(클라 -> 서버)
  3. 성공시 Queue.BinkOk 명령을 응답 값으로 반환한다(서버 -> 클라)

5. RabbitMQ에 메시지 발행하기

  1. RabbitMQ에 메시지를 발행할 때 여러 종류의 프레임을 전송한다.(클라 -> 서버)
  2. RabbitMQ는 프레임을 수신한 후에 받은 프레임에 포함된 필요한 정보를 검증한다.(서버)
    • 받은 프레임에는 Basic.Publish 라는 메소드 프레임이 포함되어 있다.
    • Basic.Publish 에는 익스체인지 이름과 라우팅 키가 들어가 있는데 이 값을 Exchange 이름을 저장한 db와 비교한다.
  3. 일치하는 Exchange를 발견한 후에 Exchange는 내부 Binding들을 평가하며 라우팅 키와 일치하는 큐를 찾음
  4. 익스체인지에 연결된 큐와 일치하면 FIFO 순서로 메시지를 큐에 삽입한다.
    • 실제 메시지를 저장하는것이 아니라 참조가 큐에 추가된다.
    • 참조만 저장되어서 실제 메모리를 적게 사용하게 된다.
    • 메시지가 만료되거나 제거 될 때, 다른 큐의 메시지 처리에 영향을 주지 않는다.

6. RabbitMQ에 메시지 소비하기

  1. 메시지를 소비하기 위해 애플리케이션은 Basic.Consume명령을 실행해서 RabbitMQ 큐를 구독한다.(클라 -> 서버)
  2. Basic.ConsumeOk로 응답해 클라이언트가 메시지를 받을 준비 하도록 알린다. (서버 -> 클라)
  3. 소비자가 응답을 받을때 Basic.Deliver 메소드 프레임, 헤더프레임, 바디프레임으로 메시지를 전달받는다.
  4. Basic.Consume이 발급되면 Basic.Cancle 명령을 발행하기 전까지 활성 상태를 유지한다.
    • 이때 메시지를 발행하는 명령이 비동기적으로 실행된다.



  • 메시지를 소비할 때 소비자의 수신 방식을 알 수 있다.
  • Basic.Consume에 no_ack로 알 수 있음.
    • true : 소비자가 Basic.Cancle 명령을 보내거나 연결을 끊을 때까지 계속 메시지를 보낸다.(수신 신경 안 씀)
    • false : 소비자는 Basic.Ack RPC 요청을 전송해 수신한 각 메시지를 확인해야 함. (수신 신경 씀)
반응형