初识 Kafka

初识 Kafka

Kafka 想解决什么问题

本节例子引用自 参考文献 [1], 图片也来自 参考文献 [1]

想象这样一个例子:metrics 服务器 直接和各个前端服务建立连接,获取前端服务的各个属性,以便在 metrics 服务查看各个前端服务的各个属性是否正常。
初识 Kafka_第1张图片
就当前的需求来看,这种实现模式并没有什么不妥。
随着业务的发展,我们需要增加对前端服务监控属性进行数据的分析,数据的可视化,监控报警等处理。
不仅如此,随着业务的发展,我们不再局限于只对前端服务的属性进行监控和分析。我们还需要需要对数据库等基础服务和其他中台服务进行监控和分析。

如果复用之前的模式,每个处理属性的服务都要和前端服务建立连接,获取前端服务的属性。
随着 metrics 服务的增多,会影响前端服务本身的服务的,这是我们不希望看到的。
而且服务之间相互依赖变多之后,某个不稳定的服务很可能会影响到其他稳定的服务。
初识 Kafka_第2张图片
发布/订阅(publish/subscribe) 模式可以很好的解决这个问题。
通过“加一层”订阅/分发服务专门负责集中获取和统一分发前端服务的属性,可以很好的解耦前端服务和 metrics 的处理分析服务之间的直接依赖。同时,还可以降低获取前端服务属性的成本。
当新增前端服务或者新增 metrics 处理服务都不需要告诉对方知晓,只需要在中间层订阅/分发服务注册一下,让中间层感知到新增服务。
初识 Kafka_第3张图片
更进一步,随着业务发展,可能我们不只需要监控前端服务的属性,我们可能还想监控前端服务的日志信息等,而且我们希望新增的监控不影响之前的 metrics 服务。
这时我们可能就需要将不同的订阅/发布服务隔离开:
初识 Kafka_第4张图片
是的,Kafka 扮演的就是订阅/发布服务的角色。

什么是 Kafka

Kafka 的官方定义(参考文献[2]) 是:

Apache Kafka 是 分布式 流处理平台
Apache Kafka® is a distributed streaming platform.

这让像我一样的初学者感到很疑惑。
分布式 很容易理解。但是 Kafka 不是 消息队列(Message Queue) 吗? 怎么说是 流处理平台(streaming platform) 呢?

仿佛知道初学者的疑惑,官方还特别 友好地在下面给出了 流处理平台 需要具备的三个关键能力:

  • 和消息队列或商业消息系统类似, (流处理平台)能够发布/订阅 消息流(streams of records)
  • 以容错和持久化(fault-tolerant durable way)的方式保存消息流
  • 当消息流产生的时候就处理它

看了官方的解释,模模糊糊感觉到大概就是 Kafka is MORE THAN a message queue 的意思。但是还是不太理解。

于是“外事不决问谷歌”,我又查了 参考文献[3-6]。总结起来就是:Kafka 之前也自称是 “消息系统(Message System)”。但后来增加了 Streams API 后,为了强调 Kafka 提供的 流处理 概念而改称为 流处理平台(streaming platform)

Most often, a stream is considered to be a single topic of data, regardless of the number of partitions. This represents a single stream of data moving from the producers to the consumers. —— 参考文献[1]

初识 Kafka_第5张图片

认识 Kafka

本小节主要针对的是 Kafka 作为消息队列的角色,研究它所提供的消费者生产者模型。

Kafka 的架构

下图来自 参考文献[7]

初识 Kafka_第6张图片

  • Kafka 利用 ZooKeeper 进行分布式管理。
  • Kafka 的数据单元称为 消息(message)生产者(producer) 产生新消息。消费者(consumer) 负责消费和处理消息。处理同一类消息的消费者被称为 消费者组(consumer group)
  • Kafka 集群(cluster) 是由多个 Kafka 代理(broker) 组成。代理负责从生产者接受消息,将消息存到硬盘。同时它也负责为消费者提供服务,让消费者拉取对应的消息。

topic 和 partition

下图来自 参考文献[1]

初识 Kafka_第7张图片

  • Kafka 将同一类消息组织为 topic,同一个 topic 的消息被 映射 到多个 partition。Kafka 不保证每个 topic 的消息都是时间顺序读取的,但是每个 partition 的消息是时间顺序的。
  • 由于 topic 被映射到不同的 partition,且不同 partition 的顺序不做保证,同一个 partition 的按照时间顺序读取的。所以我们可以用很多消费者组成的消费者组,分别去消费同一个 topic 的不同的 partition
    初识 Kafka_第8张图片
  • 当消费者组的消费者小于它关注的 topicpartition 数,该消费者组的某些消费者可以消费该 topic 下的多个 partition
  • 当消费者组的消费者数大于它关注的 topicpartition 数,该消费者组的某些消费者就会阻塞,不会被分配到任何消息。(同一个 partition 下的消息只能被同一个消费者消费,从而保证时序性)

broker 和 partition

下图来自 参考文献[10]

初识 Kafka_第9张图片

  • 每一个 partition 在每个 broker 都存在 备份(replicas),来保证数据的可靠性。
  • 生产者和消费者直接对 partition 的特定 replicas 进行操作。这个特殊的 replicas 被称作 leader,其他的被称作 follower
  • leader 负责将新消息同步到 follower
  • 当某个 partitionleader 所在的 broker 挂掉之后,某个 follower 会替代它的位置,成为新的 leader

另, 附上 参考文献[1],如何选择 partition 的数目:
初识 Kafka_第10张图片

Kafka 中的 ZooKeeper

下图来自 参考文献[14]

初识 Kafka_第11张图片

  • Zookeeper 是为分布式应用程序提供分布式协调服务的一个开源服务,它维护分布式应用程序的配置信息,命名和组服务。

ZooKeeper is a distributed, open-source coordination service for distributed applications. —— 参考文献[12]

  • ZooKeeper 在 Kafka 中的应用主要在于对 partitionLeader-Follower 的管理,对 Broker 的状态管理以及对消费者的注册状态和消费情况的维护。

参考文献

  • [1] Kafka The Definitive Guide (REAL-TIME DATA AND STREAM PROCESSING AT SCALE)
  • [2] Apache Kafka Introduction
  • [3] Is Kafka a Message Queue or a Stream Processing Platform?
  • [4] Difference between stream processing and message processing - stackoverflow
  • [5] What is message queuing? - cloudamqp.com
  • [6] Introducing Kafka Streams: Stream Processing Made Simple
  • [7] Understanding When to use RabbitMQ or Apache Kafka
  • [8] Kafka Architecture - cloudurable.com
  • [9] Understanding Kafka - youtube.com
  • [10] Kafka in a Nutshell - sookocheff.com
  • [11] Thorough Introduction to Apache Kafka - hackernoon.com
  • [12] ZooKeeper: A Distributed Coordination Service for Distributed Applications
  • [13] What is Zookeeper and why is it needed for Apache Kafka?
  • [14] Role of Apache ZooKeeper in Kafka – Monitoring & Configuration
  • [15] Apache ZooKeeper Tutorial: What is, Architecture & Installation

你可能感兴趣的:(Kafka)