Kafka如何防止消息丢失+如何防止消息重复消费

目录

如何防止消息丢失(消息的确认机制)

如何防止消息的重复消费

如何做到顺序消费


如何防止消息丢失(消息的确认机制)

其实就是消息的确认机制,我们从两个角度去思考:1.生产者这里(同步发送设置ack);2.消费者

(39条消息) Java代码实现kafka的消息生产与消费_Fairy要carry的博客-CSDN博客

生产者:当消息返回到生产者,返回ack,我们设置ack即可(-1,1,all)

-1:到broker就返回ack

1:到leader了就返回ack

all:需要同步给副本,同步完返回ack(设置同步的分区数>=2)

消费者:

把自动提交改为手动提交(自动提交时poll了之后直接提交offset,可能消息并没有消费)

(39条消息) kafka-offset手动提交和自动提交_Fairy要carry的博客-CSDN博客

这里我想到了mq的消息丢失从三方面思考还有它的消息延迟+消息堆积处理

(39条消息) RabbitMQ的高级特性(消息可靠性)_Fairy要carry的博客-CSDN博客

如何防止消息的重复消费

场景:如果生产者发送消息后因为消息的抖动问题导致没有收到ack导致进行retry操作导致恢复后broker收到多条消息(常见下单业务,转账业务)

解决:实际上就是解决我们的幂等性的问题,我们可以利用mysql和token两种方式

(39条消息) 幂等性的处理_Fairy要carry的博客-CSDN博客

mysql:

创建一个唯一索引,当重复插入就会报错

分布式锁:

使用分布式锁,以业务id作为锁资源,Redission.lock(order.id),第一条记录可以成功,第二条失败

(39条消息) mysql分布式锁的实现_Fairy要carry的博客-CSDN博客

(39条消息) Redis分布式锁的实现_Fairy要carry的博客-CSDN博客

如何做到顺序消费

Kafka如何防止消息丢失+如何防止消息重复消费_第1张图片

 生产者:首先得确保顺序消费,将ack设置为1/all,关闭retry防止重复消费,确保成功发送后再发下一条

 消费方:消息是发送到一个分区中的,只能有一个消费组中的消费者来消费消息

Kafka如何防止消息丢失+如何防止消息重复消费_第2张图片

 


解决消息积压问题

MQ消息堆积的解决问题 

(39条消息) MQ-消息堆积问题_Fairy要carry的博客-CSDN博客_mq消息堆积

 

你可能感兴趣的:(kafka,kafka,java,分布式)