数据库的学习告一段落,开始向中间件进军,先从消息队列开始,比较早且成功的是Kafka。
1. 引言
Apache Kafka 是一个分布式流媒体平台,旨在处理高吞吐量和高可扩展性的消息传递,并能够较好地处理实时数据流。它是一个用于流处理、实时数据管道和数据集成的开源系统。LinkedIn 最初于 2011 年开发了 Kafka,用于处理实时数据馈送。它基于发布/订阅模型的概念构建,具有高吞吐量、可靠性和容错能力。它每秒可以处理超过一百万条消息,每天可以处理数万亿条消息。
2. 架构解析
Kafa的架构如下:
2.1. Broker
Broker是 Kafka 系统最基本的组件。Kafka Cluster中运行的每个服务器都称为Broker,一个 Kafka 集群由多个 Broker 组成。
Kafka Broker从生产者处接收消息,为其分配偏移量,并将消息提交到磁盘存储。偏移量是一个唯一的整数值,Kafka 在生成每条消息时都会将其递增并添加到其中。偏移量对于在发生故障或中断时保持数据一致性至关重要,因为消费者使用偏移量在故障后返回最后消费的消息。Broker响应来自消费者的分区调用请求并返回已提交到磁盘的消息。单个代理根据特定硬件及其功能属性运行。
Kafka Broker通过直接或间接共享信息形成集群。在 Kafka 集群中,一个Broker充当 Apache Controller,Controller是整个集群的大脑,负责管理分区和副本的状态,并执行管理任务,例如重新分配分区和注册处理程序以接收有关更改的通知。
虽然每个Broker都有可能变成Controller,但任何时间点只能有一个代理处于活动状态(被选中)。Kafka 控制器会在 Kafka 服务器启动后立即创建并启动。
2.2. Topic
Topic:Kakfa中的逻辑队列,可以理解成每一个不同的业务场最就是一个不同的topic。 消息在 Kafka 中按Topic进行组织。每个Topic可以被视作发布/订阅系统中的频道,生产者将消息发布到特定主题,消费者从中获取消息。
2.3. Partition
为了分散Topic中的存储和处理,Kafka 使用了Partition的概念。Topic由一个或多个Partition组成,这些Partition可以位于 Kafka 集群中的不同节点上。
Partition是 Kafka 事件的主要存储单元,尽管在分层存储中,一些消息存储会从Partition中移出。Partition也是并行性的主要单元。通过同时写入多个Partition,可以并行将消息生成到Topic。同样,消费者可以通过从不同Partition读取的单个消费者实例来分散其工作负载。如果我们只使用一个Partition,那么我们只能有效地使用一个消费者实例。
在Partition内,每个消息都有一个唯一的标识符,称为偏移量(offset)。给定分区的偏移量将随着消息的添加而不断增长,并且偏移量永远不会重复使用。偏移量在 Kafka 中有很多用途,其中包括消费者跟踪哪些消息已被处理。
2.4. Consumer、Producer
生产者是将事件发布(写入)到 Kafka 的客户端应用程序。生产者会将消息分发到主题的所有分区,生产者还可以使用自定义分区器根据特定业务逻辑将消息映射到分区。但是,生产者应注意将密钥大致均匀地分发到各个分区,以避免向某个特定代理发送过多流量,这可能会影响性能。
消费者是订阅主题并处理已发布消息源的应用程序或机器消费者使用偏移量来跟踪已消费的消息。 消费者存储每个分区中最后消费的消息的偏移量,以便它可以停止并重新启动而不会丢失其位置。
消费者以Group的形式与主题交互(尽管Group只能由一个消费者组成)。这实现了可扩展的处理。组确保每个分区只有一个成员消费;如果单个消费者发生故障,则组的其余成员将重新组织已消费的分区以补偿缺席的成员。组使 Kafka 能够水平消费包含大量消息的主题。
2.5. ZooKeeper or KRaft
Kafka 和 ZooKeeper 协同工作形成完整的 Kafka 集群 — — ZooKeeper 提供分布式集群服务,Kafka 处理实际的数据流和与客户端的连接。
在详细层面上,ZooKeeper 负责 Kafka 代理的领导选举,并管理服务发现以及集群拓扑,因此每个代理都知道代理何时进入或退出集群、代理何时死亡以及给定主题/分区对的首选领导节点是谁。它还跟踪何时在集群中创建或删除主题,并维护主题列表。一般来说,ZooKeeper 提供了 Kafka 集群的同步视图。
但是ZooKeeper 为 Kafka 增加了一个额外的管理层。管理分布式系统是一项复杂的任务,在KIP 500 中提议用 Kafka Raft 来替换 ZooKeeper,Kafka 使用 Raft 共识协议来管理自己的元数据,而不是依赖于 ZooKeeper。
参考链接: