UP | HOME

流程

Table of Contents

Kafka只是分为一个或多个分区的主题的集合。 Kafka分区是消息的线性有序序列,其中每个消息由它们的索引(称为偏移)来标识
Kafka集群中的所有数据都是不相连的分区联合。 传入消息写在分区的末尾,消息由消费者顺序读取。 通过将消息复制到不同的代理提供持久性

Kafka以快速,可靠,持久,容错和零停机的方式提供基于pub-sub和队列的消息系统
在这两种情况下,生产者只需将消息发送到主题,消费者可以根据自己的需要选择任何一种类型的消息传递系统

发布/订阅消息

以下是Pub/Sub消息的逐步工作流程:

  1. 生产者 定期 向 主题 发送 消息
  2. Kafka代理 存储 为 该特定主题 配置的 分区 中的所有消息,它确保 消息在分区之间平等共享
    • 如果生产者发送两个消息并且有两个分区,Kafka将在第一分区中存储一个消息,在第二分区中存储第二消息
  3. 消费者 订阅 特定 主题
  4. 一旦消费者订阅主题,Kafka将向消费者 提供 主题的当前偏移 ,并且还将 偏移 保存 在Zookeeper系综中
  5. 消费者将 定期请求 Kafka(如100 Ms)新消息
  6. 一旦Kafka收到来自生产者的消息,它将这些消息 转发 给 消费者
  7. 消费者将收到消息并进行处理
  8. 一旦 消息被处理 , 消费者 将向 Kafka代理 发送确认
  9. 一旦 Kafka收到确认 ,它将 偏移 更改为新值 ,并在 Zookeeper 中 更新 它
    • 由于偏移在Zookeeper中维护,消费者可以正确地读取下一封邮件,即使在服务器暴力期间。

以上流程将重复,直到消费者停止请求

    消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消息

队列消息/用户组的工作流

队列消息传递 系统: 具有相同组ID 的 一组消费者 将 订阅 主题

    简单来说,订阅具有相同 Group ID 的主题的消费者被认为是单个组,并且消息在它们之间共享

这个系统的实际工作流程:

  1. 生产者以固定间隔向某个主题发送消息
  2. Kafka存储在为该特定主题配置的分区中的所有消息,类似于前面的方案
  3. 单个消费者订阅特定主题,假设主题为 Topic-01 , Group ID 为 Group-1
  4. Kafka以与发布/订阅消息相同的方式与消费者交互,直到 新消费者 以 相同的组ID (Group-1) 订阅 相同主题 (Topic-01)
  5. 一旦新消费者到达,Kafka将其操作切换到 共享模式 ,并在 两个消费者之间 共享数据。 此共享将继续,直到 用户数达到为该特定主题配置的分区数
  6. 一旦 消费者的数量 超过 分区的数量 , 新消费者 将 不会接收 任何进一步的消息 ,直到 任何一个现有消费者取消订阅
    出现这种情况是因为Kafka中的每个消费者将被分配至少一个分区,并且一旦所有分区被分配给现有消费者,新消费者将必须等待

ZooKeeper的作用

Kafka的一个关键依赖是 Zookeeper ,它是一个 分布式 配置 和 同步 服务:

  • Zookeeper是Kafka 代理和消费者之间的协调接口
  • Kafka服务器通过 Zookeeper集群 共享信息
  • Kafka在Zookeeper中 存储 基本元数据 ,例如:
    • 主题
    • 代理
    • 消费者偏移
由于所有关键信息存储在Zookeeper中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper的故障不会影响Kafka集群的状态

一旦Zookeeper重新启动,Kafka将恢复状态,这为Kafka带来了零停机时间

Kafka代理之间的领导者选举也通过使用Zookeeper在领导者失败的情况下完成

Next: 操作

Previous: 集群

Home: 目录