mq有可能发生重复消费,如何解决?

mq有可能发生重复消费,如何解决?

什么是MQ?

消息队列(MQ),是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

 MQ 的作用

MQ 可以用来实现削峰填谷,也就是使用它可以解决短时间内爆发式的请求任务,在不使用 MQ 的情况下会导致服务处理不过来,出现应用程序假死的情况,而使用了 MQ 之后可以把这些请求先暂存到消息队列中,然后进行排队执行,那么就不会出现应用程序假死的情况了,所以它的第一个应用就是商品秒杀以及产品抢购等使用场景,如下图所示:

1.1) 使用 MQ 实现消息通讯
使用 MQ 可以作为消息通讯的实现手段,利用它可以实现点对点的通讯或者多对多的聊天室功能。

点对点的消息通讯如下图所示:


1.2) 使用 MQ 实现日志系统
可使用 MQ 实现对日志的采集和转发,比如有多个日志写入到程序中,然后把日志添加到 MQ,紧接着由日志处理系统订阅 MQ,最后 MQ 将消息接收并转发给日志处理系统,这样就完成了日志的分析和保存功能,如下图所示:

常用的 MQ 中间件有 RabbitMQ、Kafka 和 Redis 等,其中 Redis 属于轻量级的消息队列,而 RabbitMQ、Kafka 属于比较成熟且比较稳定和高效的 MQ 中间件。
重复消息是什么回事,为何会产生重复消息 

① 消息生产者没有收到消息队列收到消息的应答,重试机制使得重复产生消息
比如网络故障导致应答消息丢失或者消息太多 ,应答消息传回受到阻塞,生产者等待超时
②消息已经到达消息队列,但发送给消费者的时候,没有收到来自消费者的回复消息,或者消息中间件更改消息状态出现问题

3:如何解决消息重复
通过幂等操作:不论操作多少次,操作的结果是确定的。
例如:幂等:update tab set count=10 where id=2
非幂等:update tab set count=count+1 where id=2

一般解决方案,一种是对消息的信息产生版本信息,对所有消息只有一个版本能处理成功

另一种是对消息的生产者中设定唯一索引,消费者得到消息的时候,以生产者的唯一索引为标准

还可以将已处理过的消息的唯一索引放到缓存中间件中,消费者在消费消息的时候,到缓存中检查是否已处理过,这样能提高系统性能。

  1. 比如,你拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

  2. 再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。

  3. 如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值