从rabbitmq订阅流程看消费者丢失问题

背景

最近碰到rabbitmq两节点服务在脑裂恢复后队列消费者丢失问题,版本是3.9.7,在autoheal模式下运行。当触发断网,并且在nettick timeout时间附近恢复网络后,我发现投到某些队列里面的消息一直积压,不再deliver到消费者。其他表现:
1.在web管理页面看到,队列consumers不为空。但是通过rabbitmqctl list_queues consumers命令可以发现队列实际已经没有消费者了。
2.这些消费者缺失的队列有同一个特点:使用了镜像加持久属性
3.rabbitmq日志有触发autoheal重启节点,且重启前有mnesia数据库不一致告警

这个问题是相当致命的,因为没有明显的观察手段能看出集群异常或者队列消费者异常。类似问题先前碰到过,不过是路由绑定丢失,当时通过修改服务器源码临时解决。这里梳理下rabbitmq消费订阅、投递代码流程,看是否能有所帮助。

订阅流程

函数调用流程:
1.rabbit_channel:handle_method(#‘basic.consume’…)
rabbit_channel:basic_consume
2.rabbit_amqqueue:basic_consume
3.rabbit_queue_type:consume %%具体的队列类型消费接口
4.rabbit_classic_queue:consume %% classic经典类型队列的消费接口实现,调用队列进程的basic_consume
5.rabbit_amqqueue_process:handle_call({basic_consume…) %%到这里为止开始正式处理消费流程
5.1rabbit_queue_consumers:a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值