📜  Apache Kafka Producer

📅  最后修改于: 2021-01-05 02:36:26             🧑  作者: Mango

卡夫卡制片人

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

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

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

  • 留言键
  • 致谢

留言键

Apache Kafka启用密钥的概念以特定顺序发送消息。该键使生产者可以有两种选择,即要么将数据自动发送到每个分区,要么仅将数据发送到特定分区。使用消息键可以将数据发送到某些特定分区。如果生产者将密钥应用于数据,则该数据将始终始终发送到同一分区。但是,如果生产者在写入数据时未应用密钥,则将以循环方式发送。此过程称为负载平衡。在Kafka中,当生产者在不指定任何键的情况下将数据写入Kafka主题时,负载平衡就完成了,Kafka将很少的位数据分配给每个分区。

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

有两种方法可以知道数据是通过密钥发送还是不通过密钥发送:

  • 如果key = NULL的值,则表示没有密钥发送数据。因此,它将以循环方式分布(即,分布到每个分区)。
  • 如果key!= NULL的值,则意味着该密钥已随数据附加,因此所有消息将始终传递到同一分区。

让我们看一个例子

考虑以下情形:生产者将数据写入Kafka集群,并且在不指定密钥的情况下写入数据。因此,数据在每个代理(即代理1,代理2和代理3)下的Topic-T的每个分区之间分配。

考虑另一种情况,生产者将键指定为Prod_id。因此,Prod_id_1(例如)的数据将始终发送到Broker 1下的分区0,而Prod_id_2的数据将始终位于Broker 2下的分区1。因此,在应用密钥后,数据将不会分发到每个分区(如在上述情况中看到)。

致谢

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

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

让我们看一个例子

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

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

案例2:生产者将数据发送给经纪人。经纪人1担任领导者。因此,领导者询问经纪人1它是否已成功接收数据。在收到经纪人的确认后,领导者将反馈发送给生产者,其ack = 1。

情况3:生产者将数据发送给每个经纪人。现在,领导者及其副本/ ISR将向各自的经纪人询问数据。最后,用反馈确认生产者。


注意:在上图中,Broker 1和Broker 2已成功接收数据。因此,两个经纪人对各自的主题都回答“是”。