一文彻底搞懂Kafka如何保证消息不丢失

文章目录

  • 1. kafka 架构
  • 2. producer端是如何保证数据不丢失的
    • 2.1 同步发送
    • 2.2 异步发送
    • 2.3 批量发送
  • 3. consumer端是如何保证数据不丢失的
    • 3.1 手动提交
    • 3.2 幂等性消费
  • 4. broker端是如何保证数据不丢失的
    • 4.1 副本机制
    • 4.2 ISR机制
    • 4.3 刷盘机制

1. kafka 架构

在这里插入图片描述

Producer:生产者,发送消息的一方。生产者负责创建消息,然后将其发送到 Kafka。

Consumer:消费者,接受消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。

Consumer Group:将多个消费者组成一个消费者组,一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式可以极大提高数据下游的处理速度,同一消费组中的消费者不会重复消费消息,同一个消费者组的消费者可以消费同一个topic的不同分区的数据。Kafka 就是通过消费组的方式来实现消息 P2P 模式和广播模式。

Broker:服务代理节点。Broker 是 Kafka 的服务节点,是 kafka 一个实例,每个服务器上有一个或多个 kafka 的实例,简单的理解就是一台 kafka 服务器,kafka cluster表示集群的意思

Topic:消息的主题,可以理解为消息队列,kafka的数据就保存在topic。Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。

Partition:Topic 是一个逻辑的概念,它可以细分为多个分区,每个 topic 可以有多个分区,分区的作用是做负载,提高 kafka 的吞吐量。每个分区只属于单个主题,同一个主题下不同分区包含的消息是不同的,partition 的表现形式就是一个一个的文件夹,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。

Offset:offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka 保证的是分区有序性而不是主题有序性。

Replication:副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络异常,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。

Leader:在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本。

Message:每一条发送的消息主体。

Record:实际写入 Kafka 中并可以被读取的消息记录。每个 record 包含了 key、value 和 timestamp。

Zookeeper:kafka 集群依赖 zookeeper 来保存集群的的元信息,来保证系统的可用性。

kafka 本质就是一个消息系统,与大多数的消息系统一样,主要的特点:

  • 使用推拉模型将生产者和消费者分离
  • 为消息传递系统中的消息数据提供持久性,以允许多个消费者
  • 提供高可用集群服务,主从模式,同时支持横向水平扩展

与 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在于,它有一个分区Partition的概念。
如果你创建的topic有5个分区,当你一次性向 kafka 中推 1000 条数据时,这 1000 条数据默认会分配到 5 个分区中,其中每个分区存储 200 条数据。
这样做的好处,方便消费者从不同的分区拉取数据,假如你启动 5 个线程同时拉取数据,每个线程拉取一个分区,消费速度会非常非常快!

这是 kafka 与其他的消息系统最大的不同!

在使用消息队列时,数据不丢失是至关重要的。Kafka 作为一款主流的消息队列系统,提供了多方面的机制来保障数据不丢失,针对生产者、消费者和代理节点三个层面,是如何保证数据不丢失的

2. producer端是如何保证数据不丢失的

2.1 同步发送

同步发送模式下,生产者会阻塞等待 broker 的确认,直到消息被成功写入 ISR 中,才算发送成功。这种方式可以保证数据强一致性,但也降低了吞吐量。

2.2 异步发送

异步发送模式下,生产者不会等待 broker 的确认,而是直接将消息发送给 broker。这种方式可以提高吞吐量,但也存在数据丢失的风险,例如当 broker 宕机时,未确认的消息可能会丢失。

2.3 批量发送

批量发送可以减少发送消息的次数,提高吞吐量。Kafka 支持批量发送,生产者可以将多个消息组合成一个批次发送,以减少网络开销和提高效率。

3. consumer端是如何保证数据不丢失的

3.1 手动提交

消费者端默认自动提交模式,但这种模式下,如果消费者在消费消息后还未提交偏移量,就宕机了,那么这部分消息就会被重复消费。为了避免这种情况,可以设置手动提交模式,由消费者程序显式提交偏移量,确保消息只被消费一次。

3.2 幂等性消费

在某些情况下,即使消息只被消费一次,也可能导致数据不一致。为了解决这个问题,可以对消费逻辑进行改造,使其具有幂等性,保证即使消息被重复消费,也不会产生错误结果。

4. broker端是如何保证数据不丢失的

4.1 副本机制

Kafka 每个消息都会保存多个副本,即使一个副本所在的代理节点宕机,其他副本仍然可以提供数据。副本机制可以有效提高数据的可靠性,但也会增加存储空间和资源开销。

4.2 ISR机制

ISR(in-sync replica)列表包含所有与 leader 副本保持同步的副本。只有 ISR 列表中的副本才能接收写请求,保证数据的完整性和一致性。

4.3 刷盘机制

Kafka 将消息写入内存页缓存后,会异步刷盘到磁盘。为了保证数据持久性,可以配置刷盘策略,例如同步刷盘或异步刷盘。同步刷盘会降低吞吐量,但可以保证数据即使在 broker 宕机的情况下也不丢失。异步刷盘可以提高吞吐量,但存在数据丢失的风险,例如当 broker 宕机时,未刷盘到磁盘的数据可能会丢失。

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

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

相关文章

【从Python基础到深度学习】6. IPython使用PyCharm代码调试与使用PEP

一、IPython交互式shell Python的解释器如今有多个语言的实现,包括: CPython ——官方版本的c语言实现 ython ——可以运行在Java平台 IronPython ——可以运行在.NET和Mono平台PyPy —— Python实现的,支持JIT即时编译 1.PyCharm中 2.Ubuntu终端中 s…

