本文概述
- 生产者如何将数据写入集群?
生产者如何将数据写入集群?生产者使用以下策略将数据写入集群:
- 消息键
- 确认
Apache Kafka启用密钥的概念以特定顺序发送消息。该键使生产者有两种选择,即要么将数据自动发送到每个分区,要么仅将数据发送到特定分区。使用消息键可以将数据发送到某些特定分区。如果生产者将密钥应用于数据,则该数据将始终始终发送到同一分区。但是,如果生产者在写入数据时未应用密钥,则将以循环方式发送。此过程称为负载平衡。在Kafka中,当生产者在不指定任何键的情况下将数据写入Kafka主题时,负载平衡就完成了,Kafka将很少的位数据分配给每个分区。
因此,消息键可以是字符串,数字或任何我们希望的值。
有两种方法可以知道数据是通过密钥发送还是不通过密钥发送:
- 如果key = NULL的值,则意味着没有密钥发送数据。因此,它将以循环方式分配(即分配给每个分区)。
- 如果key!= NULL的值,则意味着该密钥已随数据附加,因此所有消息将始终传递到同一分区。
考虑以下情形:生产者将数据写入Kafka集群,并且在不指定密钥的情况下写入数据。因此,数据在每个代理(即代理1,代理2和代理3)下的Topic-T的每个分区之间分配。
文章图片
考虑另一种情况,生产者将键指定为Prod_id。因此,Prod_id_1(例如)的数据将始终发送到代理1下的分区0,而Prod_id_2的数据将始终在代理2下的分区1中。因此,在应用密钥后,数据不会分发到每个分区(如在上述情况中看到)。
文章图片
确认
为了将数据写入Kafka集群,生产者还有另一种选择。这意味着生产者可以通过接收以下确认来确认其数据写入:
- acks = 0:这意味着生产者将数据发送到代理,但不等待确认。这可能导致数据丢失,因为如果没有确认数据已成功发送到代理,或者可能是代理已关闭,它将发送另一个数据。
- acks = 1:这意味着制作人将等待领导者的确认。负责人询问代理是否成功接收了数据,然后将反馈返回给生产者。在这种情况下,只有有限的数据丢失。
- acks = all:在此,确认是由领导者及其跟随者完成的。当他们成功确认数据后,就意味着数据已成功接收。在这种情况下,不会丢失数据。
假设生产者将数据写入Broker1,Broker 2和Broker 3。
情况1:生产者将数据发送到每个Broker,但未收到任何确认。因此,可能会造成严重的数据丢失,并且无法将正确的数据传达给消费者。
文章图片
案例2:生产者将数据发送给代理。代理1担任领导者。因此,领导者询问代理1它是否已成功接收数据。在收到代理的确认后,领导者将反馈发送给生产者,其ack = 1。
文章图片
【apache kafka生产者(producer)】情况3:生产者将数据发送给每个代理。现在,领导者及其副本/ ISR将向各自的代理询问数据。最后,请反馈给制作人。
文章图片
注意:在上图中,代理1和代理2已成功接收数据。因此,两个代理对各自的主题都回答“是”。