kafka了解-笔记
文章目录
- kafka快速上手
- Kafka介绍
- Kafka快速上手
- 理解Kafka的集群工作机制
- Kafka集群的消息流转模型
- Kafka客户端小型流转流程
- 客户端工作机制
kafka快速上手
Kafka介绍
MQ的作用
MQ:MessageQueue,消息队列,是一种FIFO先进先出的数据结构,消息则是跨进程传递的数据。一个典型的MQ系统,会将消息由消息的生产者发送到MQ进行排队,然后根据一定的顺序交由消息的消费者进行处理。
MQ的作用主要有下面3个方面:
异步:异步能够提高系统的响应速度、吞吐量
解耦:1.服务之间进行解耦,才可以减少服务之间的影响,提高系统整体的稳定性及可扩展性。2.另外解耦后可以实现数据分发。生产者发送一个消息后,可以由一个或者多个消费者进行消费,并且消费者的增加或者减少对生产者没有影响
削峰:以稳定的系统资源应对突发的流量冲击
Kafka产品介绍
Kafka是目前最具有影响力的开源MQ产品,官网地址:https://kafka.apache.org/
apache Kafka最初由linkelin开发并于2011年开源,他主要解决大规模数据的实时流式处理和数据管道问题。
Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者种。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之前分布式部署,以提供高可用性和容错性。
Kafka使用高效的数据存储和技术管理,能够轻松地处理TB级别的数据量。其优点包括高吞吐量、低延迟、可扩展性、持久性、容错性等。
Kafka在企业级应用种被广泛应用,包括实时流处理、日志聚合、监控和数据分析等方面。同时Kafka还可以与其他大数据工具集成,如Hadoop、Spark和Storm等,构建一个完整的数据处理生态系统。
Kafka特点
Kafka最初诞生于LinkedIn公司,其核心作用就是用来收集并处理庞大复杂的应用日志。一个典型的日志聚合应用场景如下:

业务场景决定了产品的特点:
1.数据吞吐量很大:需要能够快速收集海量日志
2.集群容错性高:允许集群中少量节点崩溃
3.功能不用太复杂:Kafka的设计目标是高吞吐、低延迟和可扩展,主要关注消息传递而不是消息处理。Kafka并没有支持死信队列、顺序消息等高级功能
4.允许少量数据丢失:在海量的应用日志中,少量的日志丢失是不会影响结果的。服务的稳定性要求比数据安全高
Kafka快速上手
Kafka基础工作机制是消费发送者可以将消息发送到指定的topic,而消费消费者,可以从指定的topic上消费消息。
实际操作:1.创建一个topic;2.启动一个消息发送者,往topic发送消息;3.启动消息消费者从topic消费消息

Kafka的消费传递机制

Kafka体系,以下概念需要知道
客户端client:包括消息生产者和消息消费者
消费者组:每个消费者可以指定一个所属的消费者组,相同消费者组的消费者共同构成一个逻辑消费者组。每一个消息会被多个感兴趣的消费者组消费,但是在每一个消费者组内部,一个消息只会被消费一次。
服务端Broker:一个Kafka服务器就是一个Broker
话题Topic:这是一个逻辑概念,一个Topic被认为是业务含义相同的一组消息。客户端都是通过绑定Topic来生产或者消费自己感兴趣的话题
分区partition:topic只是一个逻辑概念,而partition就是实际存储消息的组件、每个partition就是一个queue队列结构。所有消息以FIFO先进先出的顺序保存在这些partition分区中。
理解Kafka的集群工作机制
对于Kafka这样一个追求消费吞吐量的产品来说,集群基本上是必备的。kafka的集群结构大体是这样的:

消息尽可能均匀的分布到不同的partition设计原因:
1.Kafka设计需要支持海量的数据,而这样大的数据量,一个Broker是存不下的,那就拆分成多个partition,每个broker只存一部分数据,这样极大的扩展了集群的吞吐量。
2.每个partition保留了一部分的消息副本,如果放到一个broker上,就容易出现单点故障。所以就给每个partition设计follower节点,进行数据备份,从而保证数据安全。另外多备份的partition设计也提高了读取消息时的并发度
3.在同一个Topic的多个partition中,会产生一个partition作为leader。这个leader partition会负责响应客户端的请求,并将数据往其他partition分发。
Kafka集群的消息流转模型

