RabbitMQ消息追踪

在使用任何消息中间件的过程中,难免会出现某条消息异常丢失的情况。对于 RabbitMQ 而言,可能是因为生产者或消费者与 RabbitMQ 断开了连接,而它们与 RabbitMQ 又采用了不同的确认机制;也有可能是因为交换器与队列之间不同的转发策略;甚至是交换器并没有与任何队列进行绑定,生产者又不感知或者没有采取相应的措施;另外 RabbitMQ 本身的集群策略也可能导致消息的丢失。

这个时候就需要有一个较好的机制跟踪记录消息的投递过程,以此协助开发和运维人员进行问题的定位。在 RabbitMQ 中可以使用 Firehose 和 rabbitmq_tracing 插件功能来实现消息追踪。

消息追踪-Firehose

firehose 的机制是将生产者投递给 rabbitmq 的消息,rabbitmq 投递给消费者的消息按照指定的格式发送到默认的 exchange上。这个默认的 exchange 的名称为 amq.rabbitmq.trace,它是一个 topic 类型的 exchange。

发送到这个 exchange 上的消息的 routing key 为 publish.exchangename 和 deliver.queuename。其中 exchangename 和 queuename 为实际 exchange 和 queue 的名称,分别对应生产者投递到 exchange 的消息,和消费者从 queue 上获取的消息。

注意:打开 trace 会影响消息写入功能,适当打开后请关闭。

  • rabbitmqctl trace_on:开启 Firehose 命令
  • rabbitmqctl trace_off:关闭 Firehose 命令

消息追踪-rabbitmq_tracing

rabbitmq_tracing 和 Firehose 在实现上如出一辙,只不过 rabbitmq_tracing 的方式比 Firehose 多了一层 GUI 的包装,更容易使用和管理。

启用插件:

rabbitmq-plugins enable rabbitmq_tracing