每条消息都包含值、偏移量、时间戳、主键(KEY)、消息大小、压缩编解码器、校验、以及消息格式的版本。磁盘上的数据格式与Broker通过网络从Producer端接收的格式完全相同,然后由Consumer去获取数据,这使得Kafka能够通过零拷贝技术有效的传输数据。
3.5 片段索引将消息偏移量映射到它们在日志中的位置索引文件是内存映射的,偏移量查找时使用二进制搜索来查找小于或等于最近的目标偏移量。索引文件由8个字节组成,4个字节用于存储基本偏移量,另外4个字节来存储位置。
3.6 Kafka将压缩的消息包装在一起发送压缩消息的Producer端会将压缩批处理,并将其作为包装消息的有效负载发送。和之前一样,磁盘上的数据与Broker通过网络从Producer端接收并发送给其Consumer的数据完全相同。
3.7 Kafka内部存储工作原理小结Kafka的存储单元是分区;
分区通过片段来进行分割;
片段包含两个文件:索引和日志文件;
索引将每个偏移量映射到它们所在日志中的消息位置,用于查找消息;
压缩消息批处理作为包装消息的有效负载;
存储在磁盘上的数据与Broker通过网络从Producer端接收并发给Consumer的数据相同。
4.Kafka API之间的选择与竞争Kafka的核心尽管在一段时间内保持相对的稳定,但是Kafka生态圈然后在快速的发展。最初的Kafka,包含Producer和Consumer,很容易理解。现在Kafka处理Producer和Consumer,还有Kafka Connect、Kafka Streams、以及KSQL。
4.1 如何正确的选择Kafka API
Kafka Producer API:应用直接生成数据,例如移动设备、PC、其他硬件等。
Kafka Connect Source API:应用程序桥接在我们无法控制的数据存储介质,例如MongoDB、ElasticSearch、RESTAPI等。
Kafka Streams API/KSQL:如果希望像SQL一样操作实时流数据,可以通过KSQL来完成;如果需要编写复杂的业务逻辑,可以使用Kafka Streams API来完成。
Kafka Consumer API:直接读取流数据,并对其执行实时操作,例如推送商品促销活动、发送邮件、获取游戏行为等。
Kafka Connect Sink API:读取实时流并将其存储到目标介质中,例如Kafka到S3、Kafka到HDFS、Kafka到HBase等。
选择不同的API来实现不同的业务需求,例如,如果希望为实现的需求编写大量的自定义代码,Kafka Consumer API和Kafka Connect Sink API完全是可以互换的。总而言之,上述API可以帮助你在实际的业务中以最少的代码量来实现最有效的工作流程。
4.2 各个API的优势和局限 4.2.1 Kafka Producer API优势: Kafka Producer API使用起来非常的简单,异步发送数据,获取回调结果。非常适合直接发送数据流的应用程序,例如日志、点击流、物联网等。
局限:可以扩展和构建Kafka Producer API以便执行更多的操作,但是这需要开发人员编写更多的附加逻辑。例如,试图使用Kafka Producer API在数据库和Kafka之间执行ETL操作时,如何跟踪偏移量(即当Producer端停止后,如何正确恢复你的Producer应用程序)?、如何在若干个Producer之间分配ETL的负载?这种情况,我们使用Kafka Connect Source API会更好一些。
4.2.2 Kafka Connect Source API优势:Kafka Connect Source API是一个构建在Kafka Producer API之上的完整框架。它的构建是为了让开发人员能够获得更好的API,以便为并行处理生成并分配任务。另外,可以使用各种各样的连接器,利用这些连接器来处理大多数数据介质,且无需编写任何代码。
局限:适配的数据源连接器均是专属的,如果你当前的数据源在已有的连接器中不包含,需要自行编写连接器来进行适配。
4.2.3 Kafka Consumer API优势:Kafka Consumer API非常简单,可以使用Consumer Groups,因此可以并行使用Topic。新版本的Kafka(V2.2.0)对于偏移量的管理和提交、Balance、幂等性等无需开发者关心。
局限:在ETL场景中,Kafka Connect Sink更加合适,因为它们会避免针对外部数据源编写复杂的逻辑。
4.2.4 Kafka Connect Sink API