分析数据卡在 Qpidd 死信队列中

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。
信息

问题

由于 Qpidd 服务器未将分析消息传输到 PostgreSQL,Edge 界面中缺少分析数据。在 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 用户

常见诊断步骤

运行以下命令可查看 Qpidd 队列统计信息:

qpid-stat -q

输出会返回向代理注册的队列集。如果名称以“-dl”结尾的队列中填充了消息,则表示死信队列中有消息卡住。

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 返回了运行时错误。

分辨率

  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 分钟,然后从常见诊断步骤开始重新运行诊断步骤。验证实际队列中的消息是否正在处理,并确保死信消息计数保持为 0。

如果问题仍然存在,请前往下一部分。

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息。请与 Apigee Edge 支持团队联系并分享以下信息:

  • Qpidd 日志:/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 队列统计信息:

    qpid-stat -q
  • 以下 curl 命令返回的 Analytics 组:

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