증상:
메시지 생성이 지연되거나 생성된 메시지가 브로커에서 거부됩니다.
메시지가 사용자에게 도달하기까지 비정상적으로 오래 걸립니다.
브로커 또는 특정 대상의 메시지나 메시지 바이트 수가 시간에 따라 꾸준하게 증가합니다.
메시지가 누적되고 있는지 확인하려면 브로커의 메시지나 메시지 바이트 수가 시간에 따라 어떻게 변하는지 확인하고 구성된 제한과 비교합니다. 먼저 구성된 제한을 확인합니다.
imqcmd query bkr
imqcmd metrics bkr 하위 명령은 이 정보를 표시하지 않습니다.
그런 다음 각 대상에서 메시지 누적을 확인합니다.
imqcmd list dst
메시지가 대상이나 브로커 전체에 구성된 제한을 초과했는지 확인하려면 브로커 로그에서 다음 항목을 확인합니다.
[B2011]: Storing of JMS message from … failed.
이 항목 다음에는 초과된 제한에 대해 설명하는 다른 항목이 표시됩니다.
가능한 원인:
가능한 원인: 주제 대상에 비활성 영구 가입이 있습니다.
영구 가입이 비활성 상태인 경우 해당 사용자가 활성화되어 메시지를 사용할 수 있을 때까지 대상에 메시지가 저장됩니다.
문제의 원인을 확인하는 방법: 각 주제 대상에서 영구 가입 상태를 확인합니다.
imqcmd list dur -d destName
문제를 해결하는 방법:
문제가 있는 영구 가입의 모든 메시지를 제거합니다( 영구 가입 관리 참조).
주제에 대해 메시지 제한 및 제한 동작 속성을 지정합니다(표 15–1 참조). 예를 들어, 메모리에 누적되는 메시지를 삭제하는 REMOVE_OLDEST 및 REMOVE_LOW_PRIORITY 제한 동작을 지정할 수 있습니다.
해당 대상에서 모든 메시지를 제거합니다( 물리적 대상 제거 참조).
생성자 클라이언트를 다시 작성하여 각 메시지의 수명 값을 설정함으로써 메시지가 메모리에 남아 있을 수 있는 시간을 제한합니다. imqOverrideJMSExpiration 및 imqJMSExpiration 연결 팩토리 속성을 설정하여 연결을 공유하는 모든 생성자에 대해 이러한 설정을 대체할 수 있습니다( 메시지 헤더 대체 참조).
가능한 원인: 대기열에서 메시지를 사용할 수 있는 사용자 수가 너무 적습니다.
메시지를 전달할 수 있는 활성 사용자의 수가 너무 적은 경우 메시지가 누적될 때 대기열 대상이 백로그될 수 있습니다. 이런 상태는 다음과 같은 이유 중 하나 때문에 발생할 수 있습니다.
대상에 활성 사용자의 수가 너무 적습니다.
사용자 클라이언트가 연결을 설정하지 못했습니다.
대기열의 메시지에 일치하는 선택기를 사용하는 활성 사용자가 없습니다.
문제의 원인을 확인하는 방법: 사용자가 대기열의 메시지를 사용할 수 없는 원인을 확인하려면 대상에서 활성 사용자의 수를 확인합니다.
imqcmd metrics dst - n destName -t q -m con
문제를 해결하는 방법: 사용자가 사용할 수 없는 원인에 따라
추가 사용자 클라이언트를 시작하여 대기열에 대한 활성 사용자를 더 많이 만듭니다.
imq.consumerFlowLimit 브로커 등록 정보를 조정하여 여러 사용자에 대한 대기열 전달을 최적화합니다( 다중 사용자 대기열 성능 참조).
대기열에 대해 메시지 제한 및 제한 동작 속성을 지정합니다(표 15–1 참조). 예를 들어, 메모리에 누적되는 메시지를 삭제하는 REMOVE_OLDEST 및 REMOVE_LOW_PRIOROTY 제한 동작을 지정할 수 있습니다.
해당 대상에서 모든 메시지를 제거합니다( 물리적 대상 제거 참조).
생성자 클라이언트를 다시 작성하여 각 메시지의 수명 값을 설정함으로써 메시지가 메모리에 남아 있을 수 있는 시간을 제한합니다. imqOverrideJMSExpiration 및 imqJMSExpiration 연결 팩토리 속성을 설정하여 연결을 공유하는 모든 생성자에 대해 이러한 설정을 대체할 수 있습니다( 메시지 헤더 대체 참조).
가능한 원인: 메시지 사용자가 너무 느리게 처리하여 메시지 생성자를 따라가지 못합니다.
이 경우 주제 가입자나 대기열 수신자가 메시지를 사용하는 것이 생성자가 메시지를 보내는 것보다 느립니다. 이러한 불균형으로 인해 하나 이상의 대상이 메시지로 백로그됩니다.
문제의 원인을 확인하는 방법:메지지가 브로커에 유입 및 유출되는 속도를 확인합니다.
imqcmd metrics bkr -m rts
그런 다음 개별 대상 각각에 대한 흐름 속도를 확인합니다.
imqcmd metrics bkr -t destType -n destName - m rts
문제를 해결하는 방법:
사용자 클라이언트 코드를 최적화합니다.
대기열 대상의 경우 활성 사용자의 수를 늘립니다( 다중 사용자 대기열 성능 참조).
가능한 원인: 클라이언트 확인 처리가 메시지 사용을 느리게 합니다.
다음과 같은 두 가지 요소가 클라이언트의 확인 처리에 영향을 미칩니다.
상당한 브로커 자원이 클라이언트 확인 처리에 사용될 수 있습니다. 따라서 브로커가 클라이언트 확인을 확인할 때까지 사용자 클라이언트가 차단되는 확인 모드에서는 메시지 사용이 느려질 수 있습니다.
JMS 페이로드 메시지와 Message Queue 제어 메시지(예: 클라이언트 확인)는 같은 연결을 공유합니다. 따라서 JMS 페이로드 메시지에 의해 제어 메시지가 일시적으로 중단되어 메시지 사용이 느려질 수 있습니다.
문제의 원인을 확인하는 방법:
패킷 흐름을 기준으로 메시지 흐름을 확인합니다. 초당 패킷 수와 메시지 수의 비율이 맞지 않으면 클라이언트 확인에 문제가 있을 수 있습니다.
클라이언트가 다음과 같은 예외를 받았는지 확인합니다:
JMSException [C4000]: Packet acknowledge failed
문제를 해결하는 방법:
클라이언트가 사용하는 확인 모드를 수정합니다. 예를 들어, DUPS_OK_ACKNOWLEDGE 또는 CLIENT_ACKNOWLEDGE로 전환합니다.
CLIENT_ACKNOWLEDGE 또는 트랜잭션된 세션을 사용 중인 경우 많은 수의 메시지를 하나의 확인으로 그룹화합니다.
사용자 및 연결 흐름 제어 매개 변수를 조정합니다( 클라이언트 런타임 메시지 흐름 조정 참조).
가능한 원인: 브로커가 메시지 생성 속도를 따라갈 수 없습니다.
이 경우 브로커가 메시지를 라우팅하여 사용자에게 전달하는 것보다 더 빨리 메시지가 브로커로 유입됩니다. 브로커의 지체는 다음 중 하나 또는 모두에 대한 제한 때문일 수 있습니다.
CPU
네트워크 소켓 읽기/쓰기 작업
디스크 읽기/쓰기 작업
메모리 페이징
영구 저장소
JVM 메모리 제한
문제의 원인을 확인하는 방법: 이 문제를 일으키는 다른 원인은 없는지 확인합니다.
문제를 해결하는 방법:
컴퓨터 또는 데이터 저장소의 속도를 업그레이드합니다.
브로커 클러스터를 사용하여 로드를 여러 브로커 인스턴스에 분산합니다.
가능한 원인: 클라이언트 코드에 결함이 있습니다. 사용자가 메시지를 확인하지 않습니다.
메시지는 메시지를 받은 모든 사용자가 확인할 때까지 대상에 보관됩니다. 따라서 클라이언트가 사용된 메시지를 확인하지 않는 경우 메시지는 삭제되지 않고 대상에 누적됩니다.
예를 들어, 클라이언트 코드에 다음 결함이 있을 수 있습니다.
CLIENT_ACKNOWLEDGE 확인 모드 또는 트랜잭션된 세션을 사용하는 사용자가 Session.acknowledge 또는 Session.commit을 정기적으로 호출하고 있지 않을 수 있습니다.
AUTO_ACKNOWLEDGE 확인 모드를 사용하는 사용자가 어떤 이유로 중지되어 있을 수 있습니다.
문제의 원인을 확인하는 방법: 먼저 이 절에 나열된 모든 다른 가능한 원인을 확인하고다음 명령을 사용하여 대상을 나열합니다.
imqcmd list dst
UnAcked 헤더에 나열된 메시지 수가 대상의 메시지 수와 동일한지를 확인합니다. 이 헤더에 있는 메시지가 사용자에게 전송되었지만 확인되지 않았습니다. 이 수가 총 메시지 수와 같은 경우 브로커가 모든 메시지를 전송하고 확인을 대기 중인 것입니다.
문제를 해결하는 방법: 이 문제를 디버깅할 때 응용 프로그램 개발자에게 도움을 요청하십시오.