분석 데이터가 Qpidd 데드 레터 대기열에 멈춤

Apigee Edge 문서입니다.
Go to the Apigee X 문서로 이동합니다.
info

증상

Qpidd 서버가 분석 메시지를 PostgreSQL로 전송하지 않기 때문에 새 Edge UI에 분석 데이터가 누락됩니다. Edge에서 edge-qpid-server 구성요소는 Qpidd 서버에 해당합니다.

Qpidd는 각 분석 그룹에 대해 두 개의 큐를 유지합니다.

  • ax-q-axgroup001-consumer-group-001

    이 큐는 메시지 프로세서와 라우터에서 푸시된 분석 메시지를 보관합니다. 메시지는 edge-qpid-server에 의해 여기에서 가져와 메시지를 파싱하고 PostgreSQL에 삽입합니다. 메시지가 성공적으로 처리되면 큐에서 삭제됩니다.

  • ax-q-axgroup001-consumer-group-001-dl

    이 큐는 데드 레터 큐입니다. edge-qpid-server가 처리하지 못해 더 이상 수신하지 않으려는 메시지의 대상으로 작동합니다. 일반적으로 최대 전송 횟수가 초과되거나 PostgreSQL이 런타임 오류로 인해 새 데이터 삽입을 거부하는 경우에 채워집니다.

오류 메시지

근본 원인은 edge-qpid-server 구성요소의 다양한 런타임 오류 때문일 수 있습니다. 일반적으로 edge-qpid-server가 PostgreSQL에서 런타임 오류를 수신하면 아직 없는 경우 데드 레터 큐를 만든 후 다음 메시지를 전송합니다.

yyyy-MM-dd HH:mm:ss,SSS ax-q-axgroup001-consumer-group-001-persistpool-thread-6 WARN c.a.a.m.MessageConsumer - MessageConsumer.process() : Sending message batch to the DLQ.

가능한 원인

원인 설명 문제 해결 안내가 적용되는 대상
qpidd의 데드 레터 큐에 메시지가 멈춤 edge-qpid-server가 Qpidd 브로커에서 읽은 메시지를 이해하지 못하거나 PostgreSQL에 메시지를 유지할 수 없습니다. Edge Private Cloud 사용자

일반적인 진단 단계

Qpid 노드에서 다음 명령어를 실행하여 Qpidd 큐 통계를 확인합니다.

/opt/apigee/apigee-qpidd/bin/qpid-stat -q

출력은 브로커에 등록된 큐 집합을 반환합니다. 이름이 -dl로 끝나는 큐에 메시지가 채워져 있으면 (Edge for Private Cloud 4.53.00 이상에서는 Q-Depth(Messages), Edge for Private Cloud 4.52.x 이하에서는 msg) 메시지가 데드 레터 큐에 멈춘 것입니다.

Edge for Private Cloud 4.53.00 이상 (4.54.00, Apache Qpid Broker-J 포함)의 출력 예시:

+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|               Queue Name              | Messages Enqueued | Total Enqueued(B) | Messages Dequeued | Total Dequeued(B) | Consumers | Bindings | Q-Depth(Messages) | Q-Depth(B) |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|   ax-q-axgroup001-consumer-group-001  |        185        |      13800000     |        185        |      13800000     |     6     |    1     |         0         |     0      |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
| ax-q-axgroup001-consumer-group-001-dl |         70        |      3900000      |         0         |         0         |     0     |    1     |         70        |  3900000   |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+

Edge for Private Cloud 4.52.x 이하 (기존 C++ qpidd 브로커)의 출력 예시:

Queues
  queue                                     dur  autoDel  excl  msg   msgIn  msgOut  bytes  bytesIn  bytesOut   cons  bind
  ========================================================================================================================
  ax-q-axgroup-001-consumer-group-001       Y                   0     185    185     0       13.8m   13.8m      6      2
  ax-q-axgroup-001-consumer-group-001-dl    Y                   0     70     70      0        3.9m    3.9m      0      2

원인: qpidd의 데드 레터 큐에 메시지가 멈춤

진단

이 조건은 다음과 같은 시나리오에서 발생할 수 있습니다.

  1. 과거에 업그레이드가 진행되었으며, 이 기간 동안 PostgreSQL이 다운되었습니다.
  2. 네트워크 문제로 인해 PostgreSQL이 일시적으로 중단되었습니다.
  3. edge-qpid-server가 PostgreSQL에 메시지를 전송하려고 했지만 PostgreSQL이 런타임 오류를 반환했습니다.

해상도

Edge for Private Cloud 버전에 따라 단계를 수행하여 멈춘 메시지를 데드 레터 큐에서 기본 분석 큐로 다시 이동합니다.

Edge for Private Cloud 4.53.00 이상 (4.54.00 포함)

