kafka 发送消息原理

326 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

Kafka 是一款基于发布与订阅的消息系统。使用 kafka 时,由生产者发送消息给kafka,消费者订阅了消息,接收到消息并消费它。

image.png 【图1】生产订阅消息架构图

生产者可能有多个,消费者也可能是多个。每个生产者可能发布不同数据,消费者可能是订阅同一个消息队列。比如生产者:消费者=1:N。

Kafka 是集群管理消息的。其架构图如下:

image.png 【图2】kafka 架构图

  • 集群的 Kafka ,其中有多个 Broker。
  • 一个消息队列就是一个 Broker ,一个集群就是由多个 Broker 组成。
  • 每个 Broker 由主题 Topic 和分区 Partition 组成。

IMG_82E388CFF74D-1.jpeg

【图3】生产者发送消息过程

生产者发送消息,需要包含目标主题和要发送的内容。当然还可以指定键和分区。向 Kafka 发送消息的主要过程如下所示:

  • 发送消息之前,生产者将键(键时可选)和值对象序列化成字节数组。
  • 数据传给 kafka 时先经过分区器。生产者发送时若指定 Partition ,分区器就不做任何事情,直接返回指定的 Partition;若没有指定 Partition 则根据键选择一个分区。选择分区后生产者就往该主题和分区发送消息。
  • 发送的消息不直接发送到某主题和分区,而是先被记录批次里,再由一个独立的线程将该批次的记录都发送到相应的 Broker 上
  • 服务器收到消息将返回一个包含主题、分区、记录在分区里的偏移量的对象。但如果写入失败,将返回一个错误。生产者此处可设计:发送失败或错误时尝试重发消息,多次失败则返回错误信息

Kafka 中的消息是以 Topic 进行分类。Topic 是逻辑的概念,而 Partition 是物理上的概念。每个 Partition 都对应一个 log 文件,该 log 文件存储生产者的数据。Producer 生产的数据会不断追加到该 log 文件末端,且每条数据都有自己的 Offset。(Offset 就是消费者消费的位置信息,监控消费者消费到什么位置。当消费者宕机重启后,就可以继续从 Offset 位置继续消费)。一个 Topic 内有多个 Partition,可以提高并发能力,且也方便在集群中扩展。

参考资料