当前位置: 首页 > news >正文

Kafka之基本概念

1、Kafka是什么?

Kafka是由Scala语言开发的一个多分区、多副本,基于Zookeeper集群协调的系统。

那这个所谓的系统又是什么系统呢?

回答这个问题要从发展的角度来看:起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布式流式处理平台,用于实时数据集成和流数据处理。

2、Kafka都可以扮演哪些“角色”?

基于Kafka的发展和特性,它可以在我们的实际工作当中扮演以下几个“角色”:

  • 消息系统
  • 存储系统:将消息持久化到磁盘上。
  • 流式处理平台:可以集成多种流式处理框架(例如:SparkStream、Flink等),不但可以作为可靠的数据源,同时提供了一套完整的流处理类库,例如:窗口、连接、交换和聚合等操作。

3、Kafka的体系架构?

Kafka体系架构包括:生产者(Producer)、消费者(Consumer)、服务代理节点(Broker)、一个Zookeeper集群。

  • 生产者(Producer)

    作为消息的发送方。负责创建消息,并将消息发送给Broker。

  • 消费者(Consumer)

    作为消息的接收方。负责连接Kafka并接收消息,进而进行相应的逻辑处理。

  • 代理服务节点(Broker)

    可以看做一个Kafka实例,多个Broker组成一个Kafka集群。

  • Zookeeper集群

    Zookeeper用来负责Kafka集群的元数据管理和控制器的选举等操作。

让我们进一步来描述Producer、Consumer、Broker之间的关系以及作用:

Producer创建消息并将消息发送给Borker,Broker将接收到的消息存储到本地的磁盘上,Consumer负责在Broker上订阅并消费消息。

4、主题、分区、副本

Kafka中有三个重要的概念,主题、分区和副本。它们之间的关系如下图:
在这里插入图片描述
通过上图我们可以得知:

1个主题对应多个分区;一个分区对应多个副本;副本又分为一个leader副本和多个follower副本。

4.1、主题

  1. 主题是一个逻辑概念,我们可以把它当做消息的分类。
  2. Producer发送消息的时候会指明该消息所属的主题(即可以理解为Producer是将消息发送给了主题),一个消息只属于一个主题。

4.2、分区

  1. 一个主题下会细分为多个分区,每个分区对应一个主题。
  2. 消息在分区中的以offset(偏移量)作为唯一标识
  3. Kafka通过offset来保证消息在分区中的顺序。
  4. offset不能跨区,所以我们说分区是有序的,而主题是无序
  5. 分区可以分布在不同的broker上。

4.3、副本

  1. 一个分区会有多个副本,副本中的消息都是一致的(同一时刻可能会有不一致的情况)。

  2. 副本之间的关系是“一主多从”,即一个leader副本和多个follower副本。

    • leader副本:负责消息的读写。
    • follower副本:负责同步leader副本。
  3. 副本被分布到不同的broker上,leader副本挂掉了,会从follower副本中重新选举出一个新的leader副本。

  4. 我们将分区中所有副本统称为AR(Assigned Replicas)。其中一些与leader副本保持一定程度同步的副本(包括leader副本本身)统称为ISR(In-Sync Replicas)。而另外一些相较于leader副本滞后很多的副本统称为OSR(Out-of-Sync Replicas)

    由此可见,AR = ISR + OSR。正常情况下,所有follower副本都要与leader版本保持一定程度的同步,即AR = ISR,而OSR集合为空。

  5. 默认情况下,leader副本只能从ISR中的副本中选举出来。但是我们可以通过参数配置使得OSR中的副本也有机会被选举为leader副本。

  6. leader副本还负责所有follower副本滞后状态的维护和跟踪,即当follower副本滞后较多的时候会将它从ISR中移动到OSR中,也会将OSR中追上leader副本的follower副本移动到ISR中。

  7. 特定偏移量HW和LEO。

    • 针对分区有一个概念为高水位(High Watermark,缩写HW),它是一个特定的消息偏移量(offset),消费者只能接收到offset之前的消息
    • ISR中的每个follower副本都维护一个自己的LEO(Log End Offset),它也是一个特定的消息偏移量(offset),即待写入消息的偏移量。

在这里插入图片描述

  1. HW与LEO之间的关系,如下图:
    在这里插入图片描述
    通过上图我们可以得知:分区的HW是通过ISR中最小的LEO得出的

4.4、如何避免Consumer宕机重启后的消息丢失?

Consumer是通过拉(Pull)模式从服务端拉取消息的,同时会在Consumer端记录下消费的具体位置,当Consumer宕机重启后会根据之前记录的消费位置重新拉取需要的信息进行消费。

下一篇:Kafka之生产者

相关文章:

Kafka之基本概念

1、Kafka是什么? Kafka是由Scala语言开发的一个多分区、多副本,基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢? 回答这个问题要从发展的角度来看:起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…...

倪师学习笔记-天纪-斗数简介

一、学习过程 学习->验证->思考 二、算命方法 算命方法特点铁板神数适合核对六亲子平法准确度一般紫微斗数天文地理融合最好,批六亲不准,配合相可以提升准确率 三、果 天地人三者一起影响果,天时地利人和促成成功1/31/31/31算命部…...

Python酷库之旅-第三方库Pandas(143)

