구축 & 운영/RabbitMQ

RabbitMQ - 메시지 속성

단칸이 2022. 3. 19. 13:06

메시지의 주요 속성

컨텐츠 헤더 프레임에 사용할 수 있는 메시지 속성은 다음과 같습니다.

구분 설명
content-type 소비자에게 메시지 본문을 해석하는 방법을 전달합니다.
content-encoding 메시지 본문의 압축 방법이나 인코딩 방법 전달합니다.
message-id
correlation-id
메시지와 메시지 응답을 고유하게 식별해 메시지를 추적하는 데 이용합니다.
timestamp 메시지 크기를 줄이고 메시지 생성 시점에 대한 표준 시간을 전달합니다.
expiration 메시지의 만료를 전달합니다.
delivery-mode 큐에 메시지를 추가할 때 메모리에 저장할지 / 디스크에 먼저 저장할지 설정합니다.
app-id
user-id
문제가 발생한 발행자 어플리케이션을 추적하는데 사용합니다.
type 발행자와 소비자 사이의 계약을 정의하는 데 사용합니다.
 * 계약(contract) : 메시지의 포맷과 내용으로, API와 같이 사전 정의된 사양을 설명하는 데 사용 (메시지의 메타데이터)
reply-to 패턴을 값으로 전달해 응답 메시지를 라우팅할 때 사용합니다.
headers RabbitMQ에 메시지를 발행할 때, 사용자 정의 형식의 속성을 정의하는 데 사용합니다.
cluster-id AMQP 0-8부터 사용을 권장하지 않습니다.

content-type

HTTP 스펙의 content-type과 같이 메시지 본문의 MIME 유형을 전달합니다. 예를 들어 JSON 포맷인 경우 ‘application/json’ 이 될 수 있습니다.

content-encoding

서버에서 웹 페이지를 gzip으로 압축하고 브라우저가 렌더링하기 전에 압축을 푸는 것과 마찬가지로, 발행자는 메시지를 발행하기 전에 압축하고 소비자로부터 메시지를 전달받아 압축을 풀 수 있습니다.

운영 환경에서는 발행자와 소비자의 메시지 계약을 운영 중에 변경하지 않는 것이 바람직합니다. 그러나 메시지 크기가 어플리케이션의 전체 성능이나 안정성에 영향을 미쳐 본문 인코딩의 변경이 불가피한 경우 이 헤더를 사용할 수 있습니다.

일부 AMQP 클라이언트는 자동으로 이 값을 UTF-8로 설정하는데, 이는 잘못된 사용입니다. AMQP 스펙에 content-encodingMIME 컨텐츠 인코딩을 저장하기 위한 것이라고 명시되어 있으며, 이는 content-type을 넘어서 인코딩 수준을 나타내는데 사용하도록 규정되어 있습니다.

message-id, correlation-id

AMQP 스펙에서 이 헤더는 어플리케이션 용도로 지정되어 있으며, 공식적으로 정의된 동작은 없으므로 어플리케이션에서 원하는 용도로 자유롭게 사용하면 됩니다. 이 값은 최대 255바이트의 UTF-8 인코딩된 값을 가질 수 있습니다.

timestamp

이 항목도 어플리케이션 용도로 지정되어 있습니다.

어플리케이션에서 이 속성을 사용할 필요가 없더라도, RabbitMQ를 통한 메시지 흐름에서 예상치 못한 동작을 진단하려고 할 때 이 속성을 활용할 수 있습니다.

프로세스가 시행해야 하는 서비스 수준 계약이 있다면, 소비자 어플리케이션에서 이 속성을 평가해 메시지의 처리여부를 결정하거나 메시지의 수명이 지정한 값을 초과한 경우 모니터링 애플리케이션에 경고 메시지를 발행하도록 활용할 수 있습니다.

expiration

RabbitMQ에서 소비되지 않은 메시지를 버려야 할 때를 파악하는 데 사용합니다. (AMQP 스펙 0-8, 0-9-1 버전에 모두 존재하지만, RabbitMQ 3.0 버전 이전에는 지원하지 않았던 항목입니다.)

