一文彻底搞懂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 宕机时,未刷盘到磁盘的数据可能会丢失。

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

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

相关文章

redis的主从配置模拟(一主双从)

目录 先来给大家扩展机道面试官经常会问到关于redis的题 一、redis有哪些好处 二、redis相比memcached有哪些优势 三、redis常见性能问题和解决方案 四、redis集群的工作原理 五、redis主从的原理 redis的主从配置模拟(一主双从) 一、准备环境 …

二级建造师试题答案?学生党都在用的6款搜题工具来了 #学习方法#学习方法#微信

作为大学生,我们应该善于利用各种学习工具,提高学习效率和质量。 1.灵兔搜题 这是一个公众号 包含大学网课、课后教材、选修课、mooc慕课及各类职业资格证、学历提升考试、公务员考试等常见题库。 下方附上一些测试的试题及答案 1、Uri主要由三部分组…

spark sql上线前的调试工作实现

背景 每个公司应该都有大数据的平台的吧,平台的作用就是可以在上面执行各种spark sql以及定时任务,不过一般来说,由于这些spark sql的上线不经过测试,所以可能会影响到生产的数据,这种情况下大数据平台提供一个上线前…

Blazor Wasm Google 登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

Docker 有哪些常见的用途?

Docker 是一种容器化技术,它允许应用程序在不同的环境之间具有一致的运行环境。这使得 Docker 在开发和运维领域中非常受欢迎,因为它简化了应用程序的部署和管理。以下是 Docker 的一些常见用途: 快速部署应用程序 Docker 允许开发人员和运…

Mysql Day04

mysql体系结构 连接层服务层引擎层(索引)存储层 存储引擎 存储引擎是基于表建立的,默认是innoDB show create table tb; 查看当前数据库支持的存储引擎 show engines; InnoDB 特点 DML(数据增删改)遵循ACID模…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 , enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

Codeforces Round 923 (Div. 3) C. Choose the Different Ones(Java)

比赛链接:Round 923 (Div. 3) C题传送门:C. Choose the Different Ones! 题目: ** Example** ** input** 6 6 5 6 2 3 8 5 6 5 1 3 4 10 5 6 5 6 2 3 4 5 6 5 1 3 8 10 3 3 3 4 1 3 5 2 4 6 2 5 4 1 4 7 3 4 4 2 1 4 2 2 6 4 4 2 1 5 2 3 …

决策树之scikit-learn

实例 from sklearn.datasets import load_iris from sklearn import tree import matplotlib.pyplot as plt# Load iris dataset iris load_iris() X, y iris.data, iris.target# Fit the classifier clf tree.DecisionTreeClassifier() clf clf.fit(X, y)# Plot the deci…

【FPGA】Verilog:奇偶校验位发生器 | 奇偶校验位校验器

目录 0x00 奇偶校验位发生器 0x01 奇偶校验位校验器 0x02 错误检测器和纠错器

16.1 Spring框架_SpringIoC容器与Bean管理(❤❤❤❤)

16.1 Spring框架_SpringIoC容器与Bean管理 1. Spring IOC1.1 IoC控制反转 1. Spring IOC 1.1 IoC控制反转 需要自己查找3种苹果的特色,从而选择符合自己的需求 告诉水果店老板自己的口味,由老板推荐哪种苹果,省去自己查询水果特点 在java中,各种水果就是各种对象,买水果就是创…

【CC++】内存管理1:new + delete

前言 之前我们学习过C语言中的内存管理(各种函数)今天我们来学习C中的内存管理 引入 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {…

leetcode:63.不同路径二

dp数组含义:由初始位置到最终位置路径个数 递推公式:如果没有障碍再进行递推公式 初始化:1.若起始位置和终止位置有障碍路径个数为0 2.dp[i][0] 1和dp[0][j] 1的for循环条件都需要加上一个and dp[i][0] 0和and dp[0][j] 0. 3.遍历顺序…

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博,校园网屏蔽了所有内网穿透的工具的数据包和IP访问,为了实现在家也能远程访问服务器,就不得不先开个学校VPN,再登陆。我们实验室还需要访问另一个大学的服务器,每次我都要去找另一个大学…

Flink基础篇|001_Flink是什么

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师 🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者 🔥 三连支持:欢迎 ❤️关注、&#x…

监控概述、安装zabbix、配置zabbixagent、添加被控端主机、常用监控指标、自定义监控项

监控概述 对服务的管理,不能仅限于可用性。 还需要服务可以安全、稳定、高效地运行。 监控的目的:早发现、早治疗。 被监控的资源类型: 公开数据:对外开放的,不需要认证即可获取的数据私有数据:对外不开…

分享关闭Windows自动更新的六种方法。

方法一:禁用Windows Update服务 同时按下键盘的“WinR”键,打开“运行”窗口,输入“services.msc”并点击“确定”。 在打开的服务列表中找到“Windows Update”选项,双击打开其属性窗口。 在“启动类型”下拉菜单中选择“禁用”…

vue-内置组件-Suspense

Suspense (实验性功能) <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

基于完全二叉树实现线段树-- [爆竹声中一岁除,线段树下苦踌躇]

文章目录 一.完全二叉树完全二叉树的父子结点引索关系 二.线段树三.基于完全二叉树实现线段树关于线段树的结点数量问题的证明递归建树递归查询区间和递归单点修改线段树模板题 一.完全二叉树 完全二叉树的物理结构是线性表,逻辑结构是二叉树 完全二叉树的父子结点引索关系 …

Dubbo的负载均衡策略剖析

1 Dubbo的负载均衡策略概述 Dubbo的负载均衡策略应用于服务消费方。当服务提供者是集群时&#xff0c;通过在消费方设置负载均衡策略&#xff0c;避免大量请求一直集中在其中的某一个或者某几个服务提供方机器上。 Dubbo提供了多种负载均衡策略&#xff0c;默认为随机策略-Ra…