kafka 消息防丢失/消息防重复设计分析

说明

  1. 本文基于 kafka 2.7 编写。
  2. @author blog.jellyfishmix.com / JellyfishMIX - github
  3. LICENSE GPL-2.0

消息语意

消息语义(诉求)有三种。分别是: 消息最多传递一次(消息不重复), 消息最少传递一次(消息不丢失), 消息有且仅有一次传递(消息不重复且不丢失)。

  1. 消息最多传递一次(消息不重复),: 消息最多传递一次,可能会丢,但不会重复。适用于高并发量、高吞吐,但是对于消息的丢失不是很敏感的场景。
  2. 消息最少传递一次(消息不丢失): 消息不丢失,但有可能重复。适用于并发量一般,对于消息重复传递不敏感的场景。
  3. 消息有且仅有一次传递(消息不重复且不丢失): 适用于对消息可靠性要求高,且对吞吐量要求不高的场景。

kafka 如何做到消息不丢失

producer 不少生产消息,borker 服务端不丢失消息,consumer 也不能少消费消息。

producer: 不少生产消息

以下是为了保证消息不丢失,生产端需要配置的参数和相关使用方法。

  1. 要使用带回调方法的 api:
Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback)

使用带有回调方法的 API 时,我们可以根据回调函数得知消息是否发送成功,如果发送失败了,我们要进行异常处理,比如把失败消息存储到本地硬盘或远程数据库,等应用正常了再发送,这样才能保证消息不丢失。

  1. 设置参数 acks=-1。acks 这个参数是指分区 leader 收到多少分区副本收到消息后,producer 才认为消息发送成功了,可选的参数值有 0, 1 和 -1。
    1. acks=0,表示生产者不等待任何服务器节点的响应,只要发送消息就认为成功。
    2. acks=1(默认值),表示生产者收到 leader 分区的响应就认为发送成功。
    3. acks=-1,表示只有当 ISR(ISR 的含义后面我会详细介绍)中的副本全部收到消息时,生产者才会认为消息生产成功了。这种配置是最安全的,因为如果 leader 副本挂了,当 follower 副本被选为 leader 副本时,消息也不会丢失。但是系统吞吐量会降低,因为生产者要等待所有副本都收到消息后才能再次发送消息。

borker 服务端: 不丢失消息

  1. 设置 replication.factor >1。replication.factor 这个参数表示分区副本的个数,这里我们要将其设置为大于 1 的数,这样当 leader 副本挂了,follower 副本还能被选为 leader 副本继续接收消息。
  2. 设置 min.insync.replicas >1。min.insync.replicas 指的是 ISR 最少的副本数量,原理同上,也需要大于 1 的副本数量来保证消息不丢失。
    1. tips: ISR。ISR 是一个分区部分副本的集合,每个分区都有自己的一个 ISR 集合。不是所有的副本都会在这个集合里,首先 leader 自身是在 ISR 集合里的,ISR 集合里的 follower 和 leader 消息是保持一致的,落后于 leader 的 follower 会被从 ISR 集合里被淘汰出去。
  3. 设置 unclean.leader.election.enable=false。指是否能把非 ISR 集合中的副本选举为 leader 副本。true 表示允许非 ISR 集合中的 follower 副本成为 leader 副本。非 ISR 集合 follower 和 leader 消息不一致,如果获得选举资格被选举为新 leader 后会丢失消息。

consumer: 不能少消费消息

  1. 设置 enable.auto.commit=false。表示 consuemr 消费偏移量是否自动提交。
    1. 消费者消费消息是有两个步骤的,首先拉取消息,然后再处理消息。向服务端提交消费偏移量可以手动提交也可以自动提交。如果为 true 表示 offset 是由 consumer 自动提交,由异步线程去完成的,业务线程无法控制。如果刚拉取了消息之后,kafka 异步线程自动提交了消费偏移量,此时业务处理还没执行完 consumer 挂了,这就造成还没进行完业务处理的消息 offset 已经被提交了,下次再消费时消费不到此条消息,造成消息的丢失。因此防止消息丢失需要要设置 enable.auto.commit=false,由业务手动提交消息偏移量。
  2. enable.auto.commit=false, 业务消费完成后手动提交消费 offset 有重复消费的风险。风险触发时机是在业务消费完成后,手动提交 offset 前 consumer 挂了。由于 borker 上此 partition 的 consume offset 还没被提交,下次 consumer 拉取时还会拉取到此条消息。

