Kafka出现的丢包和重发问题01

一. Kafka出现的问题

          问题:Kafka是当下流行的高并发消息中间件,能够高效并实时的吞吐数据,而且通过副本冗余机制保证了数据安全。

                     但还是会出现  丢包 or 重复消费  问题

二.Kafka生产消息流程   

2.1  生产者命令

         创建主题时,就已经指定了分区数 副本数

         sh kafka-console-producer.sh        --broker-list IP:PORT        --topic topic_name

3.1 生产消息流程(以指定分区的为例)

         |—— producer根据指定的partition方法(round-robin hash),将消息发布到指定topic的partition里面

         2.1 查找: Producer从zk的/brokers/..state节点中查找该分区的leader

         2.2 发送:Producer发送消息到leader,并记录到本地log

         2.3 拉取:follower从leader拉取消息后,记录到本地log,并向leader发ack消息

         2.4 更新: leader收到所有ISR所有的ack确认后,更新HW             

三.Kafka消费消息流程

         3.1 fetch: Consumer发送FetchRequest到leader所在的broker

         3.2 查找:Broker获取消息的start offset和size,查找相应的消息———根据offset查找message

         3.3 提交:Consumer  fetch到消息后,提交偏移量

四. Kafka出现的丢包问题,如何保证不丢

        (1s内丢进了5w条数据,持续几分钟)

           场景:某时间端用户流量激增,导致服务器网卡爆满,磁盘卡死等

           解决:首先对kafka限速,其次启动重试机制(leader收到所有ISR的ack消息后,更新HW点,向Client发送ack消息)

五. Kafka出现的重发问题,如何保证不重

           根本原因:根本原因是Kafka已经消费了数据,但是没有提交offset序列号

                 场景:1. Consumer消费一条数据平均需要200ms时间,某时刻用户流量激增

                                Consumer取出一批数据进行消费,但是在session.timeout.ms时间之内没有消费完成

                                导致consumer coordinator挂掉,kafka的自动提交失败(offset不再更新),Client重新分配分区

                                此时重新分配分区的Consumer重复消费了之前发送的数据

                            2. 消费逻辑 与 业务逻辑在一个线程处理,可能会出现业务逻辑阻塞,导致session超时

                     解决:增加partition数量,提高Consumer并发能力 

                                适当延长session.timeout.ms的时间

                                对于单partition的Consumer线 程,设置一个线程池提高并发能力

                                减少每次从分区中获取的 数据分片的大小

                                offset手动处理,业务逻辑成功后,再提交offset

                                通过数据库 或 redis,保证数据唯一(唯一索引,先查询是否存在) ——效率低

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值