文档目录

问题说明

本文用于排查ZCenter异步任务已经结束或云平台操作已经完成,但订单、资源操作记录、资源同步或页面通知仍未更新的问题。ZCenter使用RabbitMQ传递任务结束、订单状态、资源同步和WebSocket通知等消息,RabbitMQ异常可能导致业务后续状态没有被消费。

现象

  • 后台任务已显示COMPLETED或FAILED,但订单长期保持处理中。
  • 云平台操作已完成,ZCenter资源状态、操作记录或页面通知没有更新。
  • 资源同步请求已提交,但对应业务服务没有开始同步。
  • RabbitMQ队列messages_ready持续增加,或者关键队列consumers=0。
  • 日志出现AmqpConnectException、ACCESS_REFUSED、Failed to declare、Connection refused、[***error***]或TASK_END fail。

适用环境

  • 产品:ZCenter
  • 版本:5.1.0
  • 组件:RabbitMQ、Base、Portal、Operation及资源服务

可能原因

  • RabbitMQ服务不可用、网络中断或5672端口不可达。
  • ZCenter服务配置的地址、账号、密码、virtual host或TLS参数不一致。
  • 队列和绑定已存在,但对应服务监听器未启动,消费者数量为0。
  • 消费者处理失败导致消息重复入队或长期处于未确认状态。
  • RabbitMQ中断期间消息未成功发布;此类消息不一定会在恢复后自动补发。
  • 业务状态已经部分落库,重复提交可能造成重复创建、删除或计费。

排查步骤

1. 确认业务状态差异

  • 查询任务、订单和云平台实际状态,记录任务UUID、订单UUID、资源UUID和发生时间。
  • 任务接口示例:GET /api/portal/v4/task/get?uuid=<TASK_UUID>。
  • 订单接口示例:GET /api/portal/v4/apply-order/getDetail?uuid=<ORDER_UUID>。
  • 判断:任务已结束但订单仍处理中,重点检查TASK_END事件;资源同步完全未启动时,重点检查msg.resource.sync相关队列。

2. 检查RabbitMQ服务和应用连接

  • 在RabbitMQ节点执行:
  rabbitmq-diagnostics -q ping
  rabbitmq-diagnostics status
  rabbitmq-diagnostics listeners
  rabbitmqctl list_connections user vhost state channels peer_host peer_port
  • 预期结果:RabbitMQ节点健康,ZCenter相关服务连接存在且使用正确vhost。
  • 异常处理:恢复RabbitMQ服务和网络,核对实际运行时地址、账号、vhost和TLS;不要使用源码示例凭据判断生产配置。

3. 检查队列、消费者和积压

  • 命令:
  rabbitmqctl list_queues -p <vhost> name messages_ready messages_unacknowledged consumers
  rabbitmqctl list_bindings -p <vhost> source_name destination_name destination_kind routing_key
  • 重点队列:inner_base、inner_operation、inner_vm、base_log、mo_sync_vm、order_vm、order_oc_vm及ws_<portal-instance>。
  • 预期结果:关键队列存在,相关消费者大于0,消息积压可持续下降。
  • 异常处理:消费者为0时检查对应服务和监听器;messages_ready增长时检查消费者日志;messages_unacknowledged不下降时定位消费者处理异常。

4. 检查ZCenter日志

  • 搜索:[base TASK_END]、[oc TASK_END]、[***pre***]、[***after***]、[***error***]、org.springframework.amqp、CachingConnectionFactory、ACCESS_REFUSED。
  • 判断:有发布前日志但无消费日志,检查发布连接和路由;有消费前日志但无消费后日志,检查处理器异常;无任何消息日志时先确认上游业务是否实际发送消息。

5. 收集支持信息

  • RabbitMQ节点、vhost、队列、消费者、积压和连接信息,账号密码需脱敏。
  • Base、Operation、Portal及目标资源服务的同一时间窗口日志。
  • 任务、订单和云平台状态对比,明确哪些步骤已成功。

处理方式

  1. 恢复RabbitMQ节点、网络、账号权限和vhost,确认应用连接重新建立。
  2. 队列存在但无消费者时,仅恢复对应服务;不要无差别重启所有组件。
  3. RabbitMQ恢复后观察积压消息自然消费,不要清空队列或删除vhost。
  4. 对故障期间卡住的订单和资源操作逐条核对云侧实际结果,再按业务幂等性和产品恢复流程处理。
  5. 不要直接批量重提任务。连接中断期间未成功发布的消息不能假定会自动补发。

验证方法

  • RabbitMQ验证:节点健康、应用连接存在、关键队列消费者大于0。
  • 积压验证:messages_ready和messages_unacknowledged回落到正常范围。
  • 任务验证:新建一个经批准的低风险任务,状态能进入最终状态。
  • 订单验证:订单任务记录与最终状态一致,不再长期停留在处理中。
  • 日志验证:出现配对的消息消费前后日志,不再新增AMQP连接或认证异常。

风险与回滚

  • 清空队列、删除vhost或重建RabbitMQ数据目录可能造成消息永久丢失,禁止作为常规恢复方式。
  • 云侧操作可能已成功,重复提交会造成资源或计费风险。
  • 配置变更前记录原RabbitMQ连接参数;异常时恢复原配置并仅重启受影响服务。

补充信息

ZCenter 任务已执行但订单或操作状态一直处理中,如何排查 RabbitMQ? | 故障排查 · KB | ZStack 资源中心