4.19. 링 대기열 구성
일반적으로 AMQ Broker의 대기열은 FIFO(first-in, first-out) 의미 체계를 사용합니다. 즉, 브로커는 큐에 메시지를 추가하고 헤드에서 제거합니다. 링 큐는 고정된 지정된 수의 메시지를 보유하는 특수한 유형의 큐입니다. 브로커는 새 메시지가 도착했을 때 큐의 헤드에서 메시지를 제거하여 고정된 큐 크기를 유지하지만 큐에는 지정된 수의 메시지가 이미 있습니다.
예를 들어 크기가 3
으로 구성된 링 큐와 메시지 A
,B
,C
, D
를 순차적으로 전송하는 생산자를 고려하십시오. 메시지 C
가 큐에 도착하면 큐의 메시지 수가 구성된 링 크기에 도달했습니다. 이 시점에서 메시지 A
는 큐의 헤드에 있고 메시지 C는 테두리에 있습니다.At this point, message A is at the head of the queue, while message C
is at the tail. D
메시지가 큐에 도착하면 브로커는 메시지를 큐에 추가합니다. 브로커는 고정된 큐 크기를 유지하기 위해 큐 헤드(즉, 메시지 A
)에서 메시지를 제거합니다. 이제 메시지 B
가 대기열의 헤드에 있습니다.
4.19.1. 링 대기열 구성
다음 절차에서는 링 큐를 구성하는 방법을 보여줍니다.
프로세스
-
<
;broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. 명시적 링 크기 세트가 없는 일치하는 주소에 있는 모든 큐에 대한 기본 링 크기를 정의하려면
address-setting
요소에default-ring-size
값을 지정합니다. 예를 들면 다음과 같습니다.<address-settings> <address-setting match="ring.#"> <default-ring-size>3</default-ring-size> </address-setting> </address-settings>
default-ring-size
매개변수는 자동 생성된 큐의 기본 크기를 정의하는 데 특히 유용합니다.default-ring-size
의 기본값은-1
입니다(즉, 크기 제한 없음).특정 큐에 링 크기를 정의하려면
ring-size
키를큐
요소에 추가합니다. 값을 지정합니다. 예를 들면 다음과 같습니다.<addresses> <address name="myRing"> <anycast> <queue name="myRing" ring-size="5" /> </anycast> </address> </addresses>
브로커가 실행되는 동안 ring-size
값을 업데이트할 수 있습니다. 브로커는 업데이트를 동적으로 적용합니다. 새 ring-size
값이 이전 값보다 작으면 브로커는 대기열 헤드에서 메시지를 즉시 삭제하여 새 크기를 적용하지 않습니다. 큐로 전송된 새 메시지는 여전히 이전 메시지의 삭제가 강제 적용되지만, 클라이언트에서 정상적인 메시지 소비를 통해 큐가 새로운, 축소된 크기에 도달하지 않습니다.
4.19.2. 링 대기열 문제 해결
이 섹션에서는 링 대기열의 동작이 구성과 다른 상황에 대해 설명합니다.
In-delivery 메시지 및 롤백
메시지가 소비자에게 전달될 때 메시지는 기술적으로 큐에 존재하지 않지만 아직 승인되지 않은 "내부" 상태에 있습니다. 메시지는 소비자가 승인할 때까지 전달 중 상태로 유지됩니다. 전송 중 상태에 남아 있는 메시지는 링 대기열에서 제거할 수 없습니다.
브로커는 전달 중 메시지를 제거할 수 없으므로 클라이언트는 링 크기 구성이 허용하는 것보다 링 큐로 더 많은 메시지를 보낼 수 있습니다. 예를 들어 다음 시나리오를 고려하십시오.
-
생산자는
ring-size="3"
로 구성된 링 큐에 세 개의 메시지를 보냅니다. 모든 메시지는 즉시 소비자에게 전달됩니다.
이 시점에서
messageCount
=3
을제공하고Count
=3
을 제공합니다.생산자는 다른 메시지를 큐에 보냅니다. 그런 다음 메시지가 소비자에게 전달됩니다.
이제
messageCount
=4
를제공하고Count
=4
를 제공합니다. 메시지 수4
는 구성된 링 크기3
보다 큽니다. 그러나 브로커는 큐에서 전송 중 메시지를 제거할 수 없기 때문에 이 상황을 허용할 의무가 있습니다.이제 메시지를 승인하지 않고 소비자가 닫혀 있다고 가정합니다.
이 경우 승인되지 않은 네 개의 메시지가 브로커에 다시 취소되고 사용된 역순으로 큐의 헤드에 추가됩니다. 이 작업을 수행하면 큐가 구성된 링 크기에 도달합니다. 링 대기열은 헤드의 메시지에 따라 대기열의 메시지를 선호하기 때문에 대기열은 대기열의 헤드에 다시 추가된 마지막 메시지였기 때문에 생산자가 보낸 첫 번째 메시지를 삭제합니다. 트랜잭션 또는 코어 세션 롤백은 동일한 방식으로 처리됩니다.
코어 클라이언트를 직접 사용하거나 AMQ Core Protocol JMS 클라이언트를 사용하는 경우 consumerWindowSize
매개변수 값(1024 * 1024바이트)의 값을 줄임으로써 전달 시 메시지 수를 최소화할 수 있습니다.
예약된 메시지
예약된 메시지가 큐로 전송되면 메시지는 일반 메시지와 같이 큐에 즉시 추가되지 않습니다. 대신 브로커는 중간 버퍼에 예약된 메시지를 보유하고 메시지의 세부 정보에 따라 큐 헤드에 전달할 메시지를 예약합니다. 그러나 예약된 메시지는 큐의 메시지 수에 계속 반영됩니다. 전송 중 메시지와 마찬가지로 이 동작으로 인해 브로커가 링 큐 크기를 적용하지 않는 것처럼 보일 수 있습니다. 예를 들어 다음 시나리오를 고려하십시오.
12:00에 생산자는
ring-size="3"
로 구성된 링 큐로 메시지를 전송합니다.이 메시지는 12:05로 예정되어 있습니다.
이 시점에서
messageCount
=1
및scheduledCount
=1
.12:01에서 생산자는 메시지
B
를 동일한 링 큐로 보냅니다.이제
messageCount
=2
및scheduledCount
=1
입니다.12:02에서 생산자는 메시지
C
를 동일한 링 큐로 보냅니다.이제
messageCount
=3
및scheduledCount
=1
.12:03에서 생산자는 메시지
D
를 동일한 링 큐로 보냅니다.이제
messageCount
=4
및scheduledCount
=1
입니다.큐의 메시지 수는 이제 구성된 링 크기인
3
보다 큰4
개입니다. 그러나 예약된 메시지는 아직 큐에 기술적으로 표시되지 않습니다(즉, 브로커에 있고 큐에 배치되도록 예약됨). 예약된 전송 시간 12:05에서 브로커는 큐의 헤드에 메시지를 넣습니다. 그러나 링 큐가 이미 구성된 크기에 도달했으므로 예약된 메시지A
가 즉시 제거됩니다.
페이지가 지정된 메시지
전달된 예약된 메시지 및 메시지와 유사하게 페이지 지정된 메시지는 브로커가 적용하는 링 큐 크기로 계산되지 않습니다. 메시지는 큐 수준이 아닌 주소 수준에서 실제로 페이지링되기 때문입니다. 페이지 지정된 메시지는 큐의 messageCount
값에 반영되지만 큐에 기술적으로 반영되지 않습니다.
링 큐가 있는 주소에 페이징을 사용하지 않는 것이 좋습니다. 대신 전체 주소가 메모리에 적합할 수 있는지 확인합니다. 또는 address-full-policy
매개변수를 DROP
,BLOCK
또는 FAIL
값으로 구성합니다.
추가 리소스
- 브로커는 소급 주소를 구성할 때 링 큐의 내부 인스턴스를 생성합니다. 자세한 내용은 4.20절. “소급 주소 구성” 에서 참조하십시오.