Kafka入门教程与详解(二)

简介: Kafka入门教程与详解(二)

1.11 Kafka的持久化


1、一个Topic可以认为是一类消息,每个topic将被分成多partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),partition是以文件的形式存储在文件系统中。



2、Logs文件根据broker中的配置要求,保留一定时间后删除来释放磁盘空间。


     

20160421172657875 (1).png

Kafka消息分区Partition图1-4



Partition:



  Topic物理上的分组,一个 topic可以分为多个 partition,每个 partition 是一个有序的队列。partition中的每条消息都会被分配一个有序的 id(offset)。



3、为数据文件建索引:稀疏存储,每隔一定字节的数据建立一条索引。下图为一个partition的索引示意图:

20160421172716657 (1).png

   

Kafka消息分区Partition索引图1-5


1.12 Kafka的分布式实现:


 

20160421172800304 (2).png

Kafka分布式关系图1-6


      20160421172822799 (1).png


Kafka生产环境关系图1-7


1.13 Kafka的通讯协议:



1、Kafka的Producer、Broker和Consumer之间采用的是一套自行设计基于TCP层的协议,根据业务需求定制,而非实现一套类似ProtocolBuffer的通用协议。


2、基本数据类型:(Kafka是基于Scala语言实现的,类型也是Scala中的数据类型)


定长数据类型:int8,int16,int32和int64,对应到Java中就是byte, short, int和long。


变长数据类型:bytes和string。变长的数据类型由两部分组成,分别是一个有符号整数N(表示内容的长度)和N个字节的内容。其中,N为-1表示内容为null。bytes的长度由int32表示,string的长度由int16表示。


数组:数组由两部分组成,分别是一个由int32类型的数字表示的数组长度N和N个元素。


3、Kafka通讯的基本单位是Request/Response。


4、基本结构:


QQ图片20220506212952.png


5、通讯过程:


客户端打开与服务器端的Socket


往Socket写入一个int32的数字(数字表示这次发送的Request有多少字节)


服务器端先读出一个int32的整数从而获取这次Request的大小


然后读取对应字节数的数据从而得到Request的具体内容


服务器端处理了请求后,也用同样的方式来发送响应。



6、RequestMessage结构:


QQ图片20220506213038.png


7、ResponseMessage结构:


QQ图片20220506213042.pngQQ图片20220506213042.png

QQ图片20220506213042.png



Kafka采用是经典的Reactor(同步IO)模式,也就是1个Acceptor响应客户端的连接请求,N个Processor来读取数据,这种模式可以构建出高性能的服务器。



8、Message结构:


QQ图片20220506213244.png

QQ图片20220506213244.png


9、MessageSet结构:


MessageSet:用来组合多条Message,它在每条Message的基础上加上了Offset和MessageSize


MessageSet => [Offset MessageSize Message]


QQ图片20220506213347.png



10、     Request/Respone和Message/MessageSet的关系:



Request/Response是通讯层的结构,和网络的7层模型对比的话,它类似于TCP层。



Message/MessageSet定义的是业务层的结构,类似于网络7层模型中的HTTP层。Message/MessageSet只是Request/Response的payload中的一种数据结构。



备注:Kafka的通讯协议中不含Schema,格式也比较简单,这样设计的好处是协议自身的Overhead小,再加上把多条Message放在一起做压缩,提高压缩比率,从而在网络上传输的数据量会少一些。



1.14 数据传输的事务定义:



1、at most once:最多一次,这个和JMS中”非持久化”消息类似.发送一次,无论成败,将不会重发。


at most once:消费者fetch消息,然后保存offset,然后处理消息;当client保存offset之后,但是在消息处理过程中出现了异常,导致部分消息未能继续处理.那么此后”未处理”的消息将不能被fetch到,这就是“atmost once”。



2、at least once:消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功。


at least once:消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成功之后,但是在保存offset阶段zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时可能获得上次已经处理过的消息,这就是“atleast once”,原因offset没有及时的提交给zookeeper,zookeeper恢复正常还是之前offset状态。



3、exactly once:消息只会发送一次。


exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的。



注:通常情况下“at-least-once”是我们首选。(相比at most once而言,重复接收数据总比丢失数据要好)。


二、消息队列之Kafka工作原理与安装介绍



2.1消息队列之Kafka工作原理 -- broker


image.png


2.2消息队列之Kafka工作原理 -- topic


image.png

2.3消息队列之Kafka工作原理 – partition

image.png


2.4消息队列之Kafka安装介绍


版本


Apache Kafka 与 Confluent Platform


Docker镜像 Confluent kafka 的docker镜像


客户端工具


Apache Kafka的Python客户端:kafka-python


Confluent kafka的Python客户端: confluent-kafka-python


git地址


使用文档


2.5消息队列之Kafka使用介绍


Kafka启动:


单节点单broker 单节点多broker


Kafka使用时的显著特征


分区之间是无序的,但分区内的消息是有序的


对于topic的消费,消费者的数量 应 不多于 该topic分区的数量,否则多余的消费者将必定无法接收到消息


一个消费者可同时消费多个topic


在订阅消费时,Kafka保证每条消息在同一个Consumer Group里只会被某一个Consumer消费



总结:掌握原理 活用文档 多实践


目录
相关文章
|
消息中间件 存储 负载均衡
Kafka入门教程与详解(一)
Kafka入门教程与详解(一)
514 0
Kafka入门教程与详解(一)
|
2月前
|
消息中间件 安全 Kafka
2024年了,如何更好的搭建Kafka集群?
我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。
420 2
2024年了,如何更好的搭建Kafka集群?
|
3月前
|
消息中间件 存储 数据可视化
kafka高可用集群搭建
kafka高可用集群搭建
43 0
|
6月前
|
消息中间件 存储 Kubernetes
Helm方式部署 zookeeper+kafka 集群 ——2023.05
Helm方式部署 zookeeper+kafka 集群 ——2023.05
242 0
|
3月前
|
消息中间件 Kafka Linux
Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群
Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群
64 0
|
3月前
|
消息中间件 数据可视化 关系型数据库
ELK7.x日志系统搭建 4. 结合kafka集群完成日志系统
ELK7.x日志系统搭建 4. 结合kafka集群完成日志系统
148 0
|
4月前
|
消息中间件 存储 算法
Kafka Raft集群搭建
Kafka Raft集群搭建
72 0
|
1月前
|
消息中间件 存储 缓存
Kafka【基础知识 02】集群+副本机制+数据请求+物理存储+数据存储设计(图片来源于网络)
【2月更文挑战第20天】Kafka【基础知识 02】集群+副本机制+数据请求+物理存储+数据存储设计(图片来源于网络)
28 1
|
1月前
|
消息中间件 存储 Kafka
Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
【2月更文挑战第19天】Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
140 1
|
5月前
|
消息中间件 数据可视化 Kafka
消息中间件系列教程(21) -Kafka- 集群搭建(自带Zookeeper)
消息中间件系列教程(21) -Kafka- 集群搭建(自带Zookeeper)
67 0