为什么需要消息追踪?
使用MQ时经常会有这样的场景:生产者成功发送消息,消费者却找不到消息!?
为什么会出现这种消息异常丢失的情况呢?有可能是编码导致的逻辑错误,比如交换机与队列的绑定问题、交换机的转发策略问题;也有可能是不可避免的网络连接问题、集群分布问题…这时便需要一个跟踪消息的机制,来帮我们定位到消息失踪的原因。
在RabbitMQ中,可以使用 Firehose 和 rabbitmq_tracing 插件来进行消息追踪。
Firehose
先说一下Firehose的原理。
生产者投递给RabbitMQ的消息、消费者从RabbitMQ取出的消息,都会将这个消息的跟踪信息发送到一个默认的交换机上。
这个默认的交换机名称为 amq.rabbitmq.trace ,这是一个topic类型的交换机;发送到这个交换机上的消息的routingKey为 publish.实际发生投递原消息动作的交换机名称 或者 deliver.实际发生消费原消息动作的队列名称 。这两种routingKey可能不好理解,下面会有清晰的举例说明。
上面的图中,除了amq.rabbitmq.trace 交换机,其余的都是我们自定义的。请思考,现在我向exchange_test投递一个消息,然后从queue_test消