RabbitMQ–扩展–10–消息追踪
1、介绍
1.1、RabbitMQ 消息异常丢失的情况
- 可能是生产者与Broker断开了连接并且也没有任何重试机制
- 可能是消费者在处理消息时发生了异常,不过却提前进行了ack
- 可能是交换机并没有与任何队列进行绑定,生产者感知不到或者没有采取相应的措施
- 可能是RabbitMQ 本身的集群策略导致消息的丢失
1.2、为什么使用消息追踪
我们需要有一个良好的机制来跟踪记录消息的投递过程,以此协助开发或者运维人员快速地定位问题。
2、Firehose
2.1、介绍
在RabbitMQ 中可以使用Firehose功能来实现消息追踪,Firehose 可以记录每一次发送或者消费消息的记录,方便RabbitMQ 的使用者进行调试、排错等。
2.2、原理
Firehose 将生产者投递给RabbitMQ的消息,或者RabbitMQ 投递给消费者的消息按照指定的格式发送到一个默认的交换机上
2.2.1、默认的交换机
名称
amq.rabbitmq.trace
类型
topic
2.2.2、消息发送到交换机(amq.rabbitmq.trace)的路由键名称如下
- publish.{exchangename}
- exchangename:交换机名称
- deliver.{queuename}
- queuename:队列名称
2.3、过程
在Firehose开启状态下,当有客户端发送或者消费消息时,Firehose会自动封装相应的消息体,并添加相应的headers属性
2.3.1、发送消息
将"trace test payload"这条消息发送到交换机exchange来说,Firehore会将其封装成如下图所示的内容。
2.3.2、消费消息
在消费消息时(队列名称queue),会将这条消息封装成如下图所示的内容。
3、Firehose 命令
3.1、开启Firehose
rabbitmqctl trace on [-p vhost]
- [-p vhost] 是可选参数,用来指定虚拟主机vhost。
3.2、关闭Firehose
rabbitmqctl trace off [-p vhost]
- Firehose 默认状态:关闭状态
- Firehose 的状态是非持久化的,会在 RabbitMQ服务重启的时候还原成默认的状态。
- Firehose 开启之后多少会影响RabbitMQ 整体服务的性能,因为它会引起额外的消息生成、路由和存储。
4、rabbitmq_tracing 插件
- rabbitrnq_tracing插件 相当于Firehose的GUI版本
- 可以 跟踪RabbitMQ中消息的流入流出情况。
- 可以 对流入流出的消息进行封装, 然后将封装后的消息日志存入相应的trace文件之中。
5、环境
5.1、机器
# 在机器1执行命令
docker run -d --hostname rabbit1 --net=host --name myrabbit1 rabbitmq:3.8-management-alpine
# 添加用户 admin,密码 123456
docker exec myrabbit1 rabbitmqctl add_user admin 123456
# 给admin用户分配 administrator角色
docker exec myrabbit1 rabbitmqctl set_user_tags admin administrator
# 设置 分区为/,拥有对所有资源的 读写配置权限
docker exec myrabbit1 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
5.2、安装插件
docker exec myrabbit1 rabbitmq-plugins enable rabbitmq_tracing
5.3、新建队列,交换机,和他们之间的绑定
eujian.queue
eujian.exchange
eujian.routKey
6、测试
6.1、新建2个Traces
6.2、新建2个Traces后会多出2个队列
6.3、发送消息
内容
{
"channel": 1,
"connection": "<rabbit@rabbit1.1665122442.8664.0>",
"exchange": "eujian.exchange",
"node": "rabbit@rabbit1",
# 消息体,是加密的内容
"payload": "MTExMTE=",
"properties": {
"delivery_mode": 2,
"headers": {}
},
"queue": "none",
"routed_queues": [
"eujian.queue"
],
"routing_keys": [
"eujian.routKey"
],
"timestamp": "2022-10-07 7:32:47:529",
"type": "published",
"user": "admin",
"vhost": "/"
}