Kafka如何保证消息不丢失?

news2024/11/15 19:43:17

目录

Producer

Broker

Consumer

为什么Kafka没办法100%保证消息不丢失呢?

生产者

消费者

Broker


Kafka作为一个消息中间件,他需要结合消息生产者和消费者一起才能工作,一次消息发送包含以下是三个过程:

1)Producer端发送消息给Kafka Broker。

2)Kafka Broker将消息进行同步并持久化数据。

3)Consumer端从Kafka Broker将消息拉取并进行消费。

Kafka只对已提交的消息做最大限度的持久化保证不丢失,但是没办法保证100%。

为啥没办法保证100%呢?后面再说...

但是,Kafka还是提供了很多机制来保证消息不丢失的。要想知道Kafka如何保证消息不丢失,需要从生产者、消费者以及Kafka集群三个方面来分析。

Producer

消息的生产者端,最怕的就是消息发送给Kafka集群的过程中失败,所以,我们需要有机制来确保消息能够发送成功,但是,因为存在网络问题,所以基本没有什么办法可以保证一次消息一定能成功。

所以,就需要有一个确认机制来告诉生产者这个消息是否有发送成功,如果没成功,需要重新发送直到成功。

我们通常使用Kafka发送消息的时候,通常使用的 producer.send(msg) 其实是一种异步发送,发送消息的时候,方法会立即返回,但是并不代表消息一定能发送成功。(producer.send(msg).get() 是同步等待返回的。)

那么,为了保证消息不丢失,通常会建议使用 producer.send(msg, callback) 方法,这个方法支持传入一个callback,我们可以在消息发送时进行重试。

同时,我们也可以通过设置一些参数来提升发送成功率:

acks=-1 // 表示 Leader 和 Follower 都接收成功时确认;可以最大限度保证消息不丢失,但是吞吐量低。
retries=3 // 生产端的重试次数
retry.backoff.ms = 300 //消息发送超时或失败后,间隔的重试时间

acks = 0: 表示Producer请求立即返回,不需要等待Leader的任何确认。这种方案有最高的吞吐率,但是不保证消息消息是否真的发送成功。


acks = -1: 表示分区Leader必须等待消息被成功写入到所有的ISR副本(同步副本)中才认为Producer请求成功。这种方案提供最高的消息持久性保证,但是理论上吞吐率也是最差的。


acks = 1: 表示Leader副本必须应答Producer请求并写入消息到本地日志,之后Producer请求被认为成功。如果此时Leader副本应答请求之后挂掉了,消息会丢失。这个方案,提供了不错的持久性保证和吞吐。

Broker

Kafka的集群有一些机制来保证消息的不丢失,比如复制机制、持久化存储机制以及ISR机制。

  • 持久化存储:Kafka使用持久化存储来存储消息。这意味着消息在写入Kafka时将被写入磁盘,这种方式可以防止消息因为节点宕机而丢失。

  • ISR复制机制:Kafka使用ISR机制来确保消息不会丢失,Kafka使用复制机制来保证数据的可靠性。每个分区都有多个副本,副本可以分布在不同的节点上。当一个节点宕机时,其他节点上的副本仍然可以提供服务,保证消息不丢失。

Consumer

作为Kafka的消费者端,只需要确保投递过来的消息能正常消费,并且不会胡乱的提交偏移量就行了。

Kafka消费者会跟踪每个分区的偏移量,消费者每次消费消息时,都会将偏移量向后移动。当消费者宕机或者不可用时,Kafka会将该消费者所消费的分区的偏移量保存下来,下次该消费者重新启动时,可以从上一次的偏移量开始消费消息。

另外,Kafka消费者还可以组成消费者组,每个消费者组可以同时消费多个分区。当一个消费者组中的消费者宕机或者不可用时,其他消费者仍然可以消费该组的分区,保证消息不丢失。

为了保证消息不丢失,建议使用手动提交偏移量的方式,避免拉取了消息以后,业务逻辑没处理完,提交偏移量后但是消费者挂掉的问题:

enable.auto.commit=false

为什么Kafka没办法100%保证消息不丢失呢?

Kafka提供的Producer和Consumer之间的消息传递保证语义有三种,所谓消息传递语义,其实就是Kafka的消息交付可靠保障,主要有以下三种:

  • At most once—消息可能会丢,但绝不会重复传递;
  • At least once—消息绝不会丢,但可能会重复传递;
  • Exactly once—每条消息只会被精确地传递一次,既不会多,也不会少;