kafka 如何做到消息不重复

producer: 不重复发送消息

  1. producer 如遇网络问题未获得响应,就无法判断该消息是否成功提交到了 broker,如果配置了重试次数,会引发生产端重新发送同一条消息,从而造成消息发送重复。
    1. producer 会获得 borker 分配的一个唯一 id,同一个 producer 中每条消息会获得一个唯一 id,如有需要可以用 redis senx 对唯一 id 做检查去重。或者业务线在消息内自己生成唯一 id 通过 redis setnx 来去重。

consumer: 关闭

  1. consumer 需要关闭 consume offset 自动提交。offset 自动提交是异步执行的,可能出现业务线程消费完成了,提交 offset 的线程挂了。
  2. 业务线在消息内自己生成唯一 id。

kafka 一个 partition 分区只能被一个 consumer 消费的原因

  1. offset 保存在 partition 处,每个 partition leader 仅有一个 conusme offset 属性,无法满足多个 consumer 共同访问。
  2. 如果允许一个 partition 被多个 consumer 同时消费,会有并发问题等。解决这些问题会让 partition 和 consume offset 设计变得复杂,开发维护成本变高,且可能引入新的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SketchUp Pro 2024 for mac 草图大师 专业的3D建模软件

SketchUp Pro 2024 for Mac是一款功能强大的三维建模软件&#xff0c;适用于Mac电脑。其简洁易用的界面和强大的工具集使得用户可以轻松创建复杂的3D模型。 软件下载&#xff1a;SketchUp Pro 2024 for mac v24.0.483 激活版下载 SketchUp Pro 2024 for Mac支持导入和导出多种文…

软件杯 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

性能测试,python 内存分析工具

Memray是一个由彭博社开发的、开源内存剖析器&#xff1b;开源一个多月&#xff0c;已经收获了超8.4k的star&#xff0c;是名副其实的明星项目。今天我们就给大家来推荐这款python内存分析神器。 Memray可以跟踪python代码、本机扩展模块和python解释器本身中内存分配&#xf…

Revit模型进入虚幻引擎UE5教程

一、背景 小伙伴们是否有Revit进入虚幻引擎交互的需求呢&#xff1f; 二、实现功能 1.Revit进入虚幻UE5,包含模型属性&#xff0c;材质等 2.实现BIM构件点选&#xff0c;高亮&#xff0c;属性展示 3.实现BIM模型分层显示&#xff0c;爆炸等效果 三、教程地址 教程&#x…

51单片机入门_江协科技_21~22_OB记录的笔记

21. LED点阵屏 21.1. LED点阵屏介绍 •LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏以及公告牌等 •LED点阵屏分类 按颜色&#xff1a;单…

Leetcode 64. 最小路径和

心路历程&#xff1a; 第一反应像是一个回溯问题&#xff0c;但是看到题目中要求最值&#xff0c;大概率是一道DP问题。并且这里面的递推关系也很明显。 这里面边界条件可以有多种处理方法。 解法&#xff1a;动态规划 class Solution:def minPathSum(self, grid: List[List…

六、企业级架构缓存篇之memcached

一、memcached概述 1、网站架构优化流程&#xff1a; LNMP架构中网站应用访问流程&#xff1a; 浏览器 (app) → web 服务器 → 后端服务 (php) → 数据库 (mysql) 访问流程越多&#xff0c;访问速度越慢&#xff0c;出现问题的几率也越大。 网站访问流程优化思路&#xff1…

ps教程谁教的好

