您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
由于 Qpidd 服务器未将分析消息传输到 PostgreSQL,因此 New 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 用户 |
常见诊断步骤
在 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 的死信队列中
诊断
在以下情况下,可能会出现此情况:
- 过去曾进行过升级,在此期间 PostgreSQL 处于停机状态。
- PostgreSQL 因网络问题而暂时中断。
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(在 4.54.00 中为 10.0.1,在 4.53.x 中为 8.0.6)。旧版 qpid-tool CLI 在 Edge for Private Cloud 4.53.00 及更高版本中已移除,无法使用。
请改用 Apache Qpid Broker-J HTTP 管理 REST API (moveMessages) 或 Qpid Web 管理控制台,将消息从死信队列移回主分析队列:
从 常见诊断步骤输出中记下主队列和死信队列的确切名称(例如,
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)。在 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中的分析队列名称不同,请替换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。
验证命令输出。成功调用会返回已移动的内部消息 ID 的 JSON 数组:
[ 3, 4, 5 ]
如果返回的数组为空 (
[]),则表示死信队列中没有要移动的消息。等待 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 及更低版本
从 常见诊断步骤中记下队列的名称。例如:
ax-q-axgroup-001-consumer-group-001ax-q-axgroup-001-consumer-group-001-dl
运行
qpid-tool命令以输入交互式qpid提示符:qpid-tool
此命令会返回以下内容:
Management Tool for QPID qpid:
运行
list broker以获取活跃代理的列表:list broker
此命令会返回以下内容:
Object Summary: ID Created Destroyed Index ======================================= 125 21:00:00 - amqp-broker
其中,
ID列指定了代理的 ID。记下代理的 ID。在示例中,该 ID 为
125。运行以下命令,将消息从死信队列移回实际队列:
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 支持团队 联系。退出
qpid-tool终端:quit
等待 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