目录 一、用法精讲 646、pandas.Timestamp.is_quarter_start属性 646-1、语法 646-2、参数 646-3、功能 646-4、返回值 646-5、说明 646-6、用法 646-6-1、数据准备 646-6-2、代码示例 646-6-3、结果输出 647、pandas.Timestamp.is_year_end属性 647-1、语法 647…...

细说QT各种线程锁的特点和用法

文章目录 QMutex特点用法QReadWriteLock特点用法QSemaphore特点用法QWaitCondition特点用法在Qt框架中,提供了多种线程同步机制,包括互斥锁(Mutex)、读写锁(Read-Write Lock)、信号量(Semaphore)和条件变量(Wait Conditions)。这些机制用于处理多线程编程中的数据一致性和线程…...

Caffeine+Redis两级缓存架构

CaffeineRedis两级缓存架构 在高性能的服务项目中,我们一般会将一些热点数据存储到 Redis这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 但是在一些场景下单纯使用 Redis 的分布…...

kafka和zookeeper单机部署

安装kafka需要jdk和zookeeper环境,因此先部署单机zk的测试环境。 zookeeper离线安装 下载地址: zookeeper下载地址:Index of /dist/zookeeper 这里下载安装 zookeeper-3.4.6.tar.gz 版本,测试环境单机部署 上传服务器后解压缩 …...

别了,公有云!下云迁移真的是大趋势么?

【科技明说 | 科技热点关注】 不知道你们还有没有印象,早在2022年,IBM发布了《IBM 企业转型指数:云现状》中也反映了这一趋势:80%的企业已经考虑或正在考虑将已经部署到公有云上的工作负载迁回私有的基础设施。 然而&…...

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用,展示了其作为信息与物理世界交汇点的广泛影响力,尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …...

C++ socket编程(1)

这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。 Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。 服务器会等待连接,客户端连接后,服…...

C# 文件夹类的实现与文件属性处理

在现代软件开发中,处理文件和文件夹是非常常见的任务。 C# 提供了丰富的类库来操作这些文件系统的基本元素。本篇文章将探讨如何在 C# 中实现一个简单的文件夹类,以及如何获取文件名、文件路径、大小和创建日期等文件属性。 一、使用 System.IO 命…...

基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

【论文笔记】DKTNet: Dual-Key Transformer Network for small object detection

【引用格式】:Xu S, Gu J, Hua Y, et al. Dktnet: dual-key transformer network for small object detection[J]. Neurocomputing, 2023, 525: 29-41. 【网址】:https://cczuyiliu.github.io/pdf/DKTNet%20Dual-Key%20Transformer%20Network%20for%20s…...

设计模式之适配器模式(Adapter)

一、适配器模式介绍 适配器模式(adapter pattern )的原始定义是:将类的接口转换为客户期望的另一个接口, 适配器可以让不兼容的两个类一起协同工作。 适配器模式是用来做适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口…...

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch,需要添加源!! pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.html想到一个麻烦的…...

【STM32 Blue Pill编程实例】-SD卡文件读写(SPI接口)

SD卡文件读写(SPI接口) 文章目录 SD卡文件读写(SPI接口)1、SD卡模块介绍2、硬件准备与接线3、模块配置3.1 SPI接口配置3.2 SPI接口的片选信号引脚配置3.3 FATFS配置4、代码实现在本文中,我们将介绍如何将 microSD 卡与 STM32 Blue Pill 连接,并在STM32CubeIDE中对SD卡进行…...

为什么需要软件测试?

软件测试 软件测试是评估和验证计算机程序或系统是否按预期运行的过程。 它涉及执行程序或系统以识别预期结果和实际结果之间的任何错误或差距。 目标是确保软件满足指定的要求,没有缺陷,并在不同场景中可靠地工作。 为什么需要软件测试?…...

成为超人:普通人如何白手起家,富一代和富二代的根本区别是什么?

成为超人:普通人如何白手起家,富一代和富二代的根本区别是什么? 我的问题是事业就讲 10 年装逼学习法失效① 光说不练,还是太懒真正的勤奋,解决温饱后,只专注赚钱这件事 ② 信念飘摇,随波流转万…...

Java 集合 Collection常考面试题

理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…...

C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)

目的减少重复代码冗余 Class 子类(派生类) : 继承方式 父类(基类) 继承方式共有三种:公共、保护、私有 父类的私有成员private无论哪种继承方式都不可以被子类使用 保护protected权限的内容在类内是可以访问,但是在…...

谷歌DeepMind 德米斯·哈萨比斯 因蛋白质预测AI荣获诺贝尔化学奖

2024年诺贝尔化学奖的一半授予了谷歌DeepMind的联合创始人兼首席执行官德米斯哈萨比斯和公司总监约翰M朱姆珀,以表彰他们在利用人工智能预测蛋白质结构方面的研究成果。另一半奖项则授予华盛顿大学生物化学教授大卫贝克,以表彰他在计算蛋白质设计领域的贡…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

uni-app学习笔记二十七--设置底部菜单TabBar的样式

官方文档地址&#xff1a;uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容&#xff0c;通常写在项目的App.vue的onLaunch方法中&#xff0c;用于项目启动时立即执行 重要参数&#xff1a; indexnumber是tabBar 的哪一项&…...

7种分类数据编码技术详解:从原理到实战

在数据分析和机器学习领域&#xff0c;分类数据&#xff08;Categorical Data&#xff09;的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型&#xff0c;如性别&#xff08;男/女&#xff09;、颜色&#xff08;红/绿/蓝&#xff09;或产品类…...