《kafka 核心技术与实战》课程学习笔记(八)

这篇具有很好参考价值的文章主要介绍了《kafka 核心技术与实战》课程学习笔记(八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

无消息丢失配置怎么实现?

  • Kafka 只对“已提交”的消息(committed message)做有限度的持久化保证。
    • 第一个核心要素是“已提交的消息”。
      • 当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,它们会告诉生产者程序这条消息已成功提交。
      • 可以选择只要有一个 Broker 成功保存该消息就算是已提交,也可以是令所有 Broker 都成功保存该消息才算是已提交。
    • 第二个核心要素就是“有限度的持久化保证”。
      • Kafka 不可能保证在任何情况下都做到不丢失消息。
      • Kafka 不丢消息是有前提条件的。假如你的消息保存在 N 个 Kafka Broker 上,那么这个前提条件就是这 N 个 Broker 中至少有 1 个存活。

消息丢失案例

案例 1:生产者程序丢失数据

  • 目前 Kafka Producer 是异步发送消息的,也就是说如果你调用的是 producer.send(msg) 这个 API,那么它通常会立即返回,但此时你不能认为消息发送已成功完成。
  • 如果用这个方式,可能会有哪些因素导致消息没有发送成功呢?
    • 网络抖动,导致消息压根就没有发送到 Broker 端;
    • 消息本身不合格导致 Broker 拒绝接收(比如消息太大了,超过了 Broker 的承受能力)。
  • 解决此问题的方法非常简单:
    • Producer 永远要使用带有回调通知的发送 API,也就是说不要使用 producer.send(msg),而要使用 producer.send(msg, callback)。

案例 2:消费者程序丢失数据

  • Consumer 端丢失数据主要体现在 Consumer 端要消费的消息不见了。
    • Consumer 程序有个“位移”的概念,表示的是这个 Consumer 当前消费到的 Topic 分区的位置。
      《kafka 核心技术与实战》课程学习笔记(八),消息队列,大数据开发基础,kafka,学习,笔记
    • 只要维持先消费消息,再更新位移的顺序即可。这样就能最大限度地保证消息不丢失。这种处理方式可能带来的问题是消息的重复处理。
  • 还存在一种比较隐蔽的消息丢失场景
    • Consumer 程序从 Kafka 获取到消息后开启了多个线程异步处理消息,而 Consumer 程序自动地向前更新位移。
    • 假如其中某个线程运行失败了,它负责的消息没有被成功处理,但位移已经被更新了,因此这条消息对于 Consumer 而言实际上是丢失了。
    • 这里的关键在于 Consumer 自动提交位移,你没有真正地确认消息是否真的被消费就“盲目”地更新了位移。
    • 这个问题的解决方案也很简单:如果是多线程异步处理消费消息,Consumer 程序不要开启自动提交位移,而是要应用程序手动提交位移。

最佳实践

  • 不要使用 producer.send(msg),而要使用 producer.send(msg, callback)。记住,一定要使用带有回调通知的 send 方法。
  • 设置 acks = all。
    • acks 是 Producer 的一个参数,代表了你对“已提交”消息的定义。
    • 如果设置成 all,则表明所有副本 Broker 都要接收到消息,该消息才算是“已提交”。
    • 这是最高等级的“已提交”定义。
  • 设置 retries 为一个较大的值。
    • 这⾥的 retries 同样是 Producer 的参数,对应 Producer 自动重试。
    • 当出现网络的瞬时抖动时,消息发送可能会失败,此时配置了 retries > 0 的 Producer 能够自动重试消息发送,避免消息丢失。
  • 设置 unclean.leader.election.enable = false。
    • 这是 Broker 端的参数,它控制的是哪些 Broker 有资格竞选分区的 Leader。
    • 如果一个 Broker 落后原先的 Leader 太多,那么它一旦成为新的 Leader,必然会造成消息的丢失。
    • 故一般都要将该参数设置成 false,即不允许这种情况的发生。
  • 设置 replication.factor >= 3。
    • 这也是 Broker 端的参数。
    • 其实这里想表述的是,最好将消息多保存几份,毕竟目前防止消息丢失的主要机制就是冗余。
  • 设置 min.insync.replicas > 1。
    • 这依然是 Broker 端参数,控制的是消息至少要被写入到多少个副本才算是“已提交”。
    • 设置成大于 1 可以提升消息持久性。
    • 在实际环境中千万不要使用默认值 1。
  • 确保 replication.factor > min.insync.replicas。
    • 如果两者相等,那么只要有一个副本挂机,整个分区就无法正常工作了。
    • 我们不仅要改善消息的持久性,防止数据丢失,还要在不降低可用性的基础上完成。
    • 推荐设置成 replication.factor = min.insync.replicas + 1。
  • 确保消息消费完成再提交。
    • Consumer 端有个参数 enable.auto.commit,最好把它设置成 false,并采用手动提交位移的方式。

文章来源地址https://www.toymoban.com/news/detail-602083.html

到了这里,关于《kafka 核心技术与实战》课程学习笔记(八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Redis 核心技术与实战》课程学习笔记(一)

    为了保证数据的可靠性,Redis 需要在磁盘上读写 AOF 和 RDB,但在高并发场景里,这就会直接带来两个新问题: 一个是写 AOF 和 RDB 会造成 Redis 性能抖动; 另一个是 Redis 集群数据同步和实例恢复时,读 RDB 比较慢,限制了同步和恢复速度。 其实,一个可行的解决方案就是使用

    2024年02月12日
    浏览(36)
  • 《Redis 核心技术与实战》课程学习笔记(五)

    那我们总说的 Redis 具有高可靠性,又是什么意思呢? 其实,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。 AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将⼀份数据同时保存在多个实例上。 即使有一个实例出现了故障,需要过一段时

    2024年02月13日
    浏览(34)
  • 《Redis 核心技术与实战》课程学习笔记(三)

    Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 多线程的开销 我们刚开始增加线程数时,系统吞吐率

    2024年02月12日
    浏览(31)
  • 《Redis 核心技术与实战》课程学习笔记(六)

    在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制。 哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。 监控 哨兵进程在运行时,周期性地给所有的主从库

    2024年02月13日
    浏览(34)
  • 《Redis 核心技术与实战》课程学习笔记(四)

    一旦服务器宕机,内存中的数据将全部丢失。目前,Redis 的持久化主要有两大机制,即 AOF 日志和 RDB 快照。 AOF 日志是如何实现的? 我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复

    2024年02月12日
    浏览(33)
  • 《MySQL 实战 45 讲》课程学习笔记(四)

    索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 哈希表 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。 哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位

    2024年02月14日
    浏览(32)
  • 《Kubernetes入门实战课》课程学习笔记(一)

    现在 Kubernetes 已经没有了实际意义上的竞争对手,它的地位就如同 Linux 一样,成为了事实上的云原生操作系统,是构建现代应用的基石。 现代应用是什么? 是微服务,是服务网格,这些统统要围绕着容器来开发、部署和运行。 使用容器就必然要用到容器编排技术,在现在只

    2024年02月17日
    浏览(59)
  • 唐宇迪机器学习实战课程笔记(全)

    机器学习模型的参数,不是直接数学求解,而是利用数据,进行迭代epoch,梯度下降优化求解。 目标:更好的拟合连续函数(分割连续样本空间的平面h(·)) ε ( i ) varepsilon^{(i)} ε ( i ) 是 真实值 y ( i ) y^{(i)} y ( i ) 与 预测值 h θ ( x ) = θ T x ( i ) h_theta (x)=theta^Tx^{(i)} h θ ​ ( x )

    2024年02月16日
    浏览(34)
  • 【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

    课程地址: 黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 1 - 2节) 开场白,HarmonyOS 的一个简介,话不多说,直接看图吧! 工欲善其事必先利其器,开发准备需要两件事:1、开发文档;2、开发工具 打开鸿蒙官方网站,

    2024年04月24日
    浏览(28)
  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[27]以太坊-反思

    目录 一、智能合约的反思         1.Is smart contract really smart?         2. Irrevocability is a double edged sword.         3. Nothing is irrevocable. 二、语言设计上的反思         1.Is solidity the right programming language?         2.编写智能合约的语言应该有什么样的表达力? 三

    2024年01月20日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包