《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 分区的位置。
      在这里插入图片描述
    • 只要维持先消费消息,再更新位移的顺序即可。这样就能最大限度地保证消息不丢失。这种处理方式可能带来的问题是消息的重复处理。
  • 还存在一种比较隐蔽的消息丢失场景
    • 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,并采用手动提交位移的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识图谱项目——红色文化之张学良人物知识图谱(Neo4j+vue+flask+mysql实现)

张学良人物简史知识图谱_说明文档 本项目为人工智能专业大三知识图谱课程期末作业。意在完成一个以张学良为背景的红色文化类知识图谱。文末放上本项目的代码地址。 文章目录 张学良人物简史知识图谱_说明文档:rocket:前端:rocket:后端:rocket:中间件:rocket:数据库:rocket:服…

Linux常用命令——free命令

在线Linux命令查询工具 free 显示内存的使用情况 补充说明 free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 语法 free(选项)选项 -b # 以Byte为单位显示内存使用情况; -k # 以KB为单位显示内存使用情况…

【云原生】二进制部署k8s集群(中)搭建node节点

连接上文 在上文已经成功部署了etcd分布式数据库、master01节点, 本文将承接上文的内容,继续部署Kubernetes集群中的 worker node 节点和 CNI 网络插件 1. 部署 Worker Node 组件 1.1 work node 组件部署前需了解的节点注册机制 kubelet 采用 TLS Bo…

设计模式-05.01-行为型-观察者模板

观察者模式【常用】 我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,…

JavaWeb之tomcarHTTP

1 DOM4j Xml解析 1.1 JAXP  JDK内置,不需要导入第三方jar包,简单工具优先选择。  支持两种解析方式:DOM、SAX 1.1.1 JAXP—DOM 加载xml 生成一个DOM树。获得整个文档的描述对象Document 解析 api 获得工厂 DocumentBuilderFactory –》 …

Android adb shell命令捕获systemtrace

Android adb shell命令捕获systemtrace (1)抓取trace文件: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory -t 时长,20s&a…

通过使用Mybatis插件来实现数据的分页功能

目录 背景一、SpringBoot的后端1、手动拼接SQL来实现2、使用Mybatis插件来实现 二、Vue-cli的前端:请求响应跟踪 三、在使用Mybatis插件进行多表查询(表数大于2)出现的问题1. SQL解决2.后端查询方式改变成嵌套查询 四、 分页总结 背景 分页: 如果一次性的查询全部数据, 响应时…

高级数据结构——平衡二叉树(AVL树)

目录 1. 底层结构 2. AVL数的概念 3. AVL树节点的定义 4. 基本框架 5. AVL树的插入 6. AVL树的旋转 6.1 左单旋 6.2 右单旋 6.3 左右双旋 6.4 右左双旋 7. AVL树的验证 8. AVL树的查找 9. AVL树的删除 10. AVL树的性能 11. 总代码 11.1 AVLTree 11.2 Test.c…

SuperMap GIS基础产品移动GIS FAQ集锦(3)

SuperMap GIS基础产品移动GIS FAQ集锦(3) 【iMobile】网络分析中设置权值字段,如何添加多个权值字段? 【解决办法】通过权值字段集合类(WeightFieldInfos)设置,该类是权值字段信息对象&#x…

【AI】Stable-Diffusion-WebUI使用指南

注:csdn对图片有审核,审核还很奇葩,线稿都能违规,为保证完整的阅读体验建议移步至个人博客阅读 最近AI绘画实现了真人照片级绘画水准,导致AI绘画大火,公司也让我研究研究,借此机会正好了解一下…

django旅游推荐系统-计算机毕设 附源码82884

django旅游推荐系统 摘 要 随着社会的快速发展和人们生活水平的不断提高,旅游已逐渐成为人们生活的重要组成部分,用户能够获取旅游信息的渠道也随信息技术的广泛应用而增加。大量未经过滤的信息在展示给用户的同时,也淹没了用户真正感兴趣的信…

配置NIS服务器及客户端

在服务端安装所需软件包 设置主机名和NIS域名 编辑 NIS服务器主配置文件 最下面编辑访问控制 建立测试用户 配置NFS,否则客户端切换用户时,用户没有家目录 安装NFS所需软件包 Nfs-utils 给两个共享目录权限,编辑NFS配制文件 共享两个目录 重…

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结: 前言: C的学习难度大,内容繁多。因此我们要及时掌握C的各种特性,因此我们更新本篇文章,向…

【数据管理架构】什么是 OLTP?

OLTP(在线事务处理)支持在 ATM 和在线银行、收银机和电子商务以及我们每天与之交互的许多其他服务背后进行快速、准确的数据处理。 什么是 OLTP? OLTP 或在线事务处理允许大量人员(通常通过 Internet)实时执行大量数据…

【SpringCloud-5】gateway网关

网关是干啥用的就不用再说了。 sringcloud中的网关,第一代是zuul,但是性能比较差(1.x是阻塞式的,2.x是基于Netty的),然后有了第二代GateWay,基于Reactor模型 异步非阻塞。 springcloud网关就是一…

C++智能指针

RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源的技术 不需要显示的释放资源对象的资源在其生命周期类保持有效 通常控制的资源:动态申请的内存、文件描述符、互斥量、网络连接等 在对象构造时…

多线程/std::thread线程退出方式详解

文章目录 概述不 join 也不 detach执行了detach并不能万事大吉建议使用 join 函数 概述 这里默认你已经了解 std::thread 类的基本使用,和WinAPI多线程编程中 “如何优雅的退出线程” 等相关知识。阅读该文前,建议先看看《多线程 /C 11 std::thread 类深…

python、pyqt5实现人脸检测、性别和年龄预测

摘要:这篇博文介绍基于opencv:DNN模块自带的残差网络的人脸、性别、年龄识别系统,系统程序由OpenCv, PyQt5的库实现。如图系统可通过摄像头获取实时画面并识别其中的人脸表情,也可以通过读取图片识别,本文提供完整的程…

【IIS建站教程】windows本地搭建web服务,内网穿透发布公网访问

✨个人主页:bit me👇 目 录 🐾1.前言💐2.Windows网页设置🌸2.1 Windows IIS功能设置🌷2.2 IIS网页访问测试 🍀3. Cpolar内网穿透🌹3.1 下载安装Cpolar🌻3.2 Cpolar云端设…

【Leetcode60天带刷】day36——56. 合并区间,738.单调递增的数字

​ 题目: 56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1:…