Kafka详解

news2024/10/7 4:24:30

文章目录

  • 1、kafka简单介绍
  • 2、kafka使用场景
  • 3、kafka基本概念
  • 4、kafka集群
    • 1、数据冗余
    • 2、分区的写入
      • 1、使用 Partition Key 写入特定 Partition
      • 2、由 kafka 决定
      • 3、自定义规则
    • 3、读取分区数据
  • 5、提交策略
  • 6、kafka如何保证高并发

1、kafka简单介绍

kafka是一款分布式、支持分区的、多副本,基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。

2、kafka使用场景

  1. 日志收集:可以用kafka收集各种服务的日志 ,通过已统一接口的形式开放给各种消费者。
  2. 消息系统:解耦生产和消费者,缓存消息。
  3. 用户活动追踪:kafka可以记录webapp或app用户的各种活动,如浏览网页,点击等活动,这些活动可以发送到kafka,然后订阅者通过订阅这些消息来做监控。
  4. 运营指标:可以用于监控各种数据。

3、kafka基本概念

kafka是一个分布式的分区的消息,提供消息系统应该具备的功能。

名称解释
broker消息中间件处理节点,一个broker就是一个kafka节点,多个broker构成一个kafka集群。
topickafka根据消息进行分类,发布到kafka的每个消息都有一个对应的topic
producer消息生产(发布)者
consumer消息消费(订阅)者
consumergroup消息订阅集群,一个消息可以被多个consumergroup消费,但是一个consumergroup只有一个consumer可以消费消息。
partition分区,一个topic可以对应多个分区
replica副本,是一个只能追加写消息的日志文件
offset偏移量

kafka中的topic被分为了多个partition分区。topic实际上是一个逻辑概念,partition是最小的存储单元,存储着一个topic的部分数据。每个partition都是一个单独的log文件,每条记录都以追加的形式写入。
partition中的每条记录都会被分配一个特有的offset,当一条记录写入时,他会追加到log文件的末尾,并分配一个序号,作为一个offset。
这里需要注意顺序消费的场景。每个topic对应多个partition,这些分区是无序的,但是分区里面的数据是有序的,所以我们在做顺序消费的场景的时候,需要注意要将消息放到一个partition。

4、kafka集群

kafka支持集群化部署就是依赖于分区机制。
在这里插入图片描述
这么设计的优点:
1,如果把 Topic 的所有 Partition 都放在一个 Broker 上,那么这个 Topic 的可扩展性就大大降低了,会受限于这个 Broker 的 IO 能力。把 Partition 分散开之后,Topic 就可以水平扩展 。
2,一个 Topic 可以被多个 Consumer 并行消费。如果 Topic 的所有 Partition 都在一个 Broker,那么支持的 Consumer 数量就有限,而分散之后,可以支持更多的 Consumer。
3,一个 Consumer 可以有多个实例,Partition 分布在多个 Broker 的话,Consumer 的多个实例就可以连接不同的 Broker,大大提升了消息处理能力。可以让一个 Consumer 实例负责一个 Partition,这样消息处理既清晰又高效。

1、数据冗余

在kafka集群中,kafka为Partition做了数据冗余处理,这样即使一个broker挂了,消费者也可以在其他broker找到这个partition。

2、分区的写入

既然一个topic可以有多个Partition,那么消息进来的时候,到底该进那个Partition呢,kafka提供了三种模式

1、使用 Partition Key 写入特定 Partition

Producer 发送消息的时候,可以指定一个 Partition Key,这样就可以写入特定 Partition 了。
Partition Key 可以使用任意值,例如设备ID、User ID。
Partition Key 会传递给一个 Hash 函数,由计算结果决定写入哪个 Partition。
所以,有相同 Partition Key 的消息,会被放到相同的 Partition。
例如使用 User ID 作为 Partition Key,那么此 ID 的消息就都在同一个 Partition,这样可以保证此类消息的有序性。
这种方式需要注意 Partition 热点问题。

