📅  最后修改于: 2021-01-05 02:36:26             🧑  作者: Mango
生产者是将数据发布或写入不同分区中的主题的生产者。生产者自动知道,应该将哪些数据写入哪个分区和代理。用户不需要指定代理和分区。
生产者使用以下策略将数据写入集群:
Apache Kafka启用密钥的概念以特定顺序发送消息。该键使生产者可以有两种选择,即要么将数据自动发送到每个分区,要么仅将数据发送到特定分区。使用消息键可以将数据发送到某些特定分区。如果生产者将密钥应用于数据,则该数据将始终始终发送到同一分区。但是,如果生产者在写入数据时未应用密钥,则将以循环方式发送。此过程称为负载平衡。在Kafka中,当生产者在不指定任何键的情况下将数据写入Kafka主题时,负载平衡就完成了,Kafka将很少的位数据分配给每个分区。
因此,消息键可以是字符串,数字或任何我们希望的值。
有两种方法可以知道数据是通过密钥发送还是不通过密钥发送:
让我们看一个例子
考虑以下情形:生产者将数据写入Kafka集群,并且在不指定密钥的情况下写入数据。因此,数据在每个代理(即代理1,代理2和代理3)下的Topic-T的每个分区之间分配。
考虑另一种情况,生产者将键指定为Prod_id。因此,Prod_id_1(例如)的数据将始终发送到Broker 1下的分区0,而Prod_id_2的数据将始终位于Broker 2下的分区1。因此,在应用密钥后,数据将不会分发到每个分区(如在上述情况中看到)。
为了将数据写入Kafka集群,生产者还有另一种选择。这意味着生产者可以通过接收以下确认来确认其数据写入:
让我们看一个例子
假设生产者将数据写入Broker1,Broker 2和Broker 3。
情况1:生产者将数据发送到每个Broker,但未收到任何确认。因此,可能会造成严重的数据丢失,并且无法将正确的数据传达给消费者。
案例2:生产者将数据发送给经纪人。经纪人1担任领导者。因此,领导者询问经纪人1它是否已成功接收数据。在收到经纪人的确认后,领导者将反馈发送给生产者,其ack = 1。
情况3:生产者将数据发送给每个经纪人。现在,领导者及其副本/ ISR将向各自的经纪人询问数据。最后,用反馈确认生产者。
注意:在上图中,Broker 1和Broker 2已成功接收数据。因此,两个经纪人对各自的主题都回答“是”。