一、kafka在使用的时候还是会存在一些问题的,这里主要是记录kafka的优化方式,以及带来的问题。
二、防止消息丢失和重复消费
1、防止数据丢失
1)发送方:ack设置为1或者-1/all,把min.insyc.replicas设置为分区数。(目的:ack为1主要是保证分区leader备份数据,ack为-1/all的情况下保证整体的leader和follow都进行备份,防止丢失)
2)接收方:自动提交改成手动提交(目的:避免系统自动是,出现后台消费异常导致的数据丢失)
2、重复消费
1)关闭生产端的重试机制,消费端设置成手动提交。(目的:生产端避免重复发送,消费端:防止异常重复消费)这里会导致一个问题,就是丢失数据的问题,可以在防止消息消息的基础上,加上消费消息时幂等性。
2)幂等性:a、mysql通过主键ID插入,主键ID唯一来保证。b、使用redis或者ZK的分布式锁。
三、如何顺序消费(牺牲性能)
1、发送方:ack不设置为0,关闭重试,采用同步方式发送,等到消息成功后发送下一条。
2、接收方:发送方将消息发送到一个分区,只有一个消费组来进行消费。
四、解决消息积压问题
1、产生原因:消费者消费消息的速度远赶不上生产者生产的速度。kafka内部消息开始堆积,最终可能导致雪崩。
2、解决方案:
1)在消费者中使用多线程,提高消费能力。
2)创建过个消费组,多个消费者,部署到不同的机器,提高消费能力。
3)同一个组,建立另外的主体和分区,在主消费的poll下来数据后,不进行处理,直接转发到新的主体,进行消费,提高性能。
五、延时队列
1、使用场景:订单30分钟没有付款,需要取消订单等。
2、消息发送者发送消息时带上消费发送的时间。
3、消费者在进行(轮询)消费的时候,通过时间进行相关的逻辑处理。否者利用kafka的offset机制记录未消费的下标,后期进行下次消费判断。