Kafka 生产者 Producers
生产者是向不同分区内的主题发布或写入数据的生产者。生产者自动知道应该将哪些数据写入哪个分区和代理。用户不需要指定代理和分区。
生产者如何向集群写入数据?
生产者使用以下策略向集群写入数据:
- Message Keys
- Acknowledgment
Message Keys
Apache Kafka 启用密钥的概念以特定顺序发送消息。密钥使生产者有两种选择,即向每个分区发送数据(自动)或仅将数据发送到特定分区。使用消息键可以将数据发送到某些特定分区。如果生产者对数据应用密钥,则该数据将始终发送到同一个分区。但是,如果生产者在写入数据时没有应用密钥,它将以循环方式发送。此过程称为负载平衡。在Kafka中,当生产者在不指定任何key的情况下将数据写入Kafka topic时进行负载均衡,Kafka将一点一点的数据分发到每个分区。
因此,消息key可以是字符串,数字, 或任何我们想要的。
有两种方法可以知道数据是使用密钥发送的还是不使用密钥发送的:
- 如果key=NULL,则表示发送数据时没有key。因此,它将以循环方式分发(即分发到每个分区)。
- 如果 key 的值!=NULL,则表示 key 与数据相关联,因此所有消息将始终传递到同一个分区。
示例:
考虑一个生产者向Kafka集群写入数据,数据写入时没有指定key的场景。因此,数据分布在每个broker下的Topic-T的每个分区中,即Broker 1、Broker2和Broker 3、
考虑生产者将密钥指定为 Prod_id 的另一种情况。所以,Prod_id_1(say)的数据会一直发送到Broker 1下的partition 0,而Prod_id_2的数据会一直发往Broker 2下的partition 1、这样,应用key后数据不会被分发到每个partition(如在上面的场景中看到了。
Acknowledgment
为了向Kafka集群写入数据,生产者还有一个确认的选择。这意味着生产者可以通过接收以下确认来确认其数据写入:
- acks=0: 这意味着生产者将数据发送给代理但不等待确认。这可能会导致数据丢失,因为在没有确认数据已成功发送到代理或代理已关闭的情况下,它会发送另一个数据。
- acks=1: 这意味着生产者将等待领导者的确认。 leader询问broker是否成功接收到数据,然后将反馈返回给producer。在这种情况下,只有有限的数据丢失。
- acks=all: 在这里,确认是由领导者和追随者共同完成的。当他们成功确认数据时,表示数据已成功接收。在这种情况下,没有数据丢失。
示例:
假设一个生产者向 Broker1、Broker 2 和 Broker 3 写入数据。
Case1: Producer 向每个 Broker 发送数据,但没有收到任何确认。因此,可能会出现严重的数据丢失,无法将正确的数据传达给消费者。
Case2: 生产者将数据发送给代理。 Broker 1 持有领导者。因此,leader 会询问 Broker 1 是否成功接收到数据。 leader收到Broker的确认后,将ack=1的反馈发送给Producer。
案例3: 生产者向每个代理发送数据.现在,leader 及其副本/ISR 将向各自的代理询问数据。最后,用反馈感谢制作人。
注意: 在上图中,Broker 1 和Broker 2 已成功接收到数据。因此,两家经纪商都对其各自的主题做出了"是"的回应。
Kafka: 消费者和消费者组 消费者是通过主题从 Kafka 集群消费或读取数据的消费者。消费者也知道它应该从哪个代理读取数据。消费者按顺序读取每个分区内的数据。这意味着消费者不应该在从 ...