目前,Kafka默认提供的交付可靠性保障是第二种,即At least once,但是,其实依靠Kafka自身,是没有办法100%保证可靠性的。

我们来整体分析下。

生产者

Kafka允许生产者以异步方式发送消息,这意味着生产者在发送消息后不会等待确认。当然,我们可以注册一个回调等待消息的成功回调。

但是,如果生产者在发送消息之后,Kafka的集群发生故障或崩溃,而消息尚未被完全写入Kafka的日志中,那么这些消息可能会丢失。虽然后续有可能会重试,但是,如果重试也失败了呢?如果这个过程中刚好生产者也崩溃了呢?那就可能会导致没有人知道这个消息失败了,就导致不会重试了。

消费者

消费者来说比较简单,只要保证在消息成功时,才提交偏移量就行了,这样就不会导致消息丢失了。

Broker

Kafka使用日志来做消息的持久化的,日志文件是存储在磁盘之上的,但是如果Broker在消息尚未完全写入日志之前崩溃,那么这些消息就可能会丢失了。

而且,操作系统在写磁盘之前,会先把数据写入Page Cache中,然后再由操作系统自己决定什么时候同步到磁盘当中,而在这个过程,如果还没有写及同步到磁盘中,就崩掉了,那么消息也就丢了。

当然,也可以通过配置log.flush.interval.messages=1,来实现类似于同步刷盘的功能,但是又回到了前面说的情况,还没来得及做持久化,就宕机了。

即使Kafka中引入了副本机制来提升消息的可靠性,但是如果发生同步延迟,还没来及同步,主副本就挂掉了,那么消息就可能会发生丢失。

这种情况下,只从Broker的角度分析,Broker自身是没办法保证消息不丢失的,但是只要Combine Producer,再配合request.required.acks=-1这种ACK策略,可以确保消息持久化成功之后,才会ACK给Producer,那么,如果我们的Producer在一定时间内,没有收到ACK,是可以重新发送的。

但是,这种重新发送,就又回到了我们前面介绍生产者的时候的问题,生产者也有可能挂掉,重新发送也有可能没发送接收到,导致消息最终丢失。

所以,我们说,只靠Kafka自身,其实是没有办法保证极端情况下的消息100%不丢失的。

但是,我们也可以在做一些机制来保证,比如引入分布式事务,或者引入本地消息表等,保证在Kafka Broker没有保存消息成功时,可以重新投递消息。这样才行。

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

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

相关文章

QT实现电子相册

使用带有UI界面的QWidget实现电子相册 1、实现功能 1、定时器的使用,在当前页面的停止总时长。 2、显示当前时间 3、图片的上一张与下一张 4、图片的显示 5、进度展示、一共十张图片、进度条的初始值为10。 2、widget.h #ifndef WIDGET_H #define WIDGET_H#i…

Linux 常用命令 ulimit、uptime、curl、scp、dos2unix 提升开发和运维效率

Linux 常用命令:从资源限制到网络传输 一、前导:概述二、ulimit 用户资源三、uptime 机器启动时间负载四、curl 命令五、scp 远程拷贝六、dos2unix和unix2dos命令七、总结 一、前导:概述 本系列主要讲解Linux运行时命令,包括网络…

pycharm中opencv-python和opencv-contrib安装及测试相机链接取图

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python当前下载的是4.10.0 2.分别下载。 3.下载完后,打开pycharm,然后新建一个项目,项目中新建一个main.py文件,设置项目配置环境为当前python环境, …

常用排序算法(上)

目录 前言: 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 堆排序 2.1 1 向下调整算法 2.1 2 建堆 2.1 3 排序 2.2 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 插…

JS设计模式之“神奇的魔术师” - 简单工厂模式

引言 在JavaScript开发中,我们经常需要创建和管理各种对象,而简单工厂模式就是一种最简单的用来创建对象的设计模式。 简单工厂模式通过一个工厂类来创建相似的对象,而无需直接使用具体类来实例化对象。这样可以将对象的创建过程与使用过程…

Zabbix 配置win系统登录和钉钉告警

1、配置win监控项 win系统日志ID 4624是成功登录 4625是失败登录 登录成功日志: eventlog[Security,,"Success Audit",,^4624$,,skip] 登录失败日志: eventlog[Security,,"Success Audit",,^4625$,,skip] 要监控登录的日志&…

音视频开发之旅(90)-Vision Transformer论文解读与源码分析

目录 1.背景和问题 2.Vision Transformer(VIT)模型结构 3.Patch Embedding 4.实现效果 5.代码解析 6.资料 一、背景和问题 上一篇我们学习了Transformer的原理,主要介绍了在NLP领域上的应用,那么在CV(图像视频)领域该如何使用? 最直观…

