rabbit ConfirmSelect引发的血案

本文分析了在RabbitMQ中使用Confirm模式时,由于不当的锁使用而导致的死锁现象,详细解释了死锁产生的原因,并提出了通过异步处理接收消息来避免死锁的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在发包时使用 Confirm 模式处理消息确认, 在发消息时使用了锁,在处理接收到的消息时使用了同一把锁,导致了死锁的产生。
产生死锁的原因 ConfirmSelect 会等待消费者的收包事件处理完成,注意是处理完成而非收到消费者的确认信号。
伪代码
生产者:

lock(lockobj){
   代码1 
   ConfirmSelect(); //开启确认模式
   代码2
}

消费者

代码1
lock(lockobj){
代码2
}
代码3

当 消费者进入锁,执行到 ConfirmSelect 时,如果此时有消费者再处理 会等待消费者处理完成, 消费者 处理到lock(lockobj) 时等待 生产者 的锁释放,两者互相等待,导致了死锁。
最终引发心跳超时。
RabbitMQ.Client.Exceptions.OperationInterruptedException: The AMQP operation was interrupted: AMQP close-reason, initiated by Library, code=0, text=“End of stream”, classId=0, methodId=0, cause=System.IO.EndOfStreamException: Heartbeat missing with heartbeat == 60 seconds

既然知道了这个,那么这就可以优化一下了,接收到rabbit过来的包裹之后启用异步去处理,这样不会阻塞发包!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值