Apache kafka 解读

架构:





kafka是显式分布式架构,producer、broker(Kafka)和consumer都可以有多个。Kafka的运行依赖于ZooKeeper,Producer推送消息给kafka,Consumer从kafka拉消息。


关键技术:

(1)zero-copy

“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

Non-Zero Copy方式:




Zero Copy方式:



Zero Copy的模式中,避免了数据在用户空间和内存空间之间的拷贝,从而提高了系统的整体性能。Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在Netty中也通过在FileRegion中包装了NIO的FileChannel.transferTo()方法实现了零拷贝。

在Kafka上,有两个原因可能导致低效:
    1)太多的网络请求
    2)过多的字节拷贝。

为了提高效率,Kafka把message分成一组一组的,每次请求会把一组message发给相应的consumer。 此外, 为了减少字节拷贝,采用了sendfile系统调用。为了理解sendfile原理,先说一下传统的利用socket发送文件要进行拷贝:





Sendfile系统调用:





(2)Exactly once message transfer

怎样记录每个consumer处理的信息的状态?在Kafka中仅保存了每个consumer已经处理数据的offset。这样有两个好处:
    1)保存的数据量少
    2)当consumer出错时,重新启动consumer处理数据时,只需从最近的offset开始处理数据即可。


(3)Push/pull

Producer 向Kafka(push)推数据,consumer 从kafka 拉(pull)数据。


(4)负载均衡和容错

Producer和broker之间没有负载均衡机制。
broker和consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。


待续........






猜你喜欢

转载自maosheng.iteye.com/blog/2303328