• 欢迎来到本博客,希望可以y一起学习与分享

rabbitmq消息确认模式和幂等性

笔记 benz 来源:RabbitMQ入门5-消息确认模式和幂等性 2年前 (2021-04-18) 215次浏览 0个评论 扫描二维码
文章目录[隐藏]

1.消息确认模式

在RabbitMQ中,消息确认主要有生产者发生确认和消费者接收确认

1.1生产者发送确认

生产者发送消息到RabbitMQ服务器,如果RabbitMQ服务器收到消息,则会给生产者一个应答,用于告诉生产者该消息已经成功到达RabbitMQ服务器中

1.2消费者接收确认

用于确认消费者是否成功消费了该条消息
消息确认实现方式有两种

  1. 通过事务的方式
  2. confirm确认机制,因为事务模式比较消耗性能,在实际工作中用的也不多

2.生产者发送确认

2.1 开启confirm模式

当Channel.Confirm(noWait bool)参数设置为false时,broker会返回一个confirm.ok表示同意发送者将当前channel信道设置为confirm模式。
其他代码和transaction模式类似,只是没有Channel.TxCommit()和Channel.TxRollback()。

2.2 以confirm模式发送消息

消息拒绝

消息幂等性

消息幂等性其实就是保证同一个消息不被消费者重复消费两次
当消费者消费完之后,通常会发送一个ack应答确认消息给生产者
但是这中间有可能因为网络中断等原因,导致生产者未能收到确认消息,有此这条消息将被重复发送给消费者消费,实际上这条消息已经被消费过了,这就是重复消费的问题!!!

1.1 如何避免重复消费

  • 消息全局ID或者写个唯一标识 (时间戳,uuid等),每次消费消息之前根据消息id去判断该消息是否已被消费过,如果已经消费国,则不处理该消息,否则正常消费,并且进行入库操作(消息全局ID作为数据库表的主键,防止重复)
  • 利用redis的setnx命令,给消息分配一个全局ID,只要消费过该消息,将id message k:v 形式写入redis 消费者开始消费前 先去redis查询有没有消费记录

1.2 代码演示

生产者

消费者


文章 rabbitmq消息确认模式和幂等性 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!