Kafka线上问题优化

1. 如何防止消息丢失

  • 发送方:ack是1或-1/all可以防止消息丢失,如果要做到99.9999%,ack=all,把min.insync.replicas配置成分区备份数
  • 消费方:自动提交改为手动提交

2. 如何防止消息的重复消费

一条消息被消费者消费多次,。如果为了消息的不重复消费,而把生产端的重试机制关闭,消费端的手动提交改为自动提交,这样反而会出现消息丢失。那么可以直接在防止消息丢失的手段上加上消费消息时的幂等性特保证,便能解决重复消费的问题。

复制代码
幂等性如何保证:
  • MySQL插入业务id作为主键,主键是唯一的,所以一次只能插入一条
  • 使用Redis或zk的分布式锁(主流解决方案)

3.如何做到顺序消费

  • 发送方:在发送时将ack不能设置为0,关闭重试。使用同步发送,等到发送成功再发送下一条,确保消息时顺序发送的。
  • 接收方:消息时发送到一个分区中,只能有一个消费者组的消费者接收消息。
    kafka的顺序消费会牺牲部分性能。

4.解决消息积压问题

消息积压会导致很多问题,比如:磁盘被打满、生产端发消息导致kafka性能过慢,就容易出现服务雪崩,就需要相应的处理手段。

  • 方案一:在一个消费者中启动多个线程,让多个线程同时消费。提升一个消费者的消费能力。
  • 方案二:如果方案一还不够的话,这时候可以启动多个消费者,多个消费者部署到不同的机器上。其实,多个消费者部署在同一服务器上也可以提高消费能力,充分利用服务器的CPU资源。
  • 方案三:让一个消费者去把收到的消息往另外一个topic上发,另一个topic设置多个分区和多个消费者,进行具体的业务消费。

5.延迟队列

延迟队列的应用场景:在订单创建成功后如果超过30分钟没有付款,则需要取消订单,此时用延时队列来创建

  • 创建多个topic,每个topic表示延时的间隔

    • topic_5s:延时5s执行的队列
    • topic_1m:延时1分钟执行的队列
    • topic_30m:延时30分钟执行的队列
  • 消息发送者发送消息到相应的topic,并带上消息的发送时间

  • 消费者订阅相应的topic,消费时轮询消费整个topic中的消息

相关推荐
Lansonli1 小时前
大数据Spark(六十七):Transformation转换算子distinct和mapValues
大数据·分布式·spark
失散136 小时前
分布式专题——35 Netty的使用和常用组件辨析
java·分布式·架构·netty
奔跑吧邓邓子7 小时前
【C++实战(78)】解锁C++ 大数据处理:从并行到分布式实战
c++·分布式·实战·并发·大数据处理
Jolie_Liang7 小时前
证券业智能化投研与分布式交易系统架构:全球发展现状、技术创新与未来趋势研究
分布式·系统架构
2301_772093568 小时前
tuchuang_myfiles&&share文件列表_共享文件
大数据·前端·javascript·数据库·redis·分布式·缓存
gsfl14 小时前
Redis分布式锁
数据库·redis·分布式
岁岁岁平安19 小时前
分布式系统相关概念(单体、集群、分布式、分布式集群、微服务)
分布式·微服务
不太可爱的叶某人20 小时前
【学习笔记】kafka权威指南——第7章 构建数据管道(7-10章只做了解)
笔记·学习·kafka
会开花的二叉树1 天前
C++分布式语音识别服务实践
c++·分布式·语音识别
u0104058361 天前
电商返利APP的秒杀活动架构:如何通过本地缓存(Caffeine)+ 分布式锁应对瞬时高并发?
分布式·缓存·架构