在Diffusers中使用LoRA微调模型

在浏览稳定扩散模型共享网站(例如 CivitAI)时,你可能遇到过一些标记为“LoRA”的自定义模型。“LoRA”到底是什么—它与典型的模型检查点有何不同?LoRA 可以与Diffusers包一起使用吗?在本文中,我们将回答这…

计算机视觉基础 2. 滤波器

1. 简介 模糊滤波器是低通滤波器。它们从图像中去除高空间频率内容,只留下低频空间分量。结果是图像失去了细节,看起来很模糊。图像模糊在计算机图形学和计算机视觉中有许多应用。它可用于降低噪声(如图17.1所示),揭示…

代码时光机:Git基础速成

hello,家人们,今天咱们来介绍Git以及Git相关的操作,好啦,废话不多讲,开干. 1:Git初识 在介绍Git前,博主首先讲一个小故事. 我们学计算机的小伙伴们,在学校里头都有实验课,那么老师呢就会要求我们写实验报告并且要求我们交上去给老师检查.有一个学计算机的大学生,名字叫张三,然…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task2:自适应学习率,分类

1.自适应学习率 临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。很多时候训练网络,损失不再下降,不是因为到了临界点,而是可能在山谷之间不停震荡。 以下为不同学习率对训练的影响,下图中左右平缓,上下陡…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…

火语言RPA流程组件介绍--浏览选择文件夹

&#x1f6a9;【组件功能】&#xff1a;打开浏览文件夹选择对话框 配置预览 配置说明 对话框标题 支持T或# 打开浏览文件夹对话框时显示的标题。 默认打开文件夹 支持T或# 打开浏览文件夹对话框时&#xff0c;默认打开此文件夹。 取消后终止流程 “是”、“否”2种供选择…

一篇详细介绍常用第三方库的教程

作者&#xff1a;郭震 我们之前介绍过如何安装Python的各种常用第三方库.这些库为程序员提供了许多功能,能够大大简化我们的开发工作.本文将为你介绍一些最常用的第三方库,帮助你更好地理解它们的用途及基本概念. 1. NumPy NumPy是一个强大的科学计算库.它提供了多维数组对象以…

09.定时器02

#include "reg52.h"sbit led P3^6;void delay10ms() { //1. 配置定时器0工作模式位16位计时TMOD 0x01;//2. 给初值&#xff0c;定一个10ms出来TL00x00;TH00xDC;//3. 开始计时TR0 1;TF0 0; } void main() {int cnt 0;led 1;while(1){if(TF0 1)//当爆表的时候&a…

Git之2.9版本重要特性及用法实例(五十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列…

非关系型数据库 Redis 的安装与配置

文章目录 一 . CentOS 7 安装 Redis【版本选择说明】一 . 安装 Redis二 . 配置 Redis2.1 针对可执行程序设置符号链接2.2 针对配置文件设置符号链接2.3 修改配置文件2.3.1 设置 IP 地址2.3.2 关闭保护模式2.3.3 启动守护进程2.3.4 设置工作目录2.3.5 设置日志目录 三 . 启动 Re…

Apache SeaTunnel Zeta 引擎源码解析(一)Server端的初始化

引入 本系列文章是基于 Apache SeaTunnel 2.3.6版本&#xff0c;围绕Zeta引擎给大家介绍其任务是如何从提交到运行的全流程&#xff0c;希望通过这篇文档&#xff0c;对刚刚上手SeaTunnel的朋友提供一些帮助。 我们整体的文章将会分成三篇&#xff0c;从以下方向给大家介绍&am…

掌握数据利器:AWS Glue与数据基盘概览

引言 随着数字化进程的不断推进&#xff0c;企业现在能够积累并分析海量且多样化的数据。这一优势使得许多企业开始采用数据驱动型经营&#xff08;即基于数据的经营策略&#xff09;。通过基于数据的客观判断&#xff0c;企业及其管理者可以获得诸多好处。 然而&#xff0c;…

DeepMind 机器人学习打乒乓球,朝着「专业运动员水平的速度和性能」发展

这几天全球各界最火热的话题非奥运会莫属&#xff0c;而其中乒乓球比赛更是引起了互联网的讨论热潮&#xff0c;无论是欢呼也好、争议也罢&#xff0c;在现实世界人类的乒乓球大赛风生水起的同时&#xff0c;AI已经偷偷在乒乓球上“出师”了—— ——DeepMind近日发布一项新工作…