IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Kafka为什么这么快

Kafka为什么这么快? 为何卡夫卡如此迅猛?(4)

时间:2024-02-27 18:00:57 来源:IT袋 作者:马勇
导读:Kafka为什么这么快,Reacotr 模型主要分为三个角色 Reactor:把 IO 事件分配给对应的 handler 处理 Acceptor:处理客户端连接事件 Handler:处理非阻塞的任务 在传统阻塞 IO 模型中,每

Kafka为什么这么快

Kafka为什么这么快

Reacotr 模型主要分为三个角色

  • Reactor:把 IO 事件分配给对应的 handler 处理
  • Acceptor:处理客户端连接事件
  • Handler:处理非阻塞的任务

在传统阻塞 IO 模型中,每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源;采用阻塞 IO 模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费

针对传统阻塞 IO 模型的两个问题,Reactor 模型基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理;基于 IO 复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理

Kafka 即基于 Reactor 模型实现了多路复用和处理线程池。其设计如下:

Kafka为什么这么快

其中包含了一个Acceptor线程,用于处理新的连接,Acceptor有 N 个Processor线程 select 和 read socket 请求,N 个Handler线程处理请求并相应,即处理业务逻辑。

I/O 多路复用可以通过把多个 I/O 的阻塞复用到同一个 select 的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。它的最大优势是系统开销小,并且不需要创建新的进程或者线程,降低了系统的资源开销。

总结: Kafka Broker 的 KafkaServer 设计是一个优秀的网络架构,有想了解 Java 网络编程,或需要使用到这方面技术的同学不妨去读一读源码。后续『不念』的 Kafka 系列文章也将涉及这块源码的解读。

批量与压缩

Kafka Producer 向 Broker 发送消息不是一条消息一条消息的发送。

使用过 Kafka 的同学应该知道,Producer 有两个重要的参数:batch.sizelinger.ms

这两个参数就和 Producer 的批量发送有关。

Kafka Producer 的执行流程如下图所示:

Kafka为什么这么快

发送消息依次经过以下处理器:

  • Serialize:键和值都根据传递的序列化器进行序列化。优秀的序列化方式可以提高网络传输的效率。
  • Partition:决定将消息写入主题的哪个分区,默认情况下遵循 murmur2 算法。自定义分区程序也可以传递给生产者,以控制应将消息写入哪个分区。
  • Compress:默认情况下,在 Kafka 生产者中不启用压缩.Compression 不仅可以更快地从生产者传输到代理,还可以在复制过程中进行更快的传输。压缩有助于提高吞吐量,降低延迟并提高磁盘利用率。
  • Accumulate:Accumulate顾名思义,就是一个消息累计器。其内部为每个 Partition 维护一个Deque双端队列,队列保存将要发送的批次数据,Accumulate将数据累计到一定数量,或者在一定过期时间内,便将数据以批次的方式发送出去。记录被累积在主题每个分区的缓冲区中。根据生产者批次大小属性将记录分组。主题中的每个分区都有一个单独的累加器 / 缓冲区。
  • Group Send:记录累积器中分区的批次按将它们发送到的代理分组。批处理中的记录基于 batch.size 和 linger.ms 属性发送到代理。记录由生产者根据两个条件发送。当达到定义的批次大小或达到定义的延迟时间时。

Kafka 支持多种压缩算法:lz4、snappy、gzip。Kafka 2.1.0 正式支持 ZStandard —— ZStandard 是 Facebook 开源的压缩算法,旨在提供超高的压缩比 (compression ratio),具体细节参见 zstd。

Producer、Broker 和 Consumer 使用相同的压缩算法,在 producer 向 Broker 写入数据,Consumer 向 Broker 读取数据时甚至可以不用解压缩,最终在 Consumer Poll 到消息时才解压,这样节省了大量的网络和磁盘开销。

分区并发

Kafka 的 Topic 可以分成多个 Partition,每个 Paritition 类似于一个队列,保证数据有序。

同一个 Group 下的不同 Consumer 并发消费 Paritition,分区实际上是调优 Kafka 并行度的最小单元,因此,可以说,每增加一个 Paritition 就增加了一个消费并发。

相关阅读

  • 创建网站需要多少钱 建网站需要的费用

    创建网站需要多少钱 建网站需要的费用

    文章摘要:创建网站需要多少钱和建网站需要的费用的相关经验,接下来IT袋小编就来介绍。 随着现代社会的发展,制作网站的门槛是越来越低,现在有开源的程序,会打字就可以建设一个网

  • Spring AOP/IOC实现原理

    Spring AOP/IOC实现原理

    正文核心介绍:Spring的内容,一起跟随小编看看吧! AOP 什么是AOP 通俗的讲就是当你想要实现对象增强,就可以使用AOP。 不然的话还需要自己创建代理,AOP就是为了解决  非业务代码抽取  的

  • 域名和ip地址是如何对映的 域名与IP地址的映射机制解析

    域名和ip地址是如何对映的 域名与IP地址的映射机制解析

    本文摘要:域名和ip地址是如何对映的的IT小经验,下面小编为您详细解答 主要通过DNS域名解析来完成的。 域名解析的工作流程: 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并

  • 动态网站开发与设计 html网页制作动态效果

    动态网站开发与设计 html网页制作动态效果

    小编为你讲解动态网站开发与设计和html网页制作动态效果的相关经验,一起跟随小编看看吧! 细节部分如页面的访问速度,客户的使用反馈和交流,内容的更新等都对于用户来说能够起到不小