•Kafka是一个分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。
•Kafka主要特点
(1) 高吞吐量。据了解,Kafka每秒可以生产约25万条消息(50 MB),每秒处理55万条消息(110 MB)。
(2) 持久化。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
(3) 分布式系统。所有的producer、broker和consumer都会有多个,均为分布式的。
(4) 可扩展性。kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在 zookeeper注册并保持相关的元数据(topic,partition信息等)更新。而客户端会在zookeeper上注册相关的watcher。
(5) 数据传输效率高。 kafka不在JVM进程内部维护消息Cache,消息直接从文件中读写,完全依赖操作系统在文件系统层面的cache,避免在JVM中管理Cache带来的额外数据结构开销和GC带来的性能代价。基于批量处理和顺序读写的应用模式,最大化利用文件系统的Cache机制和规避文件读写相对内存读写的性能代价。(零拷贝)
Kafka中角色与术语
•Producer
向kafka中发布消息的进程
•Comsumer
从Kafka中订阅消息的进程
•Broker
Kafka集群中每一个kafka服务
•Topic
保存在Kafka中的每一类消息
它们之间的数据流程如右图所示
•Partition
每一个topic可以被分成多个partition(分区)
Kafka集群中维护的partitions如图所示:
•Replication
一个partition可以有多个备份,默认为1,可以分布在不同broker上
•Leader/Follower
每个partition都有一个唯一的leader,所有的读写操作都在leader上完成。
•Offset
每个消息在partition中的位置叫做offset。
•Consumer Group
同一个Consumer Group中的consumers,Kafka将相应Topic中每个消息只发送给其中一个Consumer。
Kafka系统架构
kafka是显式分布式架构,producer、broker(Kafka)和consumer都可以有多个。
Kafka的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存
负载均衡
•负载均衡可以分为两个部分:producer发消息的负载均衡和consumer读消息的负载均衡。
•
•producer有一个到当前所有broker的连接池,当一个消息需要发送时,需要决定发到哪个broker(即partition)。这是由 partitioner实现的,partitioner是由应用程序实现的。
broker和consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且 zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到 通知
•Producer将消息发布到指定的Topic中。
•同时Producer也能决定将此消息归属于哪个partition;比如基于"random","round-robin",
"key-hash"方式或者通过其他的一些算法等。
注:如果客户端不指定Patition,也没有指定Key的话,使用自增长的数字取余数的方式实现指定的Partition。这样Kafka将平均的向Partition中生产数据
消费者
•消费者需要获取数据时,向broker发送fetch请求,并告知所要获取消息的offset,随后consumer会得到相应的数据。Consumer端也可以重置offset来重新消费消息。
Kafka集群中对应Topic中的一个分区只能被Consumer Group中一个Consumer