kafka知识点汇总

news2024/10/6 0:13:06

kafka是什么?

Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。

消息队列的两种模式

  1. 点对点模式
    一个生产者对应一个消费者,消费者消费消息后消息队列删除消息。
  2. 发布/订阅模式
  • 可以有多个topic
  • 消费者消费数据后,不删除数据
  • 每个消费者相互独立,都可以消费到数据。

Kafka基础架构

在这里插入图片描述
kafa的架构是由生产者、kafka集群、消费者、Zookeeper组成的。生产者生产消息,发送到kafka集群,消费者从kafka集群消费消息,Zookeeper存储Kafka相关的元数据信息。
kafka由多个Broker(每个Broker就是一个Kafka服务实例)节点组成。
kafka里面的消息按主题进行管理,每个主题可以分成多个分区,每个分区会有一个或多个副本,分区和副本分别称为Leader分区和Follower分区,Leader分区和Follower分区在不同的Broker上,当Leader分区无法提供服务时,Follower分区会升级成Leader分区为消费者和生产者提供服务,Follower只负责同步数据,不提供服务。
消费者负责消费消息,多个消费者可以组成一个消费者组共同消费一个主题的消息,一个分区只能有消费者组中的一个消费者消费。

ISR、OS、AR

kafka中所有的Partition(Leader+Follower)称为AR(Assigned Replicas),与Leader保持同步的Partition集合称为ISR(In-Sync Replicas),与Leader不同步的Partition则称为OSR(Out-of-Sync Replicas),ISR的维护是根据Follower的同步情况实时维护的。Leader节点选举的时候,从AR中取在ISR中的第一个节点作为Leader。

生产者消息发送流程

在这里插入图片描述
生成者生产消息,然后消息经过拦截器做一些业务处理,然后通过序列化器做消息序列化,接着通过分区器对消息进行分区,分区器里面可以指定消息发往那个分区。
生产者将消息分好区后发送到RecordAccumulator中进行缓存,该缓冲器默认大小是32M,不同分区的消息不缓存到不同的内存缓存队列(ProducerBatch)中。
Sender线程负责不断的从RecordAccumulator中拉取消息发送到KafkaBroker,Sender线程拉取消息的策略可以通过batch.size和linger.ms来配置。

  • batch.size配置ProducerBatch中数据累积到一个阈值后,Sender才会拉取数据,默认是16K。
  • linger.ms配置sender拉取数据的时间间隔,默认为0;
  • Sender拉取数据的条件就是ProducerBatch中数据累积达到batch.size或者时间间隔达到linger.ms,linger.ms为0表示,数据来了就会立马被Sender拉走。

Sendder内部通过InFightRequest来缓存数据发送到Broker但尚未收到应答的请求,底层通过Selector进行数据传输。 应答ACK有三种配置策略。

  • 0:生产者发送过来的数据,不需要等待数据落盘应答,可靠性差,效率高。
  • 1:生产者发送过来的数据,Leader收到数据后应答,可靠性中等,效率中等。
  • -1/all:生成者发送过来的数据,需要Leader和ISR队列里面的所有节点收齐数据后应答,可靠性高,效率低。

kafka消息的顺序

kafka只能在一定条件下保证单分区消息的有序。

  • 在1.x版本之前,需要配置max.in.flight.requests.per.connection=1,也就是Sender线程向Broker发送请求的InFightRequest只缓存一个连接。保证前一条消息成功落地后才发送下一条。
  • 在1.x版本后提供类消息的幂等性,在开启幂等性的前提下,max.in.flight.requests.per.connection <= 5即可,未开启幂等性的情况下,max.in.flight.requests.per.connection=1。

Kafka中的几个偏移量

Kafka每个Partition中的消息都是append进去的,Kafka用几个重要的偏移量对消息进行维护。
在这里插入图片描述
每个Partition分别维护着这些偏移量,用于数据同步和Leader重新选举后恢复数据一致性。
新的Leader出现后,如果其他Follower的HW小于新Leader的HW,则会先截取新HW之后的数据再开始同步,所以,如果Leader重选的Partition的HW小于先前的Leader的HW,则会出现消息丢失

消息丢失场景

生产者端

  1. ACK配置为0;
  2. ACK配置为1,消息发到Leader成功,但是Leader还没来得及同步到Follower就挂掉了。
  3. unclean.leader.election.enable配置为true,允许选举ISR以外的副本作为Leader,会导致数据丢失,默认为false。

解决方案:

  1. ACK配置为all/-1.
  2. 配置:min.insync.replicas>1,副本指定必须确认写操作成功的最小副本数量。
  3. 生产者发送消息会自动重试,要不可恢复的异常会抛出,这个时候可以捕获异常对发送失败的消息单独处理。

消费者端

  1. 先commit再处理消息,如果处理消息时遇到异常,但offset已经提交,则消息会丢失。

解决方案:先处理再commit。

如果先处理消息再commit,消息处理完成后,commit提交失败则会导致重复消费问题。

Broker
broker在消息刷盘到磁盘之前挂掉,则会导致未刷盘的消息丢失。

解决方案:减少刷盘间隔。

如何保障消息不被重复消费

MQ无法解决消息的重复消费,所以需要消费者来保障消息的不被重复消费,可以采用幂等来解决(一个数据或请求重复,确保对应数据不会改变,不能出错)。

  • 如果是写redis等缓存,则天然幂等。
  • 生产者发送消息带上一个全局唯一的id,消费者拿到消息后,先更加这个id去redis里查一下,如果消费过则不再消费。
  • 基于数据库的唯一键。

Kafa脚本

kafka-topics.sh

参数描述
–bootstrap-server <String:server toconnect to>连接的KafkaBroker主机名称和端口号
–topic <String:topic>操作的topic名称
–create创建主题
–delete删除主题
–alter修改主题
–list查看所有主题
–describe查看主题详细描述
–partitions <Integer:#of partitions>设置分区数
–replication-factor <Intger:replication factor>设置分区的副本数
–config <String:name=value>更新系统默认配置

创建主题

bash./kafka-topics.sh --zookeeper localhost:2181 --create --topic topic_name --partitions partition_num --replication-factor replication_num

其中:

–zookeeper localhost:2181:指定Zookeeper的地址。
–create:表示创建主题。
–topic topic_name:指定主题名称。
–partitions partition_num:指定主题的分区数。
–replication-factor replication_num:指定主题的副本数。

分区数只能增加,不能减少;
命令行不能修改副本数;

kafka-console-producer.sh

bash./kafka-console-producer.sh --broker-list localhost:9092 --topic topic_name
> message

其中:

–broker-list localhost:9092:指定Kafka的地址。
–topic topic_name:指定要发送消息到的主题。
–message`:要发送的消息内容。

kafka-console-consumer.sh

bash./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic_name --from-beginning

其中:
–bootstrap-server localhost:9092:指定Kafka的地址。
–topic topic_name:指定要消费的主题。
–from-beginning:从消息队列头部开始消费。

是否从头消费根据实际情况决定。

SpringBoot集成Kafka

maven

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

customer

@Service
public class KafkaConsumer {
    @KafkaListener(topics = "my-topic",groupId = "my-group")
    public void kafkaListen(String message){
        System.out.println(message);
    }
}

producer

@RestController
@RequestMapping("/api/kafka")
public class KafkaController {
    @Autowired
    private KafkaTemplate kafkaTemplate;
    @GetMapping("send")
    public Result send(String topic,String msg){
        kafkaTemplate.send(topic,msg);
        return Result.ok();
    }
}

消费者配置:
auto.offset.rese:

  • earliest:消费未消费过的数据。
  • latest:消费最新的消息,消费者启动前产生的消息不会再次消费。

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

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

相关文章

Frp实现外网访问内网服务

一、需求背景 博主在本地电脑&#xff08;Windows&#xff09;上安装了一款BS架构的软件&#xff0c;现在想要其他人通过域名直接访问本地电脑的web服务。 二、准备事项 &#xff08;一&#xff09;前置条件 公网IP&#xff08;可以购买阿里云轻量服务器&#xff09;域名&a…

【藏经阁一起读】(68)__《ECS技术实战指南》

【藏经阁一起读】&#xff08;68&#xff09;__《ECS技术实战指南》 目录 一、知识收获 &#xff08;1&#xff09;、CIPU &#xff08;2&#xff09;、RDMA 二、个人建议 一、知识收获 &#xff08;1&#xff09;、CIPU 1、多模态、海量数据、超大模型成为发展方向&#…

基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. Face.APl调用1&#xff09;Face.APl介绍2&#xff09;调用API 2. 数据爬取1&#xff09;网络数据爬取步骤2&#xff09;爬虫实现 3. 模型构建4. 用户界面设计1&#xff09;需要调用的库文…

肖sir__mysql之多表练习题__006

已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09; 1&#xff1a;dept表中有4条…

论文解读 | 基于视觉的水果采摘机器人识别与定位方法研究进展

原创 | 文 BFT机器人 01 背景 在复杂的农业环境中&#xff0c;利用机器视觉及其相关算法可以提高收割机器人的效率、功能性、智能化和远程互动性。对于水果采摘机器人系统来说&#xff0c;主要的挑战包括免提导航和水果定位&#xff0c;以及大多数果园中常见的崎岖地形和大型…

Direct3D纹理映射

借助纹理映射技术&#xff0c;我们可将图像数据映射到三角形单元中&#xff0c;这种功能可以显著地增加所绘制场景的细节和真实感&#xff0c;例如创建一个立方体然后为其每个面映射一个板条纹理&#xff0c;从而将该立方体变为一个板条箱&#xff0c;在Direct3D中纹理用接口ID…

武汉凯迪正大—高压信号发生器

一、产品介绍 本产品是我公司在长期从事电缆故障测试研究方面新开发的创新型换代产品&#xff0c;采用大屏幕彩色液晶显示器、指示高压侧真实电压值、具有过压、过流保护。该产品满足《中华人民共和国电力行业标准&#xff0c;高压试验装置通用技术条件》&#xff0c;主要用于对…

数学建模——差分方程结论介绍

适用对象&#xff1a;事物发展具有明显阶段性 一、差分方程介绍 差分方程是一种描述离散系统演化的数学工具。与微分方程不同&#xff0c;差分方程使用差分代替微分来描述变量之间的关系。 差分方程通常由递归关系定义。假设有一个序列 {y₀, y₁, y₂, y₃, ...}&#xff0c;…

两个单链表相交的问题

两链表相交及其第一个节点 判断有环无环 判断有无环&#xff0c;如果有环返回第一个入环节点&#xff0c;如果无环返回null 使用额外空间&#xff1a;Set结构 沿着指针将a、b、c、d、e、c放入set结构中&#xff0c;每次放入前查看在set集合中是否存在&#xff1b; 若遍历到…

供应商整合对企业有哪些好处?

企业采购总是希望降低成本&#xff0c;赢得更多的利润。实现这目标的其中一种方法就是供应商整合。 究竟什么是供应商整合&#xff1f;整合供应商有哪些好处&#xff1f;本文为你详细解答。 什么是供应商整合&#xff1f; 供应商整合是减少特定产品或服务的供应商数量的过程。…

JTS:06 九交模型讲解

版本 org.locationtech.jts:jts-core:1.19.0 链接: github 九交模型讲解&#xff1a;Dimensionally Extended 9 Intersection Matrix 九交模型 九交模型&#xff0c;是通过矩阵来判断俩个物体的关系的&#xff0c;请看上面九交模型讲解 九交模型测试 测试环境 www.geogebra…

Unity中 UI Shader的基本功能

文章目录 前言一、实现思路1、暴露一个 2D 类型的属性来接受UI的纹理2、设置shader的层级为TransParent半透明渲染层级&#xff0c;一般UI都是在这个渲染层级3、更改混合模式&#xff0c;是 UI 使用的纹理&#xff0c;该透明的地方透明 二、代码实现 前言 Unity中 UI Shader的…

SpringBoot-线程池ThreadPoolExecutor异步处理(包含拆分集合工具类)

ThreadPoolExecutor VS ThreadPoolTaskExecutor ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。 配置文件application.yml # 异步线程配置 自定义使用参数 async:executor:thread:core_pool_size: 10max_pool_size: 100 # 配置最大线程数queue_capacity: …

gif动态图片如何做?两个方法教你在线制作gif

制作gif动画的方法有哪些&#xff1f;gif动图作为当下流行的一种图片格式&#xff0c;是由一帧一帧的图像&#xff0c;循环播放而产生的动画效果。那么&#xff0c;制作gif动画的方法有哪些呢&#xff1f;给大家分享一款专业的gif动画制作&#xff08;https://www.gif.cn/&…

【JVM】Java的内存模型(JMM)!

一、运行时数据区域划分 JVM虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JDK 1.8之前分为&#xff1a;线程共享&#xff08;Heap堆区、Method Area方法区&#xff09;、线程私有&#xff08;虚拟机栈、本地方法栈、程序计数器&#xff09; …

“一种三元前驱体废水螯合树脂回收钴的装置”实用新型专利

“一种三元前驱体废水螯合树脂回收钴的装置”实用新型专利 (证书号&#xff1a;第19681862号;专利号&#xff1a;ZL 2022 2 1042752.0) 三元前驱体通常由三元液(硫酸镍、钴、锰的混合溶液)、液碱与氨水在一定条件下液相合成&#xff0c;再经陈化、固液分离、流水洗涤、干燥、过…

PMP考试注意事项有哪些?

1. PMI明确规定&#xff1a;不允许考生使用自带文具&#xff0c;包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等&#xff0c;请向监考老师举手示意。…

【实战】H5 页面同时适配 PC 移动端 —— 旋转横屏

文章目录 一、场景二、方案三、书单推荐01 《深入实践Kotlin元编程》02 《Spring Boot学习指南》03 《Kotlin编程实战》 一、场景 一个做数据监控的单页面&#xff0c;页面主要内容是一个整体必须是宽屏才能正常展示&#xff0c;这时就不能用传统的适配方案了&#xff0c;需要…

DC电源模块单路、双路输出的不同应用场景

BOSHIDA DC电源模块单路、双路输出的不同应用场景 DC电源模块是一种常见的供电设备&#xff0c;通常用于将市电转换为稳定的直流电源&#xff0c;以供电给各种电子设备。DC电源模块的输出方式分为单路和双路两种&#xff0c;下面将分别介绍它们的不同应用场景。 一、单路输出…

wx.getPrivacySetting 小程序隐私保护指引的使用(复制粘贴即用)

创建privacyPopup 组件 privacyPopup.js Component({properties: {},data: {wxPrivacyName: ,showAgreement: false},lifetimes: {attached() {this.init();}},methods: {async init() {if (isLogin()) {const userPrivacy await this.getPrivacy();this.setData({wxPrivacy…