추가로 정리 중

RabbitMQ Message Queue 및 Message 보존 설정

Queue 생성시 Durable 설정

RabbitMQ server가 종료 후 재기동하면, 기본적으로 Queue는 모두 제거되게 된다. 이를 막기 위해서는 Queue를 생성할 때 Durable 옵션을 True로 설정하여야 하며, 메시지의 경우 PERSISTENT_TEXT_PLAIN 옵션을 주어야 Message가 보존된다.

MessageProperties.PERSISTENT_TEXT_PLAIN 

추가적으로 Queue에 있는 Message를 보존하는 속성으로 delivery-mode라는 것이 존재하는데, 기본 값은 1으로 메모리에서 메시지를 관리하는 상태가 되며, 2로 설정할 경우 RabbitMQ가 디스크에 메시지를 영속화시킨다. 

 

금융 거래 이벤트와 같이 비즈니스와 밀접하게 연관된 지속성 메시지와 로그인 이벤트와 같이 비즈니스에 영향을 주지 않는 비지속성 메시지를 구분하여 값을 설정한다.

 

 

 

RabbitMQ Message 손실 방지 설정

RabbMQ는 Consumer에게 전달된 Message의 손실을 방지하기 위한 기능을 제공한다. 이 속성은 기본적으로 활성화 되어 있고, RabbitMQ는 메시지에 대한 응답(작업 처리)을 전달받지 못한다면 다시 Queue에 집어넣고 다른 worker에게 전송할 수 있다.

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

 

 

 

Message dispatch?

RabbitMQ dispatch 방법은 기본적으로 round robin 방식이며 MessageQueue에 담는 순서대로 worker들에게 전달한다.

균등한 메세지 처리 가 필요한 상황에선 위 방식으로 충분할 수 있으나 worker들이 메시지 중 특정 순서로 오랜 처리 시간이 필요한 상황 등의 특정한 경우 알맞지 않을 수 있다.

Prefectch Count none : 하나의 Worker의 작업이 지연되고 있다.

이런 경우 순차적으로 메세지를 제공받더라도 처리 시간으로 인해 다른 worker는 쉬는 상태에서 무거운 작업을 처리하는 worker에게 지속적으로 message가 전달되는 문제가 발생한다.

 

 

 

Fair dispatch 하도록 설정하기 : Prefetch Count

Prefetch Count는 Consumer에게 보내는 메시지 수를 지정하는 데 사용하는 옵션이며, 요청을 처리했음을 의미하는 Ack가 RabbitMQ에 전달되기 전까지 consumer가 전달받을 수 있는 message의 개수이다.

 

기본 설정 값은 클라이언트에게 크기 제한이 없는 버퍼를 제공하며, 기본적으로 요청을 받을 수 있는 Consumer에게 최대한 많은 메시지를 전달한다.

Prefectch Count 1

  • 전송된 메시지는 클라이언트의 클라이언트에 존재하는 Prefetch Buffer에 캐시 된다.
  • Prefetch 된 메시지는 Message Queue의 대기열에서 제거되고 다른 Consumer에게 표시되지 않는다.

rabbit.default_consumer_prefetch

 

 

 

Prefetch Count에 따른 성능 조정

1개로 설정해 두는 경우 (작을 수록 Fair Dispatch 하다.)

  • 하나의 메시지가 처리되기 전에는 새로운 메시지를 받지 않게 되므로, 여러 worker에게 동시에 작업을 분산시킬 수 있지만 여러 worker가 포함되어 있으나 각 단위 요청이 빨리 처리되는 상황에서는 각 worker의 다음 작업까지 대기시간이 증가할 수 있다.
  • worker가 많거나 한 작업 단위의 처리 시간이 긴 경우 모든 worker에게 균등하게 나눠지도록 값을 작게 설정하는 것이 좋다.

 

