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

Kafka 具有优秀的分区分配算法——StickyAssignor,可以保证分区的分配尽量地均衡,且每一次重分配的结果尽量与上一次分配结果保持一致。
这样,整个集群的分区尽量地均衡,各个 Broker 和 Consumer 的处理不至于出现太大的倾斜。
★
同学:那是不是分区数越多越好呢?
当然不是。
越多的分区需要打开更多的文件句柄
在 kafka 的 broker 中,每个分区都会对照着文件系统的一个目录。在 kafka 的数据日志文件目录中,每个日志数据段都会分配两个文件,一个索引文件和一个数据文件。
因此,随着 partition 的增多,需要的文件句柄数急剧增加,必要时需要调整操作系统允许打开的文件句柄数。
客户端 / 服务器端需要使用的内存就越多
客户端 producer 有个参数 batch.size,默认是 16KB。
它会为每个分区缓存消息,一旦满了就打包将消息批量发出。看上去这是个能够提升性能的设计。
不过很显然,因为这个参数是分区级别的,如果分区数越多,这部分缓存所需的内存占用也会更多。
降低高可用性
分区越多,每个 Broker 上分配的分区也就越多,当一个发生 Broker 宕机,那么恢复时间将很长。
文件结构
Kafka 消息是以 Topic 为单位进行归类,各个 Topic 之间是彼此独立的,互不影响。
每个 Topic 又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件。
Kafka 每个分区日志在物理上实际按大小被分成多个 Segment。

- segment file 组成:由 2 大部分组成,分别为 index file 和 data file,此 2 个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为 segment 索引文件、数据文件。
- segment 文件命名规则:partion 全局的第一个 segment 从 0 开始,后续每个 segment 文件名为上一个 segment 文件最后一条消息的 offset 值。数值最大为 64 位 long 大小,19 位数字字符长度,没有数字用 0 填充。
index 采用稀疏索引,这样每个 index 文件大小有限,Kafka 采用mmap的方式,直接将 index 文件映射到内存,这样对 index 的操作就不需要操作磁盘 IO。mmap的 Java 实现对应MappedByteBuffer。
★
同学笔记:mmap 是一种内存映射文件的方法。即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read,write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
Kafka充分利用二分法来查找对应 offset 的消息位置:

- 按照二分法找到小于 offset 的 segment 的.log 和.index
- 用目标 offset 减去文件名中的 offset 得到消息在这个 segment 中的偏移量。
- 再次用二分法在 index 文件中找到对应的索引。
- 到 log 文件中,顺序查找,直到找到 offset 对应的消息。
以上是IT袋网网关于Kafka为什么这么快?的详细讲解,仅供大家参考建议!
相关阅读
-
创建网站需要多少钱 建网站需要的费用
文章摘要:创建网站需要多少钱和建网站需要的费用的相关经验,接下来IT袋小编就来介绍。 随着现代社会的发展,制作网站的门槛是越来越低,现在有开源的程序,会打字就可以建设一个网
-
Spring AOP/IOC实现原理
正文核心介绍:Spring的内容,一起跟随小编看看吧! AOP 什么是AOP 通俗的讲就是当你想要实现对象增强,就可以使用AOP。 不然的话还需要自己创建代理,AOP就是为了解决 非业务代码抽取 的
-
域名和ip地址是如何对映的 域名与IP地址的映射机制解析
本文摘要:域名和ip地址是如何对映的的IT小经验,下面小编为您详细解答 主要通过DNS域名解析来完成的。 域名解析的工作流程: 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并
-
动态网站开发与设计 html网页制作动态效果
小编为你讲解动态网站开发与设计和html网页制作动态效果的相关经验,一起跟随小编看看吧! 细节部分如页面的访问速度,客户的使用反馈和交流,内容的更新等都对于用户来说能够起到不小


