Kafka优化
Kafka优化
1. 如何防止消息丢失
-
发送方: ack是 1 或者-1/all 可以防止消息丢失,如果要做到99.9999%,ack设成all,把min.insync.replicas配置成分区备份数
-
消费方:把自动提交改为手动提交。
2. 防止消息重复消费
一条消息被消费者消费多次。如果为了消息的不重复消费,而把生产端的重试机制关闭、消费端的手动提交改成自动提交,这样反而会出现消息丢失,那么可以直接在防止消息丢失的手段上再加上消费消息时的幂等性保证,就能解决消息的重复消费问题。
幂等性保证
- mysql 插入业务id作为主键,主键是唯一的,所以一次只能插入一条
- 使用redis或zk的分布式锁(主流的方案)
3.如何进行顺序消费
- 发送方:在发送时将ack不能设置 0 ,关闭重试,使用同步发送,等到发送成功再发送下一条。确保消息是顺序发送的。
- 接收方:消息是发送到一个分区中,只能有一个消费组的消费者来接收消息。因此,kafka的顺序消费会牺牲掉性能。
4.消息积压问题如何解决
- 问题:消息积压会导致很多问题,比如磁盘被打满、生产端发消息导致kafka性能过慢,就容易出现服务雪崩,就需要有相应的手段:
- 1 增大partion数量,
- 2 消费者加了并发服务, 扩大消费线程
- 3 增加消费组服务数量
- 4 kafka单机升级成了集群
- 5 避免消费者消费消息时间过长,导致超时
- 6 使Kafka分区之间的数据均匀分布
- 方案一:在一个消费者中启动多个线程,让多个线程同时消费。——提升一个消费者的消费能力(增加分区增加消费者)。[2]
- 方案二:如果方案一还不够的话,这个时候可以启动多个消费者,多个消费者部署在不同的服务- 器上。其实多个消费者部署在同一服务器上也可以提高消费能力——充分利用服务器的cpu资源。[3]
- 方案三:让一个消费者去把收到的消息往另外一个topic上发,另一个topic设置多个分区和多个消费者 ,进行具体的业务消费。[1]
5. 延迟队列
延迟队列的应用场景:在订单创建成功后如果超过 30 分钟没有付款,则需要取消订单,此时可用延时队列来实现
- 创建多个topic,每个topic表示延时的间隔
- topic_5s: 延时5s执行的队列
- topic_1m: 延时 1 分钟执行的队列
- topic_30m: 延时 30 分钟执行的队列
- 消息发送者发送消息到相应的topic,并带上消息的发送时间
- 消费者订阅相应的topic,消费时轮询消费整个topic中的消息
- 如果消息的发送时间,和消费的当前时间超过预设的值,比如 30 分钟
- 如果消息的发送时间,和消费的当前时间没有超过预设的值,则不消费当前的offset及之后的offset的所有消息都消费
- 下次继续消费该offset处的消息,判断时间是否已满足预设值
6. 学习来源
脚踏实地,注重基础。