一、基础算法之排序、二分、高精度、前缀和与差分、双指针算法、位运算、离散化、区间合并内容。

1.快速排序 算法思想&#xff1a;选择基准元素&#xff0c;比基准元素小的放左边&#xff0c;比基准元素大的放右边。每趟至少一个元素排好。 每一趟实现步骤&#xff1a; low>high&#xff0c;返回&#xff0c;排序完成选取基准元素xa[low],ilow,jhigh当i<j时&#x…

【人工智能】文本嵌入:向量存储与数据查询的智慧交织(12)

在当今信息激增的时代&#xff0c;将中文存储到向量数据库&#xff08;如Redis等&#xff09;并实现向量检索&#xff0c;正成为解决日常应用中文信息处理难题的关键利器。这项技术不仅赋予计算机对中文语义的理解能力&#xff0c;更让我们能够以更智能、高效的方式处理和检索中…

机器学习2---逻辑回归(基础准备)

逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…

【MySQL】-12 MySQL索引(上篇MySQL索引类型前置-2-高性能的索引策略)

MySQL索引-高性能的索引策略 3 高性能的索引策略3.1 独立的列3.2 前缀索引和索引选择性3.3 多列索引3.4 选择合适的索引列顺序3.5 聚簇索引(Clustered Indexes)3.5.1 InnoDB和MyISAM的数据布局的比较3.5.2 按primary key的顺序插入行(InnoDB) 3.6 覆盖索引(Covering Indexes)3.…

【深度学习】: 脑部MRI图像分割

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 有任…

QT入门-信号与槽

1.QT基本框架 #include "myWindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);myWindow w;w.show();return a.exec(); } QApplicata&#xff1a;应用程序对象&#xff0c;必须有且只能有一个 Qwidget&#xff1…

Python入门:常用模块—os模块及sys模块

os模块 sys模块 import sys print(sys.argv) # 命令参数list&#xff0c;第一个元素是程序本身路径 print(sys.exit()) # 退出程序&#xff0c;正常退出是exit(0) print(sys.version) # 获取python解释程序的版本信息 print(sys.maxint()) # 最大…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

Zustand:简化状态管理的现代React状态库

Zustand&#xff1a;简化状态管理的现代React状态库 Zustand是一个用于管理状态的现代React状态库。它提供了简洁、可扩展和高效的状态管理解决方案&#xff0c;使得在React应用中处理复杂的状态逻辑变得更加容易和直观。本文将介绍Zustand的主要特点、使用方法以及它在React开…

Zabbix6.x配置中文界面 解决乱码问题

Zabbix6.x配置中文界面 解决乱码问题 Zabbix6.x界面无法选择中文&#xff0c;通过安装语言包解决。后面也解决了zabbix6中文方块&#xff08;乱码&#xff09;问题。 配置中文语言包 系统中默认没有携带中文语言包&#xff0c;可以通过以下命令查看 localectl list-locales #…

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)

频率变小&#xff0c;周期变长 1&#xff0c;参考链接&#xff08;重要&#xff09; STM32CubeMX——定时器之定时功能&#xff08;学习使用timer定时器的设置&#xff09; STM32测量PWM信息&#xff08;学习使用设置pwm输入捕获&#xff09; 通用定时器中两个重要参数的设置心…

计算机网络——04接入网和物理媒体

接入网和物理媒体 接入网络和物理媒体 怎样将端系统和边缘路由器连接&#xff1f; 住宅接入网络单位接入网络&#xff08;学校、公司&#xff09;无线接入网络 住宅接入&#xff1a;modem 将上网数据调制加载到音频信号上&#xff0c;在电话线上传输&#xff0c;在局端将其…

自己动手打包element UI官方手册文档教程

经常用element ui朋友开发的比较郁闷&#xff0c;官方文档网基本上都是打不开的&#xff0c; 官方&#xff1a;https://element.eleme.io/ 一直打不开&#xff0c;分析下是里面用的cdn链接ssl证书无效。 就想着自己搭建一个element UI文档 自己搭建的&#xff1a; Element文档网…

精灵图,字体图标,CSS3三角

精灵图 1.1为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁的接受和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少…

SpringBoot 接入讯飞星火大模型实现对话

申请地址 https://xinghuo.xfyun.cn/sparkapi?scrprice 免费申请200万Token 开发文档 https://www.xfyun.cn/doc/spark/Web.html#_1-接口说明 页面最下面有相关demo可以参考 介绍 接口是以套接字的形式分段返回&#xff0c;而且非http请求&#xff0c;比较繁琐&#xff0c;官…

fast.ai 深度学习笔记(三)

深度学习 2&#xff1a;第 1 部分第 6 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-6-de70d626976c 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

模型蒸馏distill /模型剪枝 论文汇总

文章目录 引言1. 蒸馏1&#xff09;白盒蒸馏DistilBERTPatient Knowledge DistillationTinyBERT 2020MiniLLM 2&#xff09;黑盒蒸馏Stanford alpacaVicunaWizardlmInstruction tuning with gpt-4Minigpt-4 2. 剪枝16个注意力头比一个好吗Movement pruning 1&#xff09;结构化…

【实习】深信服防火墙网络安全生产实习

一、实习概况 1.1实习目的 1.掌握防火墙规则的作用2.掌握代理上网功能的作用3.掌握端口映射功能的作用 1.2实习任务 1.防火墙的WEB控制台 2.需要在防火墙上配置dnat …

【设计模式】23中设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …