kafka学习笔记

news2024/11/24 0:27:53

1. 官网 

​​​​​​​​​​​​​​​​​​​​​​​​​Apache Kafka

2. akf

X轴拆分: 水平复制,就是讲单体系统多运行几个实例,做集群加负载均衡的模式,主主、主备、主从。解决单点,高可用问题

Y轴拆分: 基于不同的业务拆分

Z轴拆分: 基于数据拆分。分片分治

3. 概念

Apache Kafka是Apache软件基金会的开源的流处理平台,该平台提供了消息的订阅与发布的消息队列,一般用作系统间解耦、异步通信削峰填谷等作用。同时Kafka又提供了Kafka streaming插件包实现了实时在线流处理。相比较一些专业的流处理框架不同,Kafka Streaming计算是运行在应用端,具有简单、入门要求低、部署方便等优点。

有的kafka消息可以被多个消费者进行消费,有的只能有一个消费者进行消费

Kafka集群以Topic形式负责分类集群中的Record每一个Record属于一个Topic。每个Topic底层都会

Kafka集群以Topic形式负责分类集群中的Record,每一个Record属于一个Topic。每个Topic底层都会对应一组分区的日志用于持久化Topic中的Record。同时在Kafka集群中,Topic的每一个日志的分区都一定会有1个Borker担当该分区的Leader,其他的Broker担当该分区的follower,Leader负责分区数据的读写操作,follower负责同步改分区的数据。这样如果分区的Leader宕机,该分区的其他follower会选取出新的leader继续负责该分区数据的读写。其中集群的中Leader的监控和Topic的部分元数据是存储在Zookeeper中.

只能保证分区内部的有序性;同一个topic的不同分区,不能保证数据有序

每个消费者可以控制自己的消费偏移量,多个消费者消费消息互不干扰

offset是下一次要读取的位置

kafka的消息消费是以消费组的形式进行消费

同一消费组中的消费者对消息进行均分消费

消费组个数一般要小于topic中的分区数

kafka高吞吐量,即使是普通的服务器,也可以支持每秒百万级的写入,超过了大部分的消息中间件

kafka的消息是以日志的形式存储在磁盘中,为了优化写入速度,采用了顺序写入MMFile两个技术。顺序写可以减少磁盘寻址时间,MMFile(内存映射文件)可以减少IO,使写入性能逼近内存

 

kafka的服务将数据往pageCache中写入,由pageCache写入磁盘

4. DMA

常规IO操作会让CPU阻塞,等待从磁盘中读取数据;

 DMA(直接内存访问)读取会新增DMA,减少CPU的阻塞

 零拷贝

5. 知识点

副本因子的个数不能大于broker的个数 

kafka中的分区数只能增,不能减

kafka的操作,默认是异步的

kafka也需要对key、value进行序列化(redis也需要)

生产者发送消息时,对消息进行序列化

消费者消费消息时,要对消息进行反序列化

subscribe消费时,通过消费组实现负载均衡;

assign消费时,可以指定分区、offset进行消费

6. 默认的分区策略

1. 如果指定了分区,使用指定的

2. 如果没有指定分区,key存在,那么分区基于key的hash值

3. 如果没有指定分区,也没有key,那么轮讯

也可以自定义分区策略,实现Partitioner接口

默认没有拦截器,可以自定义拦截器

拦截器可以对发送过来的消息进行修改

当消费者首次消费时(kafka中没有记载offset),默认消费最新的消息,也可以进行设置

可以设置offset自动提交的时间间隔

 

7. ack

ack可以保证消息可靠性

 

8. 重复消费

生产者正常发生消息,消费者正常消费消息,但是消费完消息给生产者发送应答失败。生产者会认为消息没有消费成功,会重试,此时会造成消息重复消费

重试次数,不包含第一次发送

怎么避免消息重复消费:

服务端对消息进行校验,看看是否是重复的请求

添加唯一标识,并记录该标识是否消费完成

幂等:

kafka中幂等默认是关闭的,在使用幂等的时候,必须开启retries=true和acks=all

 

kafka的幂等只能保证一条记录在分区内发送的原子性;要保证多分区的多条记录之间的完整性,需要事务

9. 事务

kafka的事务分为生产者事务、消费者&生产者事务

kafka开启事务后,需要将隔离级别改成read_committed(默认是read_uncommitted)

消费者端开启事务后,需要关闭自动提交offset

事务流程

10. 数据同步机制(leader到follower) 

partition底层是按照segment(段)对文件进行存储

HW(high watermarker):高水位线,HW之前的数据都已经完成备份。当所有节点都备份成功,leader才会更新HW

LEO(log end offset):标识的是分区中最后一条消息的下一个位置,每个分区副本有自己的LEO

ISR:是leader维护的一份处于同步的副本集合,要是followerf同步很慢,会被踢出isr

OSR:于leader副本同步滞后过多的副本(不包括leader副本)将组成 OSR 

AR:分区中的所有副本统称为 AR。AR=ISR+OSR

kafka0.11版本之前,通过高水位(HW)来保持数据同步

缺点:

1. 数据丢失

2. leader和follower数据不一致

kafka0.11之后,引入了Leader Epoch来解决数据同步问题,代替HW作为消息的截断点

11. 监控

kafka eagle可以对kafka进行监控

