Kafka线上问题优化

1.如何防止消息丢失

  • 生产者:1)使用同步发送 2) 把ack设置成1或者all,并且同步的分区数 >= 2
  • 消费方:把自动提交改为手动提交。

( 1 )acks=0: 表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消息。
( 2 )acks=1: 至少要等待leader已经成功将数据写入本地log,但是不需要等待所有follower是否成功写入。就可以继续发送下一条消息。这种情况下,如果follower没有成功备份数据,而此时leader又挂掉,则消息会丢失。
( 3 )acks=-1或all: 需要等待 min.insync.replicas(默认为 1 ,推荐配置大于等于2) 这个参数配置的副本个数都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。这是最强的数据保证。一般除非是金融级别,或跟钱打交道的场景才会使用这种配置。

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

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

幂等性如何保证:
mysql 插入业务id作为主键,主键是唯一的,所以一次只能插入一条
使用redis或zk的分布式锁(主流的方案)

说说你的项目中怎么防止消息的重复消费
对于每个消息都有一个全局唯一的ID对应。
消费者消费时回去redis查询,第一次消费因为redis没有此id,可以消费,消费完将全局id存入redis中,
第二次消费相同的消息时,发现redis已经有此ID ,不消费丢弃该消息。

3.如何做到顺序消费

一个topic对于一个partition
发送消息时指定partition

发送方:保证消息顺序消费,且消息不能丢失,使用同步发送,ack不能设置为0
kafka:一个topic对于一个partition,发送消息时指定partition
接收方:消费者组只能有一个消费者

我的项目不用考虑顺序消费
kafka的顺序消费会牺牲掉性能。

4.解决消息积压问题

在这里插入图片描述

在这里插入图片描述

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

如果是因为本身消费能力较弱,我们可
以优化下消费逻辑,比如之前是一条一条消息消费处理的,
这次我们批量处理,比如数据库的插入,一条一条插和批量插效率是不一样的。
在这里插入图片描述

5.延迟队列

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

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

topic_5s: 延时5s执行的队列
topic_1m: 延时 1 分钟执行的队列
topic_30m: 延时 30 分钟执行的队列

消息发送者发送消息到相应的topic,并带上消息的发送时间

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

如果消息的发送时间,和消费的当前时间超过预设的值,比如 30 分钟
如果消息的发送时间,和消费的当前时间没有超过预设的值,则不消费当前的offset及之后的offset的所有消息都消费
下次继续消费该offset处的消息,判断时间是否已满足预设值

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka 的性能和吞吐量可以通过调整一些来进行优化。以下是一些常见的 Kafka 参数,您可以根据您的需求和环境进行优化: 1. `num.network.threads` 和 `num.io.threads`:这两个参数控制 Kafka 网络处理和磁盘 I/O 的线程数。根据您的机器配置和负载情况,您可以适当增加这些参数的值来提高性能。 2. `socket.send.buffer.bytes` 和 `socket.receive.buffer.bytes`:这两个参数控制 Kafka 生产者和消费者的套接字发送和接收缓冲区大小。根据网络环境和数据传输量,您可以适当调整这些参数的值。 3. `num.partitions`:这个参数控制 Kafka 主题的分区数。较少的分区数可能限制并发处理能力,而较多的分区数可能会增加磁盘使用量。根据负载情况和消费者数量,您可以适当调整这个参数的值。 4. `log.retention.hours` 和 `log.retention.bytes`:这两个参数控制 Kafka 日志文件保留的时间和大小。根据您的数据保留策略和磁盘空间限制,您可以适当调整这些参数的值。 5. `message.max.bytes` 和 `replica.fetch.max.bytes`:这两个参数控制 Kafka 消息和副本的最大大小。根据您的消息大小和网络带宽,您可以适当调整这些参数的值。 6. `default.replication.factor`:这个参数控制 Kafka 主题的默认复制因子。根据您的容错需求,您可以适当调整这个参数的值。 7. `auto.create.topics.enable`:这个参数控制是否允许自动创建主题。根据您的需求,您可以启用或禁用自动创建主题。 这只是一些常见的 Kafka 参数,实际上还有其他参数可以进行优化。您可以根据您的具体需求和环境进行实验和调整。在调整参数之前,请确保了解每个参数的含义和影响,并在测试环境中进行适当的测试和性能评估。此外,了解 Kafka 相关文档和社区资源也是优化 Kafka 性能的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值