在Photoshop&#xff08;PS&#xff09;教程方面&#xff0c;有多位老师被推荐为教学水平较高。以下是一些被提及的老师&#xff1a; 敬伟&#xff1a;被认为是很多人的PS启蒙老师&#xff0c;提供基本功能介绍与高级效果案例&#xff0c;教学风格被认为是免费且不拖沓的。1…

【机器学习】如何通过群体智慧解决机器学习的挑战“

机器学习的发展日新月异&#xff0c;但其成功实施的关键之一仍然是获取高质量的、标注良好的数据集。在这篇文章中&#xff0c;我们将探讨如何通过群体智慧来构建和改善机器学习的数据集&#xff0c;尤其是通过reCAPTCHA和带有目的的游戏&#xff08;Games with a Purpose, GWA…

开发语言漫谈-C语言

个人认为C语言是最伟大的开发语言&#xff08;没有之一&#xff09;。C语言开创了高级语言的新时代。比C更低级的是汇编语言&#xff0c;这个东西就是反人类的玩意。之后的语言或多或少都受C语言的影响。更神奇的是直到现在&#xff0c;C语言还有生命力。C语言的发明人丹尼斯里…

比nestjs更优雅的ts控制反转策略-依赖查找

一、Cabloy5.0内测预告 Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构&#xff0c;并且提供了更加优雅的ts控制反转策略&#xff0c;让我们的业务开发更加快捷顺畅 1. 新旧技术栈对比&#xff1a; 后端前端旧版js、egg2.0、mysqljs、vue2、framework7新版ts、egg3…

Web大并发集群部署之集群介绍

一、传统web访问模型 传统web访问模型完成一次请求的步骤 1&#xff09;用户发起请求 2&#xff09;服务器接受请求 3&#xff09;服务器处理请求&#xff08;压力最大&#xff09; 4&#xff09;服务器响应请求 传统模型缺点 单点故障&#xff1b; 单台服务器资源有限&…

Prometheus+grafana环境搭建MongoDB(docker+二进制两种方式安装)(五)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前四篇mongodb的exporter坑也挺多总结一下各种安装方式&#xff0c;方便后续考古。 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabb…

使用阿里云试用Elasticsearch学习:1.4 基础入门——映射和分析

当摆弄索引里面的数据时&#xff0c;我们发现一些奇怪的事情。一些事情看起来被打乱了&#xff1a;在我们的索引中有12条推文&#xff0c;其中只有一条包含日期 2014-09-15 &#xff0c;但是看一看下面查询命中的 总数 &#xff08;total&#xff09;&#xff1a; GET /_searc…

如何利用GitHub和jsDelivr托管图片cdn

1、背景 https://cdn.jsdelivr.net/gh/axh2018/axh2018.github.io/medias/banner/6.jpg 这个链接是如何生成的&#xff1f;免费吗&#xff1f; 2、解决 这个链接看起来是使用了 jsDelivr 服务来托管在 GitHub 上的静态文件。jsDelivr 是一个免费的开源 CDN (Content Deliver…

【关于窗口移动求和的两种计算方法】

窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动&#xff0c;比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列&#xff1a;OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15]&#xff0c;定义窗口长度为5&#xff0c;每次…

小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 如何理解UDP 是面向报文的协议如何理解字节流如何解决粘包固定长度的消息 特殊字符作为边界自定义消息结构 如何理解UDP 是面向报文的…

MFC中数据转化

目录 1.CString数据转化为int类型数据 2.int类型转化为CString类型数据 3.MFC中CString数据类型 转换为std::string数据类型 4.MFC中std::string数据类型 转换为CString数据类型 1.CString数据转化为int类型数据 在MFC中&#xff0c;将CString类型数据转换为int类型数据&a…

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…

数据结构--最长公共前缀

数据结构–最长公共前缀 方法一&#xff1a; 分析 首先找到最小长度的字符串&#xff0c;然后把其与每一个与每一个字符串查找索引&#xff0c;判断其是不是第一个(索引为0)&#xff0c;若其是&#xff0c;则计数的加一&#xff0c;当计数等于字符数组长度&#xff0c;即每个…