12. 整合SpringBoot

Springboot中使用@KafkaListeners进行监听,接收消息

使用@SendTo发送消息

也可以使用KafkaTemplate进行操作

kafka的事务也支持@Transactional注解

 

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

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

相关文章

年底了,千万不要跳槽。

最近不少人在私信问我:做了几年 Java 工程师,现在很迷茫,想跳槽但是感觉底气不足,不知道如何是好。 作为一个资历不浅的 Java 开发,这几年我面试过不少人。发现大多数面试者,虽然看起来工作努力&#xff0…

FPGA 点亮LED灯

设计流程 首先对项目要有一个全局的考虑,分析项目需要几个模块构成,确定各个子模块的关系和信号之间 的相互关系,然后确定模块的端口信号有哪些;根据每个模块的功能并结合芯片、接口的时序手册画 出该模块能正常工作的时序波形图…

CSS3【垂直对齐方式、光标类型、 边框圆角 、overflow溢出部分显示效果 、元素本身隐藏】

文章目录二、装饰2.1 认识基线(了解)2.2 文字对齐问题2.3 垂直对齐方式2.4 小结2.5(拓展)项目中 vertical-align 可以解决的问题2.6 光标类型2.7 边框圆角2.8 边框圆角的常见应用2.9 小结2.10 溢出部分显示效果2.11 小结2.12 元素…

智慧医院信息化建设解决方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。 【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除! 完整资料领取见文末,部分资料内容: 远程会诊 云…

Java的设计模式

本文档是学习后的个人总结,用于备查,如果有冒犯,请联系我删除。 参考文档: 1、简单工厂模式,工厂方法模式,抽象工厂模式 2、Java中常用的设计模式 上面这个链接写的特别清楚,也有代码示例&#…

记一次云服务器EIP出现异常对外攻击的问题

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 首先祝大家圣诞快乐,Merry Christma! 中毒了 今天云主机运维人员告诉我说&#x…

【Flask框架】——26 ORM关联关系

1、表的外键关联 使用SQLAlchemy创建外键非常简单。在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和主表的主键字段类型保持一致。 这种关联只关注数据表之间的外键关联,不考虑Python对象之间…

ORB-SLAM3代码和算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中,因此在tracking中没有为imu模式设置单独的初始化函数,而IMU的初始化是在localMapping中实现的。 很有用的参考链接:https://cloud.tencent.com/developer/article/1761043 1双目…

【高阶数据结构】搜索二叉树

🌈欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句…

Word控件Spire.Doc 【评论】教程(2):在 C#、VB.NET 中删除和替换 Word 文档中的注释

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除! 完整资料领取见文末,部分资料内容: 国家档案局证…

MySQL主从搭建

MySQL主从搭建一 主从配置原理二 搭建步骤(基于两个docker容器)三 django实现读写分离3.1 配置数据库3.2 models中创建表3.3 数据库迁移3.4 指定要使用的数据库四 Pycharm远程连接服务器进行代码的运行与调试五 Pycharm远程链接docker开发5.1 操作 docke…

SSM图书管理系统(增强版,附源码)

前篇引入(新人必看):SSM图书管理系统(原版) 之前给大家分享过SSM图书管理系统项目的源码,热度较高,但我也发现功能并不是很全面,所以这次对系统进行了功能增强,以下是系…

新手入门搭建一个spring boot项目

1. 打开Idea,新建一个maven项目,详细情况见下图,(idea版本2021.1.2) 2.查看新建项目的maven包是否存在, 注意:maven包需要自己去下载,注意要下载与版本对应匹配的包 3.导入spring boot 相关的依…

springboot 连接不上 redis 的三种解决方案!

针对于springboot 连接不上 redis 这种情况,首先,我们最简单直接的方法就是需要确认Redis是否已经正常启动(验证方法:如果安装在Linux下的话可以使用ps-ef|grep redis来进行确认是否开启) 如果未开启,我们可…

STL-string的接口使用及模拟实现

文章目录string类的介绍string类的常用接口介绍 构造相关 无参构造字符串构造拷贝构造 容量相关的接口 sizereserveresizecapacityemptyclear 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backoperatorinserterasec_strfind npossubs…

Redis搭建主从集群

搭建集群 建集群的第一件事情我们需要一些运行在 集群模式的Redis实例。这意味这集群并不是由一些普通的Redis实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。 下面是一个最少选项的集群的配置文件…

@Builder注解在子类中使用遇到的问题

场景 在项目开发中,需要基于某个类进行一些字段的拓展,那么自然而然想到的做法是extends该类。而两个类都需要使用Builder进行构造。代码如下: Data Builder AllArgsConstructor NoArgsConstructor public class EmployeeDto {private Stri…

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~写在前面剖析 Vue2 中是如何实现响应式的Vue2 的响应式存在什么问题?Vue3 响应式一、ref 函数二、reactive 函数reactive 响应式原理 - ProxyVue3 中的响应式解决了 Vue2 中存在的问题写在前面 Vue3 中的响应式原理…

C++:STL:常见容器:stack,queue, list

一:stack容器 1.1: stack基本概念 概念:stack是一种先进后出 (First in last out FILO)的数据结构,它只有一个出口。 栈中: 1:只有栈顶的元素才可以被外界使用,因此栈不允许有遍历…