Edge for Private Cloud 4.53.00 이상 (4.54.00 포함)은 Apache Qpid Broker-J (10.0.1 in 4.54.00 및 8.0.6 in 4.53.x)를 사용합니다. 기존 qpid-tool CLI는 Edge for Private Cloud 4.53.00 이상에서 삭제되며 사용할 수 없습니다. 대신 Apache Qpid Broker-J HTTP 관리 REST API (moveMessages) 또는 Qpid 웹 관리 콘솔을 사용하여 메시지를 데드 레터 큐에서 기본 분석 큐로 다시 이동합니다.

  1. 일반적인 진단 단계 출력에서 기본 큐와 데드 레터 큐의 정확한 이름을 기록합니다 (예: ax-q-axgroup001-consumer-group-001 및 ax-q-axgroup001-consumer-group-001-dl 또는 ax-q-axgroup-001-consumer-group-001 및 ax-q-axgroup-001-consumer-group-001-dl).

  2. Qpid 노드에서 다음 curl 명령어를 실행하여 Qpid Broker-J HTTP Management API (기본적으로 포트 8090)를 통해 데드 레터 큐에서 moveMessages 작업을 호출합니다.

    curl -u QPID_USER:QPID_PASSWORD -X POST \
      -H "Content-Type: application/json" \
      -d '{"destination": "ax-q-axgroup001-consumer-group-001"}' \
      http://127.0.0.1:8090/api/latest/queue/default/default/ax-q-axgroup001-consumer-group-001-dl/moveMessages

    각 항목의 의미는 다음과 같습니다.

    • QPID_USER 및 QPID_PASSWORD는 /opt/apigee/customer/application/qpidd.properties 또는 /opt/apigee/token/application/qpidd.properties에 구성된 Qpid 관리 사용자 인증 정보입니다 (기본값은 guest:guest).
    • `qpid-stat -q` qpid-stat -q의 분석 큐 이름이 다른 경우 ax-q-axgroup001-consumer-group-001 및 ax-q-axgroup001-consumer-group-001-dl을 바꿉니다.
    • 메시지를 일괄적으로 이동하려면 JSON 요청 본문에 "limit"를 포함합니다 (예: "limit": 100000).
    • Qpid Management API에서 SSL/TLS가 사용 설정된 경우(conf_qpidd_qpid_management.https.enabled=true) https://를 사용하고 --cacert (또는 -k)를 curl에 전달합니다.
  3. 명령어 출력을 확인합니다. 호출이 성공하면 이동된 내부 메시지 ID의 JSON 배열이 반환됩니다.

    [ 3, 4, 5 ]

    반환된 배열이 비어 있으면 ([]) 이동할 데드 레터 큐에 메시지가 없는 것입니다.

  4. 5분간 기다린 후 /opt/apigee/apigee-qpidd/bin/qpid-stat -q을(를) 일반적인 진단 단계에서 실행합니다. 기본 큐 (ax-q-axgroup001-consumer-group-001)의 메시지 가 처리되고 데드 레터 큐 (ax-q-axgroup001-consumer-group-001-dl)의 Q-Depth(Messages)가 0으로 유지되는지 확인합니다.

Edge for Private Cloud 4.52.x 이하

  1. 일반적인 진단 단계에서 큐 이름을 기록합니다. 예를 들면 다음과 같습니다.

    • ax-q-axgroup-001-consumer-group-001
    • ax-q-axgroup-001-consumer-group-001-dl
  2. qpid-tool 명령어를 실행하여 대화형 qpid 프롬프트를 입력합니다.

    qpid-tool

    이 명령어는 다음을 반환합니다.

    Management Tool for QPID
    qpid:
  3. list broker를 실행하여 활성 브로커 목록을 가져옵니다.

    list broker

    이 명령어는 다음을 반환합니다.

    Object Summary:
    ID   Created   Destroyed  Index
    =======================================
    125  21:00:00  -          amqp-broker

    여기서 ID 열은 브로커의 ID를 지정합니다.

  4. 브로커의 ID를 기록합니다. 이 예에서는 125입니다.

  5. 다음 명령어를 실행하여 메시지를 데드 레터 큐에서 실제 큐로 다시 이동합니다.

    call 125 queueMoveMessages ax-q-axgroup-001-consumer-group-001-dl ax-q-axgroup-001-consumer-group-001 100000 {}

    이 명령어는 다음을 반환합니다.

    OK (0) - {}

    출력이 없으면 할 작업이 없는 것입니다. 즉, 이동할 메시지가 없습니다. OK (0)이 표시되지 않으면 Apigee Edge 지원팀에 문의해야 합니다.

  6. qpid-tool 터미널을 종료합니다.

    quit
  7. 5분간 기다린 후 일반적인 진단 단계에서 진단 단계를 다시 실행합니다. 실제 큐의 메시지가 처리되고 데드 레터 msg 개수가 0으로 유지되는지 확인합니다.

문제가 계속되면 다음 섹션으로 이동합니다.

진단 정보 수집 필요

이전 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집하여 Apigee Edge 지원팀과 공유하세요.

  • Qpidd 로그: /opt/apigee/var/log/apigee-qpidd/qpidd.log (Edge for Private Cloud 4.53.00 이상) 및 /opt/apigee/var/log/apigee-qpidd/apigee-qpidd.log
  • PostgreSQL 로그: /opt/apigee/var/log/apigee-postgresql/apigee-postgresql.log
  • Edge-qpid-server 로그: /opt/apigee/var/log/edge-qpid-server/logs/system.log
  • Edge-postgres-server 로그: /opt/apigee/var/log/edge-postgres-server/logs/system.log
  • Qpidd 큐 통계:

    /opt/apigee/apigee-qpidd/bin/qpid-stat -q
  • 다음 curl 명령어에서 반환된 분석 그룹:

    curl -u sysadminEmail:password http://mgmt:8080/v1/analytics/groups/ax