Kafka客户端小型流转流程

Kafka提供了两套客户端API,HighLevel API和LowLevel API。HighLevel API封装了Kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。而LowLevel API则需要客户端自己管理Kafka的运行细节,partition,offset这些数据都是由客户端自行管理,这层API功能更灵活,但是使用起来非常复杂,也更容易出错。只在极少数对性能要求非常极致的场景才会偶尔使用。
Kafka提供了非常简单的API,只需要引入一个Maven依赖即可

客户端工作机制
消费者分组消费机制
在consumer中,都需要指定一个GROUP_ID_CONFIG属性,这表示当前Consumer所属的消费者组。
生产者往topic下发消息时,会尽量均匀的将消息发送到Topic下的各个partition当中,而这个消息,会向所有订阅该topic的消费者推送,推送时,每个consumer Group中只会推送一份。也就是同一个消费者组中的多个消费者实例,只共同消费一个消息副本。而不同消费者组之间,会重复消费消息副本,这就是消费者组的作用。与之相关的还有offset偏移量,这个偏移量表示每个消费者组在每个partition中已经消费处理的进度,在Kafka中,可以看到消费者组的offset记录情况。
生产者拦截器机制
生产者拦截器机制允许客户端在生产者在消息发送到Kafka集群之前,对消息进行拦截,甚至可以修改消息内容。这里涉及到producer中指定的一个参数:INTERCEPTOR_CLASSES_CONFIG
消费序列化机制
producer指定了两个属性KEY_SERIALIZER_CLASS_CONFIG和VALUE_SERIALIZER_CLASS_CONFIG,对于这两个属性,在ProducerConfig中都有配套的说明属性。通过这两个参数,可以指定消息生产者如何将消息的key和value序列化成二进制数据。
在Kafka的消息定义中,key和value的作用是不同的:
key是用来进行分区的可选项。Kafka通过key来判断消息要分发到哪个partition。如果没有填写key,Kafka会自动选择partition。如果填写了key,那么会通过声明的Serializer序列化接口,将key转换成一个byte[]数组,然后对key进行hash,选择partition。这样可以保证key相同的消息会分配到相同的partition中。
value是业务上比较关心的消息,Kafka同样需要将value对象通过声明的Serializer序列化接口,将value转换成一个byte[]数组,这样才能较好的在网络上传输value信息,以及将value信息落盘到操作系统的文件当中。
在Kafka中,对于常用的一些基础数据类型,都已经提供了对应的实现类。在自己进行序列化机制时,需要考虑的是如何用二进制来描述业务数据。例如对于一个通常的pojo类型,可以将他的属性拆分为两种类型,一种类型是定长的基础类型,比如integer,long,double等。这些基础类型转化成二进制数组都是定长的。这类属性可以直接转成序列化数组,在反序列化时,只要按照定长去读取二进制数据就可以反序列化;另一种是不定长的浮动类型,比如string或者基于string的json类型等,这种浮动类型的基础数据转化成二进制数组,长度都是不一定的,对于这类数据,通常的处理方式都是先往二进制数组中写入一个定长的数据的长度数据,然后再继续写入数据本身,这样,反序列化时,就可以先读取一个定长的长度,再按照这个长度去读取对应长度的二进制数据,这样就能读取到数据的完整二进制内容。
“渔与鱼”序列化机制是在高并发场景中非常重要的一个优化机制。高效的系列化实现能够极大的提升分布式系统的网络传输以及数据落盘的能力。

消息分区路由机制
producer会根据消息的key选择partition,一个消费者组会共同消费一个topic下的多个partition中的同一套消息副本,在producer中,可以指定一个partition来对消息进行分配。
Kafka默认提供了三种分区分配策略:
range策略:比如一个topic有10个partition(0-9)一个消费者组下有3个consumer(consumer1-3).range策略就会将分区0-3分给一个consumer,4-6给一个consumer,7-9给一个consumer
round-robin策略:轮询分配策略,可以理解为在consumer中一个一个轮流分配分区。比如0,3,6,9分区给一个Consumer1;1,4,7分区给一个consumer2;然后2,5,8给一个consumer3
sticky策略:粘性策略,这个策略有两个原则:1.在开始分区时,尽量保持分区的分配均匀。2.分区的分配尽可能的与上一次分配的保持一致

