为什么这么快上一篇文章提到了Kafka的结构,有3点有助于提高它的吞吐量。Partition并行处理多个partition承载的一个topic的消息存储和传输,增加partition数量可以有效提高吞吐量。写入消息:消息存储采用顺序写入的方式。Kafka消息存储在日志文件中,文件以顺序写入的方式写入消息。由于磁盘结构,顺序写入比随机写入快得多。补充:写消息还有一点优化。当producer向broker发送消息时,它会先将消息写入PageCache,然后异步刷新到log文件中。为防止消息丢失,您可以使用复制备份。读取消息:文件命名和稀疏索引都保证消息的快速定位,加快消息消费。除了以上内容,还有一个重要的因素:零拷贝技术经纪人将数据传递给消费者。按照传统的方式,会经过以下几个步骤:应用程序发起读数据请求,磁盘数据通过读缓冲区进入应用层缓冲区;layerbuffer通过网卡进入socketbuffer进行网络传输。在一条数据没有变化的前提下,多次复制,期间涉及到用户态和内核态的转换,显然是一种浪费。Kafka使用DMA技术实现了零拷贝。DMA可用于图形卡、声卡和许多其他硬件。这里主要是通过操作系统层面的sendfile函数来使用网卡的DMA,将数据从resumereadbuffer映射到网卡,然后直接发送。(保证数据没有被任何方式改变)并且java的transferTo方法底层是基于操作系统的sendfile实现的。升级后的方法不再需要在用户态和内核态之间切换,也避免了多次拷贝。其他当然,Kafka支持的批量消息和消息压缩是它速度快的原因。主从同步机制我们知道replication是partition的副本,而ISR是master(partition所在的broker)动态维护的一个集合,用来记录有效的replication副本。先看以下几个概念:AR(AssignedReplicas)一个partition的所有副本(即replicas,不区分leader和follower)ISR(In-SyncReplicas)follower+leader本身组成的集合与领导保持同步。OSR(Out-SyncRelipcas)跟不上领导者的步伐。Follower集合公式:AR=ISR+OSRkafka会保证ISR集合中记录的replicas会同步消息。同步配置如下:#默认为10000,即10秒replica.lag.time.max.ms该配置表示10秒内完全同步的一个副本将被记录到ISR集合中;如果它没有完全同步,它将从集合中删除。OK,让我们看看完全同步是什么意思。在此之前,引入两个概念:在LEO(lastendoffset)的一个partition中,最新消息的下一个offsetHW(highwatermark)partition的所有replications中同步的最小offset。图中示例:如果分区有8条消息(0-7),则LEO为8;这个partition有3个replications,其中两个同步了8条消息;上一次replication只同步了5条消息(0-4),那么HW会被标记为5。此时消息0-4对外可见(consumer可以消费),消息5-7不可见.同时,这个replication不能在10秒内同步5-7条消息,就会被移出ISR。当replication同步完分区LEO之前的所有日志时,认为replication已经赶上分区,即完全同步。附录P6-P7知识集锦