값을 크게 해 둘 경우

  • 메시지 큐에서 다량의 메시지를 하나의 worker에게 전달하여 Buffer에 요청을 쌓고 계속 처리할 수 있도록 하기에 각 worker 대기 시간은 감소할 수 있지만 특정 요청의 처리 시간이 긴 경우에 다른 worker들이 일을 하지 않고 대기하는 상황이 발생할 수 있다.
  • worker가 적고 한 작업 단위의 처리 시간이 짧은 경우 값을 크게 설정할 수 있다.

 

 

참고 자료

추가로 정리 중

 

AMQP Frame Structure

AMQP Spec에서는 객체 지향 개념과 유사하게 Class와 Method라는 것을 사용하여 AMQP Command를 정의한다.

  • Class는 기능의 범위를 정의한다.
  • Method는 각 Class 내부에서 서로 다른 작업을 수행하는 작업 단위이다.
// example) Connection.Start
{class}.{method}

basic class : (메시지의 송신, 수신, 대기열의 접근, 클라이언트의 종료, 시작, 거부 등)

channel class : (채널 생성, 종료, 중지)

exchange class : (분기 설정, 생성, 삭제, 연결 등) 

queue class : (메시지 큐 생성, 삭제, 설정, 해제 등)

tx class : (트랜잭션 커밋, 롤백, 모드 설정 등)

 

 

 

AMQP Component

AMQP Spec에서 명령을 전송하거나 수신할 때 필요한 모든 인자들은 캡슐화되어 있는 Frame으로 Encoding 되어 전송된다.

  • Frame은 각각의 명령과 인자를 Encoding하여 각각 구분되어 관리하는 하나의 단위이다.
    • 이를 통해 여러가지 요청을 효율적으로 구분한다.
  • Frame의 기본 크기는 131KB이며 연결 과정 중에 32비트로 표현할 수 있는 범위 내에서 최대 크기를 서버와 협상한다.

 

저수준의 AMQP 프레임은 다섯 개의 별개 구성 요소를 지닌다.

  • Frame Type : 1Byte
  • Channel Number
  • Frame Size : size → Byte
  • Frame Payload
  • end byte marker : ASCII 206
  Frame Header  ||               Frame Payload              ||  
[ 1 ][ 0 ][ 335 ][ Frame Payload : Type 별로 Data가 다르다. ][ 0xce ]

Frame Payload는 각각의 Frame 간에 운반하는 내용을 무결성 있게 보호하도록 감싸게 설계되었다.

 

 

 

AMQP Frame Types

 

Protocol Header Frame

  • RabbitMQ Connection을 연결할 때 한 번만 사용되는 Frame
  • Client Library를 사용할 때 추상화되어 있는 Frame

 

Method Frame

  • RabbitMQ와 서로 주고받는 RPC 요청과 응답을 전달하는 Frame
  • Exchange, Routing key를 포함하여 전송한다.
  • data size를 최소화하기 위해 이진 데이터로 구성한다.

 

Content Header Frame

  • Message Size와 Message Property를 포함하는 Frame.
  • data size를 최소화하기 위해 이진 데이터로 구성한다.

 

Body Frame

  • Message Content를 포함하는 Frame
  • AMQP Spec에서는 Max Frame size가 지정되어 있으며, 이 크기를 초과하면 Body Frame을 여러 단위로 분할시킨다.
  • JPEG, JSON, XML, Text, Binary 형식으로 직렬 화한 데이터를 전송 가능하다.

 

Heartbeat Frame

  • Client와 Server가 주고받으며 서로 사용 가능한 상태인지 파악하는 것
  • RabbitMQ는 Client에게 해당 Frame을 보내며, 응답하지 않는 경우 연결을 끊는다.
    • 단일 쓰레드, 비동기 환경에서는 제한 시간을 약간 큰 값으로 늘린다.
    • 하트비트가 동작하기 어려운 상황의 경우 0으로 설정하여 disable 한다.
  • Client Library를 사용할 때 추상화되어 있는 Frame

 

 

RabbitMQ Message publishing

RabbitMQ에서 Message를 Publishing 할 때에는 Method, Header, Body Frame을 사용한다.

 

 

Publishing flow

  1. Method Frame
  2. Content Header Frame
  3. 1개 이상의 Body Frame

 

 

참고 자료

+ Recent posts