消息队列如何保证消费幂等性?

本文探讨了消息队列中如何保证消息消费的幂等性,以防止重复消费导致数据错误。通过分析Kafka的offset机制可能引发的问题,提出了三种结合业务的幂等性实现思路:(1)消费前先查询数据库避免重复插入;(2)利用Redis的set操作保证幂等性;(3)通过生产者发送带有唯一ID的消息,消费者在处理前检查ID是否已消费。总结指出,Broker本身不提供重复消息过滤,幂等性保障需要在生产者和消费者层面实现。
摘要由CSDN通过智能技术生成

如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

其实这个很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是MQ领域的基本问题,其实本质上还是使用消息队列如何保证幂等性,这个是架构里要考虑的一个问题。

任何一个MQ都可能会出现重复消费的问题,进而引发数据出错。
重复消费引发程序出错的场景:
kafka实际上有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的offset来继续消费吧。

但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset,尴尬了。重启之后,少数消息会再次消费一次。

其实重复消费不可怕,可怕的是你没考虑到重复消费之后,怎么保证幂等性
给你举个例子吧。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据?

一条数据重复出现两次,数据库里就只有一条数据&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值