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

Reacotr 模型主要分为三个角色
- Reactor:把 IO 事件分配给对应的 handler 处理
- Acceptor:处理客户端连接事件
- Handler:处理非阻塞的任务
在传统阻塞 IO 模型中,每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源;采用阻塞 IO 模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费
针对传统阻塞 IO 模型的两个问题,Reactor 模型基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理;基于 IO 复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理
Kafka 即基于 Reactor 模型实现了多路复用和处理线程池。其设计如下:

其中包含了一个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.size和linger.ms。
这两个参数就和 Producer 的批量发送有关。
Kafka Producer 的执行流程如下图所示:

发送消息依次经过以下处理器:
- 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 什么是AOP 通俗的讲就是当你想要实现对象增强,就可以使用AOP。 不然的话还需要自己创建代理,AOP就是为了解决 非业务代码抽取 的
-
域名和ip地址是如何对映的 域名与IP地址的映射机制解析
本文摘要:域名和ip地址是如何对映的的IT小经验,下面小编为您详细解答 主要通过DNS域名解析来完成的。 域名解析的工作流程: 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并
-
动态网站开发与设计 html网页制作动态效果
小编为你讲解动态网站开发与设计和html网页制作动态效果的相关经验,一起跟随小编看看吧! 细节部分如页面的访问速度,客户的使用反馈和交流,内容的更新等都对于用户来说能够起到不小


