如何保证消息不被重复消费(消息消费的幂等性)
KafKa消息消费的流程
生产者发送消息到topic中,Partition将消息存储的时候,会给当前消息维护一个Offset标号,用来标记该消息在该partition中的位置(顺序),当消费者消费完这条消息之后,会将该消息的offset发送给zookeeper,broker会通过zookeeper随时获取消息消费的信息
kafka消费者组使用的消费模式是pull(拉)消费模式,消息消费的流程由消费者主动向生产者获取,他可以简化broker的设计,consumer可以自主控制消费消息的速率,同时consumer可以自己控制消费方式,积可批量消费也可逐条消费,同时还能选择不同的提交方式,从而实现不同的传输语义,但是pull模式不足之处就是,如果kafka没有数据,消费者可能会陷入循环中,一致等待数据到达,为了避免这种情况我,我们再我们的拉请求中有参数,允许消费者请求再等待数据到达的“长轮训”钟进行阻塞(并且可选的等待到给定的字节数,以确保大的传输大小)
kafka的消费者不是消费完一条数据就立马提交offset的,而是定时定期提交一次offset
如何保证消息队列消息消费的幂等性
这个需要根据业务场景来进行判断
- 数据要进行操作之前,根据当前数据的全局唯一id去redis中查询一下,如果当前缓存中的数据已经消费过了,那就不用消费了,等等