이 항목은 유닉스 시간을 값으로 갖지만, 타입은 255자의 문자열인 것이 특징입니다. 이로 인해 RabbitMQ에서 이 속성을 사용해 메시지를 자동으로 만료 처리하려면 유닉스 시간 또는 정수 기반 timestamp를 값으로 가져야 하는데, 타입이 문자열인 점에 유의합니다. , “2002-02-20T00 : 00 : 00-00”과 같이 ISO-8601 형식의 타임스탬프를 저장하는 대신 문자열 값인 “1329696000” 형태로 설정해야 합니다.

이 외에 RabbitMQ는 큐를 선언할 때 x-message-ttl 속성을 인자로 전달해서 메시지를 만료할 수 있는데, 이건 밀리세컨드 정밀도(유닉스 시간 * 1000)의 정수로 값을 설정해서 사용합니다.

delivery-mode

메시지가 저장될 위치를 결정하는 값으로, '1'은 메모리 / '2'는 디스크에 저장합니다.

예를 들어 로그인 이벤트가 없어진다고 해서 비즈니스가 위험에 빠지지는 않으므로 이 이벤트를 메모리에만 보관하는 것이 합리적일 수 있습니다. 반면, 메시지 처리량보다 정확한 전달에 초점을 맞춘다면 디스크 기반 큐에 저장하는 것이 적합한 선택일 수 있습니다.

app-id

이 속성을 이용해서 api 버전을 전달할 수도 있으며, 메시지를 처리하기 전에 app-id를 검사해서 알 수 없거나 지원하지 않는 출처의 메시지인 경우 어플리케이션에서 메시지를 삭제하는 등으로 활용할 수 있습니다.

또한, 이벤트를 발생시키는 어플리케이션의 플랫폼과 버전으로 설정하면 통계 수집을 위한 소비자가 메시지 본문을 디코딩할 필요가 없어 성능 향상을 가져올 수 있습니다.

user-id

사용자 인증의 경우 로그인한 사용자를 식별하기 위해 이 속성을 사용하는 것이 유용해 보이지만, 대부분의 경우 이 방식은 권장하지 않습니다.

RabbitMQ는 메시지를 발행하는 사용자에 대해 user-id 속성의 값으로 발행된 모든 메시지를 검사하고, 두 값이 일치하지 않으면 메시지가 거부됩니다. 예를 들어 어플리케이션이 RabbitMQ를 사용해 사용자 ‘www’로 인증하고 메시지의 user-id 속성을 ‘linux’로 설정할 경우 메시지가 거부됩니다.

어플리케이션이 채팅이나 인스턴트 메시징 서비스라면 한 채팅방의 모든 사용자가 같은 user-id를 사용해야 하며, 로그인한 실제 사용자를 식별하기 위해 user-id를 사용할 수는 없습니다.

type

AMQP 0-9-1 버전에서 Basic.Propertiestype 속성은 메시지 유형 이름으로 정의되어 있지만, 어플리케이션 전용으로 공식적인 동작은 정해지지 않았습니다.

일반적으로 어플리케이션이 메시지 처리 방법을 결정하는 또 다른 수단으로 커스텀 정의하여 사용합니다.

reply-to

AMQP 스펙에서 이 속성은 공식적으로 정의된 동작은 없으며, 어플리케이션 용도로만 지정되어 있습니다.

메시지에 대한 응답을 위한 개인 응답 큐를 지정할 수도 있으며, 특정 큐 이름이나 메시지가 원래 발행된 동일한 익스체인지의 응답 키를 전달하는데 사용할 수도 있습니다.

headers

임의의 사용자 정의 키와 값을 갖는 테이블입니다. RabbitMQ는 라우팅 키를 사용하는 대신 헤더 테이블에 채워진 값을 기반으로 메시지를 라우팅할 수 있습니다.

priority

0~255까지 사용할 수 있는 타입이지만, 실제 AMQP 스펙은 0~9까지로 정의되어 있습니다. 큐에 포함된 메시지의 우선순위 지정에 사용되며, 숫자가 작을수록 우선순위가 높습니다.

cluster-id

사용하지 않는 값입니다. (Reserved)

'구축 & 운영 > RabbitMQ' 카테고리의 다른 글

RabbitMQ - 메시지 큐의 주요 속성  (0) 2022.03.19
Web STOMP 플러그인 설치  (0) 2022.03.19
RabbitMQ 설치  (0) 2022.03.19
메시지 브로커 비교 (Apache Kafks vs RabbitMQ vs ActiveMQ)  (0) 2022.03.08
ActiveMQ 조사  (0) 2022.03.08