Kafka的架构原理,你真的理解吗?的架构原理,你真的理解吗?
Apache Kafka 最早是由 LinkedIn 开源出来的分布式消息系统,现在是 Apache 旗下的一个子项目,并且已经成为开源领域应
用最广泛的消息系统之一。
Kafka 社区非常活跃,从 0.9 版本开始,Kafka 的标语已经从“一个高吞吐量,分布式的消息系统”改为"一个分布式流平台"。
Kafka 和传统的消息系统不同在于:
Kafka是一个分布式系统,易于向外扩展。
它同时为发布和订阅提供高吞吐量。
它支持多订阅者,当失败时能自动平衡消费者。
消息的持久化。
Kafka 和其他消息队列的对比:
入门实例
生产者
代码如下:
消费者
代码如下:
Kafka 架构原理
对于 Kafka 的架构原理,我们先提出如下几个问题:
Kafka 的 topic 和分区内部是如何存储的,有什么特点?
与传统的消息系统相比,Kafka 的消费模型有什么优点?
Kafka 如何实现分布式的数据存储与数据读取?
Kafka 架构图
Kafka 名词解释
在一套 Kafka 架构中有多个 Producer,多个 Broker,多个 Consumer,每个 Producer 可以对应多个 Topic,每个 Consumer
只能对应一个 Consumer Group。
整个 Kafka 架构对应一个 ZK 集群,通过 ZK 管理集群配置,选举 Leader,以及在 Consumer Group 发生变化时进行
Rebalance。
Topic 和 Partition
在 Kafka 中的每一条消息都有一个 Topic。一般来说在我们应用中产生不同类型的数据,都可以设置不同的主题。
一个主题一般会有多个消息的订阅者,当生产者发布消息到某个主题时,订阅了这个主题的消费者都可以接收到生产者写入的
新消息。
Kafka 为每个主题维护了分布式的分区(Partition)日志文件,每个 Partition 在 Kafka 存储层面是 Append Log。
任何发布到此 Partition 的消息都会被追加到 Log 文件的尾部,在分区中的每条消息都会按照时间顺序分配到一个单调递增的
顺序编号,也就是我们的 Offset。Offset 是一个 Long 型的数字。
我们通过这个 Offset 可以确定一条在该 Partition 下的唯一消息。在 Partition 下面是保证了有序性,但是在 Topic 下面没有保
证有序性。
在上图中我们的生产者会决定发送到哪个 Partition:
如果没有 Key 值则进行轮询发送。
如果有 Key 值,对 Key 值进行 Hash,然后对分区数量取余,保证了同一个 Key 值的会被路由到同一个分区;如果想队列的
强顺序一致性,可以让所有的消息都设置为同一个 Key。
消费模型