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: 目录