例如使用 User ID 作为 Partition Key,如果某一个 User 产生的消息特别多,是一个头部活跃用户,那么此用户的消息都进入同一个 Partition 就会产生热点问题,导致某个 Partition 极其繁忙。

2、由 kafka 决定

如果没有使用 Partition Key,Kafka 就会使用轮询的方式来决定写入哪个 Partition。
这样,消息会均衡的写入各个 Partition。
但这样无法确保消息的有序性。

3、自定义规则

Kafka 支持自定义规则,一个 Producer 可以使用自己的分区指定规则。

3、读取分区数据

通常Kafka产生堆积的原因都是消费速率跟不上生产速率,生产者发送消费没有什么业务逻辑,而消费者消费时需要等待业务逻辑处理。因此,我们来看看“不考虑优化业务逻辑的前提下,如何通过设置合理的Topic分区数来提高消费能力”。

1,不确定生产速率和消费速率:分区数 = 部署的服务实例数

当研发人员需要申请新的Topic但还无法预估生产者和消费者处理消息的能力时,可以先按照标准场景申请与 服务实例数 相等的分区数。
2,明确生产速率低于消费速率:分区数 = 部署的服务实例数

当业务系统稳定运行并且确定Topic的平均生产速率低于消费速率时,也应该申请与 服务实例数 相等的分区数,避免消息突增时作为消费者的服务实例负载倾斜。
3,生产速率高于消费速率(同时增加分区数和服务实例数):分区数 = 部署的服务实例数

当业务能预估到消息的生产速率高于消费速率,最直接的方式就是同时增加分区数和服务实例数,从而提高整体消费速率。但往往在非必要的情况下增加服务实例数会导致严重的资源浪费,因此在不增加服务实例数的前提下,也可以通过提高单机 并行度 来提高消费速率。
4,生产速率高于消费速率(增加分区数,服务实例数不变):分区数 = 部署的服务实例数 * N
承接上一个场景,假设服务实例数为4,需要申请12个分区,那么单机 并行度 = 3,并行度在消费者注解中添加

5、提交策略

1,自动提交:默认配置(配置中心公共配置)为自动提交,即每隔一段时间(默认5s)提交一次,自动提交可以很大程度上降低Kafka服务端的压力,并且减少客户端的网络开销,如果消费逻辑做好了业务幂等,尽可能选择自动提交。
实际上自动提交并不是严格地每间隔一段时间提交一次偏移量(旧版的客户端是有一个AutoCommitTask进行轮询提交),而是每次在调用 KafkaConsumer.poll()时判断当前时间距离上次提交时间是否超过了配置了提交间隔,如果超过了就进行提交,所以实际上的提交时间会超过配置的提交间隔。另外由于KafkaConsumer.poll()方法会返回多条消息(由配置项,max.poll.records控制),因此如果上一批消息消费耗时超过提交间隔,也会导致实际提交时间推迟。
2,手动提交:即spring.kafka.consumer.enable-auto-commit=false,设置手动提交时需要主动调用提交方法,具体方法根据使用的客户端而定。当消息量较大时使用手动提交会给Kafka服务端带来压力,并增加客户端的网络开销,不过还是建议重要消息或者是无法保证业务幂等的消费逻辑使用手动提交。

使用kafka-client:Kafka自带的客户端,需要主动调用KafkaConsumer.commitSync()或KafkaConsumer.commiAsync()进行偏移量提交。

使用spring-kafka:基于spring和kafka-client封装的高阶API,当是否自动提交设置为false时,每消费完一条消息就会自动提交一次偏移量(同步提交),无需手动调用API提交。

6、kafka如何保证高并发

kafka的高并发依赖于页缓存技术和磁盘顺序写。
有研究表名,在磁盘中的顺序读写要比在内存中的随机读写要快。
页缓存技术是操作系统级别的缓存(page cache),即先将数据写入到系统缓存中(内存),并且是只写入到内存中,由操作系统决定什么时候写入磁盘。

在这里插入图片描述
kafka在写数据的时候,是以顺序写的方式来刷盘的,即只在文件末尾来追加数据,而不是在文件的随机位置写入数据。
上面那个图里,Kafka 在写数据的时候,一方面基于 OS 层面的 Page Cache 来写数据,所以性能很高,本质就是在写内存。
另外一个,它是采用磁盘顺序写的方式,所以即使数据刷入磁盘的时候,性能也是极高的,也跟写内存是差不多的。

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

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

相关文章

Java阶段四Day08

Java阶段四Day08 文章目录 Java阶段四Day08关于pom.xml中的版本关于Session关于Token关于JWT在项目中使用JWTCustomUserDetailsUserDetailServiceImplUserServiceImpl 关于pom.xml中的版本 查看<groupId> 是同一家的只需配一个版本号<version><artifactId>中…

C# 线程基础

目录 一、概述 二、线程的创建 三、线程的休眠 四、线程的等待 五、线程的终止 六、线程的状态 七、线程的优先级 一、概述 线程&#xff08;Thread&#xff09;是进程中的基本执行单元&#xff0c;是操作系统分配CPU时间的基本单位&#xff0c;一个进程可以包含若干个…

【FPGA入门】第七篇、FPGA驱动VGA实现动态图像移动

目录 第一部分、实现效果 第二部分、动态VGA显示的原理 1、将动态显示的区域提前进行赋值 2、图像块的移动是每张图片叠加后的效果 3、如何实现图像块位置的改变 第三部分、系统结构和驱动波形 1、系统的Top-down结构 2、图像块移动的驱动波形 第四部分、代码 1、同步…

大语模型前世今生

引言&#xff1a;席卷世界的大语言模型浪潮 2022年11月30日&#xff0c;OpenAI公司发布了ChatGPT。这迅速成为了社会各界关注的焦点&#xff0c;ChatGPT能够如此快速&#xff0c;准确的完成文本生成&#xff0c;信息抽取&#xff0c;机器翻译&#xff0c;甚至代码生成等复杂任务…

数字化转型|银行业数据中心数字化转型之模型篇 01

导语&#xff1a; 银行业数据中心数字化转型是一项系统性工程&#xff0c;既涉及管理层面转型——包括数字化转型战略、基础架构和技术架构转型、技术创新和知识体系转型&#xff0c;又涉及执行层面转型——包括人员管理&#xff08;P&#xff09;、流程管理&#xff08;P&…

突破官方限制!最强TV观影神器我都给你找来了!

随着移动互联网的兴起&#xff0c;我想很多人家里的电视机都积起了灰&#xff0c;大家追剧的设备都从电视机变成了手机、平板、电脑 但这两年&#xff0c;我发现这个事情又慢慢有在转变了&#xff1a;随着大家&#xff08;尤其是年轻人&#xff09;对观看体验的追求&#xff0…

接口的学习

接口 接口可以理解为一种规则&#xff0c;是对行为的抽象 如何定义一个接口 使用关键词interface定义 public interface 接口名{} 接口不能实例化 接口和类之间是实现关系&#xff0c;通过关键词implements关键字表示 public class 类名 implements 接口名{} 接口的子类…

三个数据恢复方法解决移动硬盘数据丢失问题!

移动硬盘容量大、写入和读取速度快&#xff0c;受到很多人的欢迎。但是&#xff0c;无论数据存储在何处&#xff0c;都有数据丢失的风险。今天&#xff0c;小编来介绍一下移动硬盘数据恢复的方法&#xff0c;以免大家不慎删除移动硬盘数据而陷入无助的境地! 方法1.使用命令恢复…

全网最详细,性能测试-测试方法总结(压力/负载)超详细

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 并发/负载/压力理…

leetcode123. 买卖股票的最佳时机 III(java)

买卖股票的最佳时机 leetcode123. 买卖股票的最佳时机 III题目描述动态规划代码演示 动态规划专题 leetcode123. 买卖股票的最佳时机 III 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-sto…

API手册使用方式说明

API手册使用方式说明 其实我们在API阶段,更多是要去学习别人已有内容,比如方法的使用 但是这么多的方法对于新手来说其实是不太友好的,刚开始根本记不住呀 所以API手册就是我们的一个好帮手,我们可以在API手册查到目标内容的介绍 类似于小学刚学字的时候,不会的字就可以去查字…

连接器信号完整性仿真教程 四

本文详细讲解了CST做连接器信号完整性仿真时,如何从材料库中载入材料,如何新增材料、如何编辑材料属性、如何将材料添加到库中,以及如何设置仿真模型材料、并以实例逐步做了详细演示。 一 从材料库中载入材料 从材料库中载入材料有两种方法。 方法一 点击菜单"Modelin…

Android 12 以上PendingIntent使用注意FLAG_IMMUTABLE

遇到如下报错&#xff1a; Fatal Exception: java.langlllegalArgumentException : Targeting S (version 31 and above) reures that one of FLAG_MMUTABLE r FLA-MUTABLE be specfed when creating a Pendinglntent. Strongly consider using FLAG_JMMUTABLE only use FLAG_M…

Redis的缓存类型分析

HashMap/ConcurrentHashMap HashMap 是一种基于哈希表的集合类&#xff0c;它提供了快速的插入、查找和删除操作。是很多程序员接触的第一种缓存 , 因为现实业务场景里&#xff0c;我们可能需要给缓存添加缓存统计、过期失效、淘汰策略等功能&#xff0c;HashMap 的功能就显得…

如何搭建产品知识库?让产品知识库管理更有序高效!

在现代企业中&#xff0c;一个完善的产品知识库对于提升团队的工作效率和产品质量至关重要。本文将介绍如何搭建一个高效的产品知识库&#xff0c;并提供一些管理方法&#xff0c;以使知识库的管理更有序、高效。 随着科技的不断进步和市场竞争的加剧&#xff0c;企业对于高效…

python基础学习--01

1.python环境的安装&#xff1a; 1.安装 Python 解释器&#xff1a;https://www.python.org/ 1.选择下载&#xff1a; 2.选择windows x86 -64 可执行的安装文件 (根据自己电脑的操作系统选择&#xff09; 3.安装完成后 左下角点击开始地方能看到这些说明安装好了。 4.安装…

SpringBoot原理(1)--@SpringBootApplication注解使用和原理

文章目录 前言主启动类的配置SpringBootConfiguration注解验证启动类是否被注入到spring容器中 ComponentScan 注解ComponentScan 注解解析与路径扫描 EnableAutoConfiguration注解 问题解答1.AutoConfigurationPackage和ComponentScan的作用是否冲突起因回答 2.为什么能实现自…

双路高速 AD 实验

目录 双路高速 AD 实验 1、简介 3PA1030 芯片 2、实验任务 3、程序设计 3.1、hs_dual_ad 模块代码 clk_wiz IP 核 的添加方法 ILA IP 核&#xff08;集成逻辑分析器&#xff1a;Integrated Logic Analyzer&#xff0c;ILA&#xff09; 4、硬件设计 4.1、添加.xdc约束…

23年软考网络工程师是什么?主要是考什么,有什么用?

网络工程师每年考两次&#xff0c;相比其他的软考考试一年中考的机会又多了一次 网络工程师证书考到后&#xff0c;通过本级考试的合格人员能根据应用部门的要求进行网络系统的规划、设计和网络设备的软硬件安装调试工作&#xff0c;能进行网络系统的运行、维护和管理&#xf…

汽车行业项目管理面临的5个挑战及解决方案

汽车行业正跨越式地迈向新的未来。其目前的发展主要由四大趋势驱动&#xff1a;连接性、自动驾驶汽车、共享出行和电气化。这给汽车企业带来了诸多挑战&#xff1a;竞争加剧&#xff0c;快速发展带来的频繁变化&#xff0c;与软件公司建立伙伴关系&#xff0c;以及其他相关问题…