导航菜单

我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相

  目前市面上各种中间件层出不穷,我们在做具体的选型时不可避免地,它会被纠缠在一起。在这里,我们将详细阐述肤浅的观点。实际上,每个中间件在其设计中都有自己独特的特性或优化点。这些应该是我们关注的问题,以便我们能够充分利用它。最大化他们的特点;同时,他们必须了解各自的劣势,主要是为了避免陷阱。各种中间件就像构建块。我们能做的是选择合适的积木形状,并建造我们需要的房子。

我不得不说Kafka构建块不仅可以做中间件峰值解耦,还可以进行实时流处理。数据服务由双手掌握。可以说它在大厅和厨房。因此,在Kafka系列的第一部分中,我想从其应用场景开始,并讨论哪些技术和原理支持其技术特性。

卡夫卡的核心理念摘要

所有消息都以“有序日志”方式存储,并且生产者将消息发布到末尾(可以理解为附加)。消费者从逻辑位顺序读取。

[场景1]消息中间件

在选择消息中间件时,我们主要关注的是:性能,消息可靠性和顺序。

1.表现

Kafka的高性能主要是由于它实现了操作系统的一些底层优化技术,尽管作为编写业务代码的程序员,需要理解这些基础知识。

[优化1]零拷贝

这是Kafka在消费者方面的优化。我们通过两个图来比较传统方法和零拷贝方法之间的差异:

传统方式:

零拷贝模式:

最终目标:如何不通过用户空间制作数据?

从图中可以看出,零拷贝省略了复制到用户缓冲区的步骤,并且数据通过文件描述符直接从内核空间复制到网卡接口。

[优化2]顺序写入磁盘

在编写消息时,采用文件追加的方法,不允许修改已写入的消息,因此写入磁盘的方式是顺序写入。我们一般认为基于磁盘的读写性能很差,指的是基于磁盘的随机读写;实际上,基于磁盘的顺序读写,性能接近随机读写内存,以下是性能对比图表:

[优化3]内存映射

简介:用户空间中的一部分内存映射到内核空间,以便可以将对此内存区域的内核空间或用户空间修改直接映射到另一个区域。

优点:如果内核模式和用户模式之间存在大量数据传输,则效率非常高。

为什么提高效率:一般来说,传统的方式是read()系统调用,两个数据副本;内存映射是mmap()系统调用,只有一个数据副本

[优化4]批量压缩

制作人:批量发送消息集

消费者:主动提取数据,也使用批量拉动方法

2.可靠性

卡夫卡的复制机制是其可靠性的核心。

如何同步每个副本?

ISR机制:领导者动态维护ISR(In-SyncReplica)列表,

领导失败,如何选举新领袖?

要解决这个问题,我们必须引入Zookeeper,这是Kafka实现复制机制的前提。关于其原理和倾听分解,本文仍然从卡夫卡的角度进行分析。在这里,我们只需要了解有关Broker,Topics和Partitions的一些元信息存储在Zookeeper中。当领导者失败时,从ISR集合中选出新的领导者。

Request.required.acks设置数据的可靠性:

分区机制和复制机制知识点:

3.顺序性

订单保证主要取决于分区机制+偏移量。

在分区时,首先要解释相关概念及其之间的关系。个人总结了以下几点:

经纪人:指独立服务器

可以是跨代理的消息的逻辑分类

分区:消息的物理分类,基本存储单元

这是上述概念之间关系的图片。

为什么分区机制保证消息的顺序?

Kafka可以保证分区内的消息是有序且不可变的。

制片人:Kafka的消息是一对键值对。我们通过设置键值指定将消息发送到特定主题的特定分区。

通过设置密钥,可以将相同类型的消息发送到同一分区以确保消息的顺序。

消费者:消费者需要保存抵消额以记录他们的消费情况。在0.10版本之前,偏移量存储在zk中,然后存储在__consumeroffsetstopic中。

[场景2]流处理

在版本0.10之后,Kafka构建了一个流处理框架API,KafkaStreams,一个基于Kafka的流类库,它利用了上述功能。此时,Kafka已发展成为消息传递系统,存储系统和流处理。系统的中央流处理平台。

与现有的SparkStreaming平台不同,SparkStreaming或Flink是系统架构,KafkaStreams属于库。 KafkaStreams坚持简单的设计原则,其优势体现在操作和维护上。与此同时,KafkaStreams保留了上面提到的所有功能。

关于两者的合适应用场景,给出了结论,并没有强制总结总结。

KafkaStreams:适合“Kafka - >卡夫卡“场景

SparkStreaming:适用于“Kafka - >数据库“或”卡夫卡 - >数据科学模型“场景

最后,分享一本采访书[Java核心知识点整理]涵盖JVM,锁定,高并发,反射,Spring原理,微服务,Zookeeper,数据库,数据结构等“,以及Java208面试问题(带答案) )!

加入我的粉丝群(Java Fill Road :)免费获取!掌握了这些知识点,你可以在面试中获得很多候选人,暴击9999分。机会是为那些准备好的人保留的,只有充分准备才能从候选人中脱颖而出。