증상:
대상을 나열하면 사용 불능 메시지 대기열에 메시지가 포함되어 있습니다. 예를 들어, 다음과 같은 명령을 실행합니다.
imqcmd list dst
사용자 이름과 비밀번호를 입력하면 다음과 같은 메시지가 출력됩니다.
Listing all the destinations on the broker specified by: --------------------------------- Host Primary Port --------------------------------- localhost 7676 ---------------------------------------------------------------------- Name Type State Producers Consumers Msgs Total Count UnAck Avg Size ------------------------------------------------- ---------------------- MyDest Queue RUNNING 0 0 5 0 1177.0 mq.sys.dmq Queue RUNNING 0 0 35 0 1422.0 Successfully listed destinations. |
이 예의 사용 불능 메시지 대기열 mq.sys.dmq에는 35개의 메시지가 포함되어 있습니다.
가능한 원인:
가능한 원인: 메시지 수 또는 메시지 크기가 대상 제한을 초과합니다.
문제의 원인을 확인하는 방법: QBrowser 데모 응용 프로그램을 사용하여 사용 불능 메시지 대기열의 내용을 살펴봅니다. QBrowser 데모의 플랫폼별 위치는 부록 A, 플랫폼별 Message QueueTM 데이터 위치를 참조하십시오. 또한 "예제 응용 프로그램 및 위치" 표를 참조하십시오.
다음은 Windows 플랫폼에서의 호출 예입니다.
cd \MessageQueue3\demo\applications\qbrowser java QBrowser
QBrowser 기본 창이 나타나면 대기열 이름 mq.sys.dmq를 선택한 다음 Browse를 누릅니다. "메시지 시간 초과 값이 만료됩니다."에서 이전에 표시된 것과 같은 목록이 나타납니다. "메시지 시간 초과 값이 만료됩니다."에 표시된 것처럼 아무 메시지나 두 번 누르면 해당 메시지에 대한 세부 정보가 표시됩니다
다음 메시지 등록 정보 값을 확인합니다.
JMS_SUN_DMQ_UNDELIVERED_REASON
JMS_SUN_DMQ_UNDELIVERED_COMMENT
JMS_SUN_DMQ_UNDELIVERED_TIMESTAMP
JMS Headers에서 JMSDestination 값을 검토하여 메시지가 사용 불능 상태인 대상을 확인합니다.
문제를 해결하는 방법: 대상 제한을 늘립니다. 예를 들면 다음과 같습니다.
imqcmd update dst - n MyDest -o maxNumMsgs=1000
가능한 원인: 브로커 클럭과 생성자 클럭이 동기화되어 있지 않습니다.
문제의 원인을 확인하는 방법: QBrowser 응용 프로그램을 사용하여 사용 불능 메시지 대기열에 있는 메시지의 세부 정보를 살펴봅니다. JMS_SUN_DMQ_UNDELIVERED_REASON 값을 확인하여 원인이 EXPIRED인 메시지를 찾습니다.
브로커 파일에서 B2102, B2103, B2104 메시지 중 하나가 있는지 확인합니다. 이러한 모든 메시지는 가능한 클럭 스큐가 감지되었음을 보고합니다.
문제를 해결하는 방법: 시스템 자원 준비에 설명된 대로 시간 동기화 프로그램이 실행 중인지 확인합니다.
가능한 원인: 메시지 시간이 초과되기 전에 사용자가 메시지를 받지 못합니다.
문제의 원인을 확인하는 방법: QBrowser 응용 프로그램을 사용하여 사용 불능 메시지 대기열에 있는 메시지의 세부 정보를 살펴봅니다. JMS_SUN_DMQ_UNDELIVERED_REASON 값을 확인하여 원인이 EXPIRED인 메시지를 찾습니다.
대상에 사용자가 있는지 확인합니다. 예를 들면 다음과 같습니다.
imqcmd query dst -t q -n MyDest
Current Number of Active Consumers에 나열된 값을 확인합니다. 활성 사용자가 있는 경우 다음 중 하나에 해당됩니다.
사용자의 연결이 일시 중단되었습니다.
메시지 시간 초과가 사용자의 실행 속도에 비해 너무 짧습니다.
문제를 해결하는 방법: 응용 프로그램 개발자에게 메시지 수명 값을 늘리도록 요청합니다.
가능한 원인: 사용자 수에 비해 생성자가 너무 많습니다.
문제의 원인을 확인하는 방법: QBrowser 응용 프로그램을 사용하여 사용 불능 메시지 대기열에 있는 메시지의 세부 정보를 살펴봅니다. JMS_SUN_DMQ_UNDELIVERED_REASON의 값을 확인합니다. 이유가 REMOVE_OLDEST 또는 REMOVE_LOW_PRIORITY인 경우 imqcmd query dst 명령을 사용하여 대상의 생성자 수와 사용자 수를 확인합니다. 생성자 수가 사용자 수를 초과하는 경우 생성 속도가 사용 속도보다 훨씬 빠를 수 있습니다.
문제를 해결하는 방법: 다음과 같은 명령을 사용하여 사용자 클라이언트를 추가하거나 사용자 제한 동작을 FLOW_CONTROL(사용 속도를 사용하여 생성 속도 제어)로 설정합니다.
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
가능한 원인: 생성자가 사용자보다 더 빠릅니다.
문제의 원인을 확인하는 방법:사용자가 느리기 때문에 생성자가 느려지는지 확인하려면 다음과 같은 명령을 사용하여 대상 제한 동작을 FLOW_CONTROL(사용 속도를 사용하여 생성 속도 제어)로 설정합니다.
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
다음 예와 같은 명령을 실행하여 메트릭을 통해 대상 입력과 출력을 검토합니다.
imqcmd metrics dst - n myDst -t q -m rts
메트릭 출력에서 다음 값을 검토합니다.
Msgs/sec Out: 브로커가 제거하는 초 당 메시지 수를 나타냅니다. 브로커는 모든 사용자가 메시지 수신을 확인하면 메시지를 제거하기 때문에 메트릭이 사용 속도에 영향을 줍니다.
Msgs/sec In: 브로커가 생성자로부터 수신하는 초 당 메시지 수를 나타냅니다. 따라서 메트릭이 생성 속도에 영향을 미칩니다.
흐름 제어는 생성을 소비에 맞추므로 생성이 느려지거나 중단되었는지 확인합니다. 그럴 경우 생성자와 사용자의 처리 속도가 일치하지 않는 것입니다. imqcmd list dst 명령을 사용하여 전송되었지만 확인되지 않은(UnAcked) 메시지 수를 확인할 수도 있습니다. 확인되지 않은 메시지 수가 대상 크기보다 작은 경우 대상에 추가 용량이 있기 때문에 클라이언트 흐름 제어에 의해 대상이 다시 보관됩니다.
문제를 해결하는 방법: 생성 속도가 사용 속도보다 일관되게 더 빠를 경우 흐름 제어를 정기적으로 사용하여 시스템을 정렬된 상태로 유지하십시오. 또한 뒤에 나오는 절들을 참조하여 다음과 같은 가능한 요소 각각을 해결해 보십시오.
가능한 원인: 사용자가 너무 느립니다.
문제의 원인을 확인하는 방법: "생성자가 사용자보다 더 빠릅니다."에서 설명한 대로 메트릭을 사용하여 생성 속도와 사용 속도를 확인합니다.
문제를 해결하는 방법:
다음과 같은 명령을 사용하여 대상의 제한 동작을 FLOW_CONTROL로 설정합니다.
imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL
흐름 제어의 사용으로 인해 생산 속도가 사용 속도만큼 느려지므로 브로커에 메시지가 누적되지 않습니다. 대상에서 메시지를 처리할 수 있을 때까지 생성자 응용 프로그램이 메시지를 보관하므로 만료될 위험이 적습니다.
응용 프로그램 개발자에게 문의하여 생성자가 메시지를 일정한 속도로 보내는지 주기적으로 많은 메시지를 보내는지 확인합니다. 응용 프로그램이 한 번에 많은 메시지를 보내는 경우 다음 항목에 설명된 것처럼 대상 제한을 늘립니다.
메시지 수나 바이트 수 또는 둘 다를 기반으로 대상 제한을 늘립니다. 대상의 메시지 수를 변경하려면 다음과 같은 형식으로 명령을 입력합니다.
imqcmd update dst - n destName -t {q|t} -o maxNumMsgs=number
대상의 크기를 변경하려면 다음과 같은 형식으로 명령을 입력합니다.
imqcmd update dst -n destName -t {q|t} -o maxTotalMsgBytes=number
제한을 늘리면 브로커가 사용하는 메모리의 양이 증가합니다. 따라서 제한이 너무 높을 경우 메모리가 부족하여 브로커가 메시지를 처리할 수 없게 됩니다.
생산 로드가 높은 기간에 메시지 손실을 허용할 수 있는지 여부를 고려합니다.
가능한 원인: 클라이언트가 메시지를 완결하지 못합니다.
문제의 원인을 확인하는 방법: 응용 프로그램 개발자에게 문의하여 응용 프로그램이 트랜잭션을 사용하는지 여부를 확인합니다. 그럴 경우 다음과 같이 활성 트랜잭션을 나열합니다.
imqcmd list txn
다음은 명령 출력의 예입니다.
---------------------------------------------------------------------- Transaction ID State User name # Msgs/# Acks Creation time ---------------------------------------------------------------------- 6800151593984248832 STARTED guest 3/2 7/19/04 11:03:08 AM |
메시지 수와 확인 수를 확인합니다. 메시지 수가 더 많은 경우 생성자가 개별 메시지를 보내는 중일 수 있지만 트랜잭션을 완결하지 못한 것입니다. 브로커는 완결을 수신할 때까지 해당 트랜잭션에 대한 메시지를 경로 지정 및 전달할 수 없습니다. 확인 수가 더 많은 경우 사용자가 개별 메시지에 대한 확인을 보내는 중일 수 있지만 트랜잭션을 완결하지 못한 것입니다. 브로커는 완결을 수신할 때까지 해당 트랜잭션에 대한 확인을 제거할 수 없습니다.
문제를 해결하는 방법: 코딩 오류를 수정하려면 응용 프로그램 개발자에게 문의하십시오.
가능한 원인: 사용자가 메시지를 확인할 수 없습니다.
문제의 원인을 확인하는 방법: 응용 프로그램 개발자에게 문의하여 응용 프로그램이 시스템 기반 확인을 사용하는지 클라이언트 기반 확인을 사용하는지 확인합니다. 응용 프로그램이 시스템 기반 확인을 사용하는 경우 이 절을 건너뜁니다. 응용 프로그램이 클라이언트 기반 확인을 사용하는 경우(CLIENT_ACKNOWLEDGE) 다음과 같은 명령을 사용하여 먼저 클라이언트에 저장된 메시지 수를 줄입니다.
imqcmd update dst -n myDst -t q -o consumerFlowLimit=1
그런 다음 사용자가 느리기 때문에 브로커가 메시지를 버퍼링하는지 아니면 사용자가 메시지를 빠르게 처리하지만 메시지를 확인하지 않았는지를 확인합니다. 다음 명령을 사용하여 대상을 나열합니다.
imqcmd list dst
사용자 이름과 비밀번호를 입력하면 다음과 같은 메시지가 출력됩니다.
Listing all the destinations on the broker specified by: --------------------------------- Host Primary Port --------------------------------- localhost 7676 ---------------------------------------------------------------------- Name Type State Producers Consumers Msgs Total Count UnAck Avg Size ------------------------------------------------ ----------------------- MyDest Queue RUNNING 0 0 5 200 1177.0 mq.sys.dmq Queue RUNNING 0 0 35 0 1422.0 Successfully listed destinations. |
UnAck 수는 브로커가 보낸 다음 확인을 대기 중인 메시지 수를 나타냅니다. UnAck 수가 높거나 증가하는 경우 브로커가 메시지를 보내고 있는 중이므로 느린 사용자를 기다리지 않습니다. 또한 사용자가 메시지를 확인하지 않고 있음을 알 수 있습니다.
문제를 해결하는 방법:코딩 오류를 수정하려면 응용 프로그램 개발자에게 문의하십시오.
가능한 원인: 영구 사용자가 비활성 상태입니다.
문제의 원인을 확인하는 방법: 다음 명령 형식을 사용하여 주제의 영구 가입자를 확인합니다.
imqcmd list dur -d topicName
문제를 해결하는 방법:
imqcmd purge dur 명령을 사용하여 영구 사용자를 제거합니다.
사용자 응용 프로그램을 다시 시작합니다.
가능한 원인: 예기치 않은 브로커 오류가 발생했습니다.
문제의 원인을 확인하는 방법: "Producers are faster than consumers"에서 설명한 대로 QBrowser를 사용하여 메시지를 확인합니다.JMS_SUN_DMQ_UNDELIVERED_REASON 값이 ERROR이면 브로커 오류가 발생한 것입니다.
문제를 해결하는 방법:
브로커 로그 파일을 검토하여 관련 오류를 확인합니다.
Sun 기술 지원부에 연락하여 브로커 문제를 보고합니다.