4.18.2. 링 대기열 문제 해결

이 섹션에서는 링 큐의 동작이 구성과 다른 상황에 대해 설명합니다.

In-delivery 메시지 및 롤백

메시지가 소비자에게 전달되면 메시지는 기술적으로 큐에 없는 "in-between" 상태에 있지만 아직 확인되지 않았습니다. 메시지는 소비자가 승인할 때까지 전달 내 상태로 유지됩니다. in-delivery 상태에 남아 있는 메시지는 링 큐에서 제거할 수 없습니다.

브로커가 배달 내 메시지를 제거할 수 없기 때문에 클라이언트는 링 크기 구성에서 허용하는 것보다 더 많은 메시지를 링 큐에 보낼 수 있습니다. 예를 들어 다음 시나리오를 고려해 보십시오.For example, consider this scenario:

  1. 생산자는 ring-size="3" 으로 구성된 링 큐로 세 개의 메시지를 보냅니다.
  2. 모든 메시지는 사용자에게 즉시 전달됩니다.

    이 시점에서 messageCount= 3deliveringCount= 3.

  3. 생산자는 대기열에 다른 메시지를 보냅니다. 그런 다음 메시지가 소비자에게 디스패치됩니다.

    이제 messageCount = 4deliveringCount = 4. 메시지 수 4 는 구성된 링 크기 3 보다 큽니다. 그러나 브로커는 대기열에서 수신되지 않은 메시지를 제거할 수 없기 때문에 이 상황을 허용해야 합니다.

  4. 이제 소비자가 메시지를 인정하지 않고 종료한다고 가정합니다.

    이 경우 네 개의 배달되지 않은 메시지가 브로커로 다시 취소되고 소비된 순서로 큐의 헤드에 추가됩니다. 이 작업을 수행하면 구성된 링 크기에 큐가 배치됩니다. 링 큐는 헤드의 메시지 위에 대기열의 메시지에서 메시지를 선호하기 때문에 큐는 생산자가 보낸 첫 번째 메시지를 큐의 헤드에 다시 추가했기 때문에 큐에서 보낸 첫 번째 메시지를 삭제합니다. 트랜잭션 또는 핵심 세션 롤백은 동일한 방식으로 처리됩니다.

코어 클라이언트를 직접 사용하거나 AMQ Core Protocol JMS 클라이언트를 사용하는 경우 기본적으로 consumerWindowSize 매개변수(1024 * 1024바이트)의 값을 줄임으로써 배달 메시지 수를 최소화할 수 있습니다.

예약된 메시지

예약된 메시지가 큐에 전송되면 메시지가 일반 메시지와 같은 큐의 tail에 즉시 추가되지 않습니다. 대신 브로커는 중간 버퍼에 예약된 메시지를 보유하고 메시지 세부 사항에 따라 큐의 헤드에 메시지를 예약합니다. 그러나 예약된 메시지는 대기열의 메시지 수에 계속 반영됩니다. in-delivery 메시지와 마찬가지로 이 동작은 브로커가 링 대기열 크기를 강제 적용하지 않는 것처럼 보일 수 있습니다. 예를 들어 다음 시나리오를 고려해 보십시오.For example, consider this scenario:

  1. 12:00에서 생산자는 ring-size="3" 으로 구성된 링 큐로 메시지 A 를 보냅니다. 이 메시지는 12:05로 예정되어 있습니다.

    이 시점에서 messageCount= 1scheduledCount= 1.

  2. 12:01에서 생산자는 B 메시지를 동일한 링 대기열로 보냅니다.

    이제 messageCount= 2scheduledCount= 1.

  3. 12:02에서 생산자는 메시지 C 를 동일한 링 대기열로 보냅니다.

    이제 messageCount= 3scheduledCount= 1.

  4. 12:03에서 생산자는 D 메시지를 동일한 링 대기열로 보냅니다.

    이제 messageCount= 4scheduledCount= 1.

    대기열의 메시지 수가 이제 4 이고, 구성된 링 크기 3 보다 1배 큽니다. 그러나 예약된 메시지는 기술적으로 대기열에 있지 않습니다(즉, 브로커에 있으며 큐에 배치하도록 예약됨). 12:05의 예정된 전달 시간에 브로커는 메시지를 대기열의 헤드에 배치합니다. 그러나 링 큐의 구성된 크기에 이미 도달했으므로 예약된 메시지 A 가 즉시 제거됩니다.

paged 메시지

배달 중인 예약된 메시지 및 메시지와 유사하게, 페이지화된 메시지는 메시지들이 실제로 대기열 수준이 아닌 주소 수준에서 페이지링되기 때문에 브로커에 의해 적용되는 링 큐 크기로 계산되지 않습니다. paged 메시지는 대기열의 messageCount 값에 반영되어 있지만 기술적으로 대기열에 있지 않습니다.

링 큐가 있는 주소에 페이징을 사용하지 않는 것이 좋습니다. 대신 전체 주소가 메모리에 들어갈 수 있는지 확인합니다. 또는 address-full-policy 매개변수를 DROP,BLOCK 또는 FAIL 의 값으로 구성합니다.

추가 리소스

  • 브로커는 소급성 주소를 구성할 때 링 큐의 내부 인스턴스를 생성합니다. 자세한 내용은 4.19절. “소급 주소 구성” 에서 참조하십시오.