Kafka生产者消息为什么分区?
主题下的每条消息只存在于其中的一个分区中,多个分区不会被多分保存。
- 其实分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性
- 并且不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的读写请求处理。并且,我们还可以通过添加新的节点机器来增加整体系统的吞吐量。
主题下的每条消息只存在于其中的一个分区中。
我们创建的ProducerRecord对象包括主题名称,键和值。 Kafka消息是键值对,虽然可以仅使用主题和值创建ProducerRecord,但默认情况下键设置为null,大多数应用程序生成带键的记录。
Key的使用有两个目标:
它们是与消息一起存储的附加信息
它们还用于决定将消息写入哪个主题分区。
具有相同Key的所有消息将转到同一分区。 这意味着如果进程只读取主题中的分区的子集,则单个键的所有记录将由同一进程读取。 要创建键值记录,只需创建一个ProducerRecord,如下所示
ProducerRecord<Integer, String> record =
new ProducerRecord<>("CustomerCountry", "Laboratory Equipment", "USA");
使用null键创建消息时,您只需将key留空
ProducerRecord<Integer, String> record =
new ProducerRecord<>("CustomerCountry", "USA");
Kafka将对Key进行hash散列(使用其自己的hash算法,因此在升级Java时散列值不会更改),并使用结果将消息映射到特定分区。