90、RabbitMQ如何确保消息发送?消息接收?

RabbitMQ如何确保消息发送?消息接收?

发送方确认机制

  • 信道需要设置为 confirm 模式,则所有在信道上发布的消息都会分配一个唯一 ID。
  • 一旦消息被投递到queue(可持久化的消息需要写入磁盘),信道会发送一个确认给生产者(包含消息唯一 ID)
  • 如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack (未确认) 消息给生产者。
  • 所有被发送的消息都将被 confirm(即 ack) 或者被nack一次。但是没有对消息被 confirm 的快慢做任何保证,并且同一条消息不会既被 confirm又被nack
  • 发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者,生产者的回调方法会被触发。
  • ConfirmCallback接口: 只确认是否正确到达 Exchange 中,成功到达则回调
  • ReturnCallback接口: 消息失败返回时回调

接收方确认机制

  • 消费者在声明队列时,可以指定noAck参数,当noAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(或者磁盘,持久化消息)中移去消息。否则,消息被消费后会被立即删除。
  • 消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作》。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
  • RabbitMQ不会为未ack的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是RabbitMQ允许消费者消费一条消息的时间可以很长。保证数据的最终一致性:
  • 如果消费者返回ack之前断开了链接,RabbitMQ 会重新分发给下一个订阅的消费者。 (可能存在消息重复消费的隐患需要去重)
相关推荐
驭渊的小故事4 分钟前
RabbitMQ 环境配置和 DirectRabbitConfig 的 SpringBoot 4.0.X 版本
spring boot·rabbitmq·java-rabbitmq
新思维软件1 小时前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据1 小时前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机8 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅9 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
ly76899 小时前
RabbitMQ 消费确认与预取:manual ack、reject、nack 与 QoS 的取舍
rabbitmq·死信队列·消息可靠性·消费确认·qos 预取
灯澜忆梦10 小时前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby
需要82611 小时前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
CS创新实验室13 小时前
为什么三台机器就能选出一个“带头大哥“?——Raft 一致性算法,一次讲透
分布式·操作系统
本人手速666+15 小时前
企微开发API如何设计客户冻结状态?WeComApi 在删除、投诉和异常客户场景中的自动化边界
运维·分布式·自动化·企业微信·企微外部群开发·wecomapi·企业微信二次开发