生产者消息缓存机制
Kafka生产者为了避免高并发请求对服务端造成过大压力,每次发消息时并不是一条一条发往服务端,而是增加了一个高速缓存,将消息集中到缓存后,批量进行发送。这种缓存机制也是高并发处理时非常常用的一种机制。Kafka的消息缓存机制涉及到KafkaProducer中的两个关键组件:accumulator和sender

其中RecordAccumulator就是Kafka生产者的消息累加器。Kafkaproducer要发送的消息都会在reocrdaccumulator中缓存起来,然后再分批发送给Kafkabroker.在RecordAccumulator中,会针对每一个partition,维护一个Deque双端队列,这些dequeue队列基本上是和Kafka服务器端的topic下的partition对应的。每个dequeue里会放入若干个ProducerBatch数据。Kafkaproducer每次发送的消息,都会根据key分配到对应的deque队列中,然后每个消息都会保存在这些队列中的某一个producerbatch中。而消息分发的规则是由上面的partition组件完成的。

生产者发送应答机制
这是在开发过程中比较重要的一个机制,涉及到的,就是producer端一个属性ACKS_CONFIG。这个属性更大的作用在于保证消息的安全性,尤其在replica-factor备份因子比较大的Topic中,尤为重要。
asks=0,生产者不关系broker端有没有将消息写入到partition,只发送消息就不管了。吞吐量是最高的,但是数据安全性是最低的。
asks=all or -1,生产者需要等broker端的所有partition都写完了才能得到返回结果,这样数据是最安全的,但是每次发消息需要等待更长的时间,吞吐量是最低的。
asks=1,则是一种相对中和的策略。leader partition在写完自己的消息后,就向生产者返回结果

生产者消息幂等性
当producer的acks=1 or -1时,producer每次发送消息都是需要获取broker端返回的recordmetadata的,这个过程中就需要两次跨网络请求。如果要保证消息安全,那么对于每个消息,这两次网络请求就必须要求是幂等的。但是网络是不靠谱的,在高并发场景下,往往没有办法保证幂等,producer会重复发送多条消息到broker中,Kafka如何保证无论发送多少次重复数据,broker端都只保留一条消息,这就是消费生产者的幂等性问题。

分布式数据传递过程中的三个语义:at-least-once:至少一次;at-most-once:最多一次;exactly-once:精确一次
Kafka为了保证消息发送的exactly-once语义,增加了几个概念:
PID:每个新的Producer在初始化的过程中就会被分配一个唯一的PID。这个PID是对用户不可见的
Sequence Number:对于每个PID,这个producer针对partition会维护一个SequenceNumber。这是一个重0开始单调递增的数字。当producer要往同一个partition发送消息时,这个sequencenumber就会加1,然后会随着消息一起发给broker
broker会针对每个(pid,partition)维护一个序列号(SN),只有当对应的sequencenumber=SN+1时,broker才会接收消息,同时将SN更新为SN+1.否则就认为消息以及写入了,不需要再重复写入。

生产者消费压缩机制以及消息事物机制
当生产者往broker发送消息时,还会对每个消息进行压缩,从而降低producer到broker的网络数据传输压力,同时也降低了broker的数据存储压力。具体涉及到producerconfig中的COMPRESSION_TYPE_CONFIG配置项
生产者消息事物
通过生产者消息幂等性问题,能够解决单生产者消息写入单分区的幂等性问题,无法解决一次发多条消息问题,这个时候就出现了一个事物机制,保证这一批消息最好同时成功的保持幂等性,或者这一批消息同时失败,这样生产者就可以开始进行整体重试,消息不至于重复。针对这个问题,卡夫卡引入了消息事物机制,者涉及到producer的几个API:

