- 通过RabbitMQ的延时交换器插件实现消息延时触发,延时结束后消息push到队列,消费者开始消费消息。
- 我们项目中的商城模块待支付订单超时修改订单状态为已失效的功能就是通过以上逻辑实现。
- 消息消费完成后采用的是手动ack的方式
- 生产者产生消息正常,通过日志可以证明
- 消费者一直监听不到消息导致超时的订单状态未能及时变更
- 通过mq的管理后台进入队列查看绑定关系
- 查看是否存在绑定关系
备注: 我出现问题的点是队列和交换器没有绑定关系,导致交换器不知道该把消息路由到哪个队列 我手动添加了交换器和队列的绑定关系,再次下单,业务就正常了4.问题分析二:消息消费者未对消息进行确认,导致消息在队列中阻塞
- 查看队列中消息的情况,发现队列确实处于阻塞状态
- 查看消费端代码逻辑发现手动确认的方式存在问题,只对个别情况做了确认,其余的情况未做确认
- 图片一是之前的确认方式(注释掉的代码)
- 我将手动确认放在了消费端业务的最下边(catch的上一行代码)
我们在使用RabbitMQ是消费者监听不到消息或者消费端未能正常执行业务一般是如下原因导致: 1. 消息队列阻塞 2. 交换器和队列没有绑定关系或者绑定关系有问题 3. 在消息正常确认的情况下为了避免队列阻塞,我们一般会同时使用死性队列,让异常的消息进入死性队列,避免 业务队列阻塞
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)