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入门教程与详解(一)
571 0
|
3月前
|
消息中间件 存储 运维
为什么说Kafka还不是完美的实时数据通道
【10月更文挑战第19天】Kafka 虽然作为数据通道被广泛应用,但在实时性、数据一致性、性能及管理方面存在局限。数据延迟受消息堆积和分区再平衡影响;数据一致性难以达到恰好一次;性能瓶颈在于网络和磁盘I/O;管理复杂性涉及集群配置与版本升级。
121 1
|
3月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
65 1
|
5月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
369 9
|
5月前
|
消息中间件 负载均衡 Java
"Kafka核心机制揭秘:深入探索Producer的高效数据发布策略与Java实战应用"
【8月更文挑战第10天】Apache Kafka作为顶级分布式流处理平台,其Producer组件是数据高效发布的引擎。Producer遵循高吞吐、低延迟等设计原则,采用分批发送、异步处理及数据压缩等技术提升性能。它支持按消息键值分区,确保数据有序并实现负载均衡;提供多种确认机制保证可靠性;具备失败重试功能确保消息最终送达。Java示例展示了基本配置与消息发送流程,体现了Producer的强大与灵活性。
88 3
|
5月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
193 0
|
5月前
|
消息中间件 存储 关系型数据库
实时计算 Flink版产品使用问题之如何使用Kafka Connector将数据写入到Kafka
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
消息中间件 监控 Kafka
实时计算 Flink版产品使用问题之处理Kafka数据顺序时,怎么确保事件的顺序性
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
消息中间件 存储 Kafka
kafka 在 zookeeper 中保存的数据内容
kafka 在 zookeeper 中保存的数据内容
61 3
|
5月前
|
消息中间件 缓存 Kafka
【Azure 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?
【Azure 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?

热门文章

最新文章