如何保证消息的可靠性传输?

即传递的数据不能多一条,也不能少一条。不能多,也就是消息消费的重复性和幂等性问题。

不能少,也是说数据不能弄丢了。也就是如何处理消息丢失的问题?

消费端弄丢数据

唯一可能导致消费者弄丢数据的情况,就是说,你消费到了这个消息,然后消费者那边自动提交了 offset,让 Kafka 以为你已经消费好了这个消息,但其实你才刚准备处理这个消息,你还没处理,你自己就挂了,此时这条消息就丢咯。

这不是跟 RabbitMQ 差不多吗,大家都知道 Kafka 会自动提交 offset,那么只要关闭自动提交 offset,在处理完之后自己手动提交 offset,就可以保证数据不会丢。但是此时确实还是可能会有重复消费,比如你刚处理完,还没提交 offset,结果自己挂了,此时肯定会重复消费一次,自己保证幂等性就好了。

生产环境碰到的一个问题,就是说我们的 Kafka 消费者消费到了数据之后是写到一个内存的 queue 里先缓冲一下,结果有的时候,你刚把消息写入内存 queue,然后消费者会自动提交 offset。然后此时我们重启了系统,就会导致内存 queue 里还没来得及处理的数据就丢失了。


kafka弄丢数据

这块比较常见的一个场景,就是 Kafka 某个 broker 宕机,然后重新选举 partition 的 leader。大家想想,要是此时其他的 follower 刚好还有些数据没有同步,结果此时 leader 挂了,然后选举某个 follower 成 leader 之后,不就少了一些数据?这就丢了一些数据啊。

生产环境也遇到过,我们也是,之前 Kafka 的 leader 机器宕机了,将 follower 切换为 leader 之后,就会发现说这个数据就丢了。

所以此时一般是要求起码设置如下 4 个参数:

  • 给 topic 设置 replication.factor 参数:这个值必须大于 1,要求每个 partition 必须有至少 2 个副本。
  • 在 Kafka 服务端设置 min.insync.replicas 参数:这个值必须大于 1,这个是要求一个 leader 至少感知到有至少一个 follower 还跟自己保持联系,没掉队,这样才能确保 leader 挂了还有一个 follower 吧。
  • 在 producer 端设置 acks=all :这个是要求每条数据,必须是写入所有 replica 之后,才能认为是写成功了
  • 在 producer 端设置 retries=MAX (很大很大很大的一个值,无限次重试的意思):这个是要求一旦写入失败,就无限重试,卡在这里了。

生产环境按照上述要求配置,这样配置之后,至少在 Kafka broker 端就可以保证在 leader 所在 broker 发生故障,进行 leader 切换时,数据不会丢失。

生产者会不会弄丢数据?

如果按照上述的思路设置了 acks=all ,一定不会丢。

要求是,你的 leader 接收到消息,所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条件,生产者会自动不断的重试,重试无限次。

如何保证kafka消息的可靠性传递?相关推荐

  1. Kafka消息的可靠性

    没有一个中间件能够做到百分之百的完全可靠,可靠性更多的还是基于几个9的衡量指标,比如4个9.5个9. 软件系统的可靠性只能够无限去接近100%,但不可能达到100%.所以kafka如何是实现最大可能的 ...

  2. 保证RabbitMQ消息的可靠性总结

    文章目录 一.关于消息的可靠性 二.生产者发送消息对象 三.将消息发送给交换机 四.将消息发送给队列 五.将消息发送给消费者 六.保证消息的幂等性 七.死信消息的补偿[存在问题,待完善] 一.关于消息 ...

  3. 消息队列面试 - 如何保证消息的可靠性传输?

    消息队列面试 - 如何保证消息的可靠性传输? 面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条 ...

  4. RabbitMQ(十):RabbitMQ 如何保证消息的可靠性

    一条消费成功被消费经历了生产者->MQ->消费者,因此在这三个步骤中都有可能造成消息丢失. 一 消息生产者没有把消息成功发送到MQ 1.1 事务机制 AMQP协议提供了事务机制,在投递消息 ...

  5. RabbitMQ 如何保证消息的可靠性

    一条消费成功被消费经历了生产者->MQ->消费者,因此在这三个步骤中都有可能造成消息丢失. 一 消息生产者没有把消息成功发送到MQ 1.1 事务机制 AMQP协议提供了事务机制,在投递消息 ...

  6. Kafka 消息可靠性

    在 Kafka 工作机制 一文提及了 Kafka 消息的不可靠性.本文就 Kafka 消息的三种不可靠性(重复.丢失.乱序),分析它们出现的内部原因和解决办法. 作者:王克锋 出处:https://k ...

  7. kafka架构与原理 ,消息的可靠性与一致性幂等性,数据存储、zookeeper、使用场景

    一.Kafka概述 Kafka作为一个商业级消息中间件 ,发布和订阅记录流,它类似于一个消息队列 先了解下Kafka的基本原理,然后通过对kakfa的存储机制.复制原理.同步原理.可靠性和持久性保证等 ...

  8. IM即时通讯-N-如何保证消息的可靠性展示

    结论先行 客户端如何在推拉结合的模式下保证消息的可靠性展示? 原则: server拉取的消息一定是连续的 原则: 端侧记录的消息的连续段有两个作用: 1. 记录消息的连续性, 即起始中间没有断层, 2 ...

  9. kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...

    写在开头: 本章是Kafka学习归纳第五部分,着重于强调Kafka的事一致性保证,消息重复消费场景及解决方式,记录偏移量的主题,延时队列的知识点. 文章内容输出来源:拉勾教育大数据高薪训练营. 一致性 ...

  10. Rabbitmq专题:rabbitMQ如何保证消息的可靠性投递?如何防止消息丢失

    文章目录 1. 消息可能出现丢失的情况 2. 生产者如何保证消息的可靠性投递 2.1 消息落库打标 + confirm机制 2.2 消息幂等性如何保证? 2.3 延时消息确认 3. rabbitMQ服 ...

最新文章

  1. Mybatis的各种查询功能
  2. “中台不就是微服务吗?有啥区别?”
  3. nginx gzip配置
  4. python 倒计时功能怎么用print实现_python 实现倒计时功能(gui界面)
  5. Context类(上下文)
  6. mac回退jdk版本_mac中不同jdk版本切换
  7. python亲密度_Python OpenCV 图像2D直方图,取经之旅第 25 天
  8. Spring Boot基础学习笔记19:自定义RedisTemplate与RedisCacheManager
  9. linq to access 简单实现
  10. 洛谷——P1830 轰炸III
  11. 在C++中各类型拼接成一个string
  12. dentry path_lookat dput
  13. Ekho TTS 5.1发布
  14. c语言源程序的基础单位,c源程序的基本单位是什么
  15. notepad++ 设置保护色
  16. 盘点火影中写轮眼谁最强
  17. 马建威android视频,5.25春季班高级班第三期第五节课课堂总结
  18. WinX菜单是Win8系统开始菜单的下一代
  19. Springcloud入门第二篇
  20. codeforces 1509 B. TMT Document

热门文章

  1. 分布式事务解决方案之可靠消息最终一致性
  2. Java创建多线程的方法总结
  3. spring的beanDefinition是什么
  4. servlet 之forward和sendRedirect跳转
  5. [sublime系列文章] sublime text 3构建系统
  6. Vue实现左右菜单联动实现(更新)
  7. 造假家族覆灭记:警方联合阿里斩断涉案三千万假耐克产销链
  8. jQuery做的自定义选项卡
  9. 【Access2007】将Excel表导入至Access2007的当中一张已存在的表之中
  10. margin:0 auto和text-aglin:center的区别