Kafka 生产者

2025年3月17日 | 阅读 3 分钟

生产者是将数据发布或写入不同分区的 Topic 的组件。生产者会自动知道应该将哪些数据写入哪个分区和代理。用户不需要指定代理和分区。

生产者如何将数据写入集群?

生产者使用以下策略将数据写入集群

  • 消息键
  • 确认

消息键

Apache Kafka 允许使用键的概念以特定顺序发送消息。 键为生产者提供了两种选择,即:要么将数据发送到每个分区(自动),要么仅将数据发送到特定分区。 使用消息键可以将数据发送到一些特定分区。 如果生产者对数据应用键,则该数据将始终发送到同一分区。 但是,如果生产者在写入数据时没有应用键,则数据将以循环方式发送。 此过程称为负载均衡。 在 Kafka 中,当生产者在没有指定任何键的情况下将数据写入 Kafka Topic 时,Kafka 会将少量数据分配到每个分区。

因此,消息键可以是字符串、数字或我们希望的任何内容。

有两种方法可以知道数据是否带有键发送

  1. 如果 key 的值为 NULL,则表示数据是在没有 key 的情况下发送的。 因此,它将以循环方式分发(即,分发到每个分区)。
  2. 如果 key 的值不为 NULL,则表示该 key 附带数据,因此所有消息将始终传递到同一分区。

让我们看一个例子

考虑一种生产者将数据写入 Kafka 集群的场景,并且在未指定 key 的情况下写入数据。 因此,数据在每个代理下的 Topic-T 的每个分区之间进行分发,即 Broker 1、Broker2 和 Broker 3。

Kafka Producer

考虑另一个场景,生产者将键指定为 Prod_id。 因此,Prod_id_1(例如)的数据将始终发送到 Broker 1 下的分区 0,而 Prod_id_2 的数据将始终发送到 Broker 2 下的分区 1。 因此,在应用键后,数据将不会分发到每个分区(如在上面的场景中所见)。

Kafka Producer

确认

为了将数据写入 Kafka 集群,生产者还有另一种确认选择。 这意味着生产者可以通过接收以下确认来获得其数据写入的确认

  • acks=0:这意味着生产者将数据发送到代理,但不会等待确认。 这会导致可能的数据丢失,因为没有确认数据已成功发送到代理,或者代理可能已关闭,它会发送另一个。
  • acks=1:这意味着生产者将等待领导者的确认。 领导者会询问代理是否成功接收到数据,然后将反馈返回给生产者。 在这种情况下,数据丢失有限。
  • acks=all:在这里,确认由领导者及其追随者完成。 当他们成功确认数据时,这意味着已成功接收到数据。 在这种情况下,不会发生数据丢失。

让我们看一个例子

假设,生产者将数据写入 Broker1、Broker 2 和 Broker 3。

情况 1: 生产者将数据发送到每个 Broker,但未收到任何确认。 因此,可能发生严重的数据丢失,并且无法将正确的数据传达给消费者。

Kafka Producer

情况 2: 生产者将数据发送到代理。 Broker 1 拥有领导者。 因此,领导者会询问 Broker 1 是否已成功接收到数据。 在收到 Broker 的确认后,领导者将带有 ack=1 的反馈发送给生产者。

Kafka Producer

情况 3: 生产者将数据发送到每个代理。 现在,领导者及其副本/ISR 将询问他们各自的代理有关数据的信息。 最后,用反馈确认生产者。

Kafka Producer

注意: 在上图中,Broker 1 和 Broker 2 已成功接收到数据。 因此,这两个代理都对其各自的 Topic 回复“是”。