Kafka的事物消息还会做两件事:
一个transactionld只会对应一个PID
跨会话事物对齐
相关文章:
kafka了解-笔记
文章目录 kafka快速上手Kafka介绍Kafka快速上手理解Kafka的集群工作机制Kafka集群的消息流转模型 Kafka客户端小型流转流程客户端工作机制 kafka快速上手 Kafka介绍 MQ的作用 MQ:MessageQueue,消息队列,是一种FIFO先进先出的数据结构&#…...
渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)
Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…...
解决QTimer报“Timers cannot be started from another thread“错误
今天在Qt编程时,将QTimer在子线程里执行start()函数,遇到“Timers cannot be started from another thread”问题,使用了如下AI工具,进行查询: 提示词A:“C QTimer 如何跨线程” 提示词B&#…...
vant4 van-list组件的使用
<van-listv-if"joblist && joblist.length > 0"v-model:loading"loading":finished"finished":immediate-check"false"finished-text"没有更多了"load"onLoad">// 加载 const loading ref(fals…...
C++11新特性之weak_ptr智能指针
本节介绍最后一个智能指针——weak_ptr智能指针。 1.介绍 weak_ptr智能指针也是以模板类的方式实现的。同样定义在<memory>头文件,并位于std命名空间中。在使用前需包含这两条语句。 C11虽然将weak_ptr当做智能指针,但该类型通常不单独使用&#…...
LM Studio无设置代理,更改镜像源方法(MAC)
在macbook上使用LM Studio时发现总是加载失败,App也没有设置代理的地方,搜索了挺多解决方案,貌似官网再可以封补很多解决方案已经过时,最终找到一种替换镜像源的方法共享出来。 方便大家都能使用,不介绍命令行修改方式…...
js中的== 和 ===运算符的比较和区别(面试题)
和 运算符用于比较 JavaScript 值是否相等。 自动转换数据类型,允许不同类型值的比较。 进行严格相等比较,仅在值和数据类型都相同的情况下返回 true。NaN 仅在 比较中与自身相等,而在 比较中不相等。null 和 undefined 仅在 比较中相等。…...
通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决
Chatbox和Open WebUI 等无法获取到 Ollama里的模型,主要是由以下原因导致: Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动,然后再看端口号 使…...
C# 上位机--变量
C# 上位机--变量 在 C# 上位机开发领域,变量是构建程序逻辑的基础元素之一。它就像是一个容器,用于存储各种类型的数据,从简单的数值到复杂的对象。正确理解和使用变量,对于开发出高效、稳定且易于维护的上位机程序至关重要。本文…...
【Mastering Vim 2_01】开篇词:在 AI 时代持续深耕底层技术,做长期主义的坚定捍卫者
【最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性】 文章目录 1 背景:AI 时代的底层技术觉醒2 Vim:一款被严重低估的文本编辑神器3 聊聊 IT 人士的职业病4 进阶之道:构建完整的知识体系5 从 AI 时代的深耕与精进再谈长期主义 1…...
【JVM详解二】常量池
一、常量池概述 JVM的常量池主要有以下几种: class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示: 每个 class 的字节码文件中都有一个常量池,里面是编译后即知的该 class 会用到的字面量与符号引…...
Leetcode - 149双周赛
目录 一、3438. 找到字符串中合法的相邻数字二、3439. 重新安排会议得到最多空余时间 I三、3440. 重新安排会议得到最多空余时间 II四、3441. 变成好标题的最少代价 一、3438. 找到字符串中合法的相邻数字 题目链接 本题有两个条件: 相邻数字互不相同两个数字的的…...
Java爬虫:打造高效的数据抓取利器——详解详情接口设计与实现
在当今数字化时代,数据如同黄金般珍贵。无论是企业进行市场调研、竞争对手分析,还是研究人员收集信息,数据的需求无处不在。而爬虫技术,作为一种高效的数据抓取手段,成为了众多开发者手中的利器。本文将深入探讨如何使…...
蓝桥杯K倍区间(前缀和与差分,取模化简)
输入 5 2 1 2 3 4 5 输出 6 思路:首先由连续子串和可以想用前缀和,由于加减法总和取模和分别取模结果不受影响,所以我们前缀和之后直接取模方便观察性质,本题前缀和:1,3,6,10&#…...
CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)
1. 引言 在 CEF132(Chromium Embedded Framework)的编译过程中,depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集,专门用于获取、管理和更新 Chromium 及其相关项目(包括 CEFÿ…...
Ubuntu 20.04 上安装 qBittorrent
qBittorrent 通过终端安装 系统更新系统升级在 Ubuntu 20.04 上添加 Qbittorent PPA系统更新Qbittorent 安装 Qbittorent 是一个开源且可免费使用的点对点比特流客户端。它体积小,不加载内存盘。众所周知,此应用程序可以在许多操作系统(例如…...
iPhone 在华销量大幅下挫
iPhone在乔布斯时代缔造的神话在中国正逐渐走向没落,挤牙膏式的升级方式类似于诺基亚的N70系列,毫无新意的创新能力,求稳着陆的经营理念,工艺和美学不再独领风骚,甚至拍照领域和AI增强计算,折叠屏等技术领域…...
【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed
1. 问题描述 VScode使用remote ssh 远程服务器,报错类似: [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…...
在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame)还有什么?
在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame),还有其他一些与方法调用相关的重要信息。栈的主要作用是存储方法调用的执行过程中的上下文信息,栈帧是其中最关键的组成部分。 栈的组成 栈帧&am…...
docker发布自己的镜像
官方node-red镜像: nodered/node-red - Docker Image 拉取v3版本: docker pull nodered/node-red:3.1.14 运行镜像: docker run --restartalways --privilegedtrue -d -p 1880:1880 -v node_red_data:/data --name mynodered nodered/n…...
【人工智能】解码语言之谜:使用Python构建神经机器翻译系统
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 神经机器翻译(NMT)是近年来机器翻译领域的一项重大突破。它利用深度学习模型,特别是循环神经网络(RNN)和Transformer网络,以端到端的…...
JavaScript数组类型详解
目录 一、数组的基本概念 二、数组的类型 1. 基本数组类型: 2. 数字数组: 3. 字符串数组: 4. 对象数组: 5. 类型数组(TypedArray): 6. ArrayBuffer数组: 7. 类数组ÿ…...
【实战AI】利用deepseek 在mac本地部署搭建个人知识库
之前的文章中实现了本地通过ollma 部署deepseek R1:14b 模型,这里我想继续实现个人知识库,方便自己文档,数据的检索; 下载anythingLLM 地址: https://anythingllm.com/desktop 下载安装即可;…...
Spring Boot 3.4 中 MockMvcTester 的新特性解析
引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...
Express 中间件
在构建 Web 应用程序时,中间件(Middleware)扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一,以其简洁且强大的中间件机制著称。本文将深入探讨…...
PyCharm结合DeepSeek-R1
PyCharm结合DeepSeek-R1,打造专属 AI 编程助手 在程序员的日常工作中,提高编程效率、快速解决代码问题是重中之重。今天给大家分享一个强强联合的组合 ——PyCharm 插件 Continue 与 DeepSeek-R1,它们能帮你打造出强大的个人 AI 编程助手。 …...
AJAX XML技术详解
AJAX XML技术详解 引言 随着互联网技术的不断发展,前端与后端之间的交互需求日益增长。AJAX(Asynchronous JavaScript and XML)技术应运而生,成为实现前后端分离、提高页面响应速度的关键技术之一。本文将详细介绍AJAX XML技术,包括其原理、应用场景、优缺点等内容。 A…...
【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问
1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx…...
Java+vue前后端分离项目集群部署
一、项目概述 假设我们有一个前后端分离的项目,前端使用React或Vue框架,后端使用Spring Boot或Node.js。我们将分别部署前端和后端到集群环境中。 二、准备工作 1. 代码准备:确保前端和后端代码已经开发完成,并通过本地测试。 2…...
3. CSS中@scope
说说你对 CSS 中scope 的了解 <style>/* scope规则 */scope (#app) {.box {width: 100px;height: 100px;background-color: red;}} </style> <div id"app"><div class"box"></div> </div>CSS 中的scope 是一个相对较新…...
