Kafka消息发送和消费的简化流程

image.png
  • 1、Producer ,根据指定的 partition 方法(round-robin、hash等),将消息发布到指定 Topic 的 Partition 里面。
  • 2、Kafka 集群,接收到 Producer 发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
  • 3、Consumer ,从 Kafka 集群 pull 数据,并控制获取消息的 offset 。至于消费的进度,可手动或者自动提交给 Kafka 集群。

1.Producer 发送消息

Producer 采用 push 模式将消息发布到 Broker,每条消息都被 append 到 Patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 Kafka 吞吐率)。Producer 发送消息到 Broker 时,会根据分区算法选择将其存储到哪一个 Partition 。
其路由机制为:

  • 1、指定了 Partition ,则直接使用。
  • 2、未指定 Partition 但指定 key ,通过对 key 进行 hash 选出一个 Partition 。
  • 3、Partition 和 key 都未指定,使用轮询选出一个 Partition 。

写入流程:

  • 1、Producer 先从 ZooKeeper 的 "/brokers/.../state" 节点找到该 Partition 的 leader 。注意,Producer 只和 Partition 的 leader 进行交互。
  • 2、Producer 将消息发送给该 leader 。
  • 3、leader 将消息写入本地 log 。
  • 4、followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK 。
  • 5、leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark ,最后 commit 的 offset) 并向 Producer 发送 ACK 。

2.Broker 存储消息

物理上把 Topic 分成一个或多个 Patition,每个 Patition 物理上对应一个文件夹(该文件夹存储该 Patition 的所有消息和索引文件)

3.Consumer 消费消息

high-level Consumer API 提供了 consumer group 的语义,一个消息只能被 group 内的一个 Consumer 所消费,且 Consumer 消费消息时不关注 offset ,最后一个 offset 由 ZooKeeper 保存(下次消费时,该 group 中的 Consumer 将从 offset 记录的位置开始消费)。

注意:
1、如果消费线程大于 Patition 数量,则有些线程将收不到消息。
2、如果 Patition 数量大于消费线程数,则有些线程多收到多个 Patition 的消息。
3、如果一个线程消费多个 Patition,则无法保证你收到的消息的顺序,而一个 Patition 内的消息是有序的。

Consumer 采用 pull 模式从 Broker 中读取数据。

  • push 模式,很难适应消费速率不同的消费者,因为消息发送速率是由 Broker 决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成 Consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式,则可以根据 Consumer 的消费能力以适当的速率消费消息。
  • pull 模式更合适,它可简化 Broker 的设计,Consumer 可自主控制消费消息的速率,同时 Consumer 可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。

你可能感兴趣的:(Kafka消息发送和消费的简化流程)