【Kafka】《Kafka权威指南》——分区partition

在上篇的例子里(【Kafka】《Kafka权威指南》——写数据), ProducerRecord 对象包含了目标主题、键和值。 Kafka 的消息是 一个个 键值对, ProducerRecord对象能够只包含目标主题和值,键能够设置为默认的 null,不过大多数应用程序会用到键。键有两个用途 :能够做为消息的附加信息,也能够用来决定消息该被写到主题的哪一个分区。拥有相同键的悄息将被写到同一个分区。 也就是说,若是一个进程只从一个主题的分区读取数据(第 4章会介绍更多细节),那么具备相 同键的全部记录都会被该进程读取。要建立一个包含键值的记录,只需像下面这样建立 ProducerRecord 对象:
算法

若是键值为 null, 井且使用了默认的分区器,那么记录将被随机地发送到主题内各个可用的分区上。分区器使用轮询(Round Robin)算法将消息均衡地分布到各个分区上。服务器

若是键不为空,而且使用了默认的分区器,那么Kafka会对键进行散列(使用 Kafka 本身的散列算法,即便升级Java版本,散列值也不会发生变化),而后根据散列值把消息映射到特定的分区上。这里的关键之处在于 ,同一个键老是被映射到同一个分区上 ,因此在进 行映射时,咱们会使用主题全部的分区,而不单单是可用的分区 。这也意味着,若是写入数据的分区是不可用的,那么就会发生错误。但这种状况不多发生。咱们将在第 6章讨论 Kafka 的复制功能和可用性。post

只有在不改变主题分区数量的状况下,键与分区之间的映射才能保持不变 。举个例子,在分区数量保持不变的状况下,能够保证用户 045189 的记录老是被写到分区 34。在从分区读取数据肘,能够进行各类优化。不过,一旦主题增长了新的分区,这些就没法保证 了——旧数据仍然留在分区 34,但新的记录可能被写到其余分区上 。 若是要使用键来映射分区,那么最好在建立主题的时候就把分区规划好,并且永远不要增长新分区。优化

实现自定义分区策略

咱们已经讨论了默认分区器的特色,它是使用次数最多的分区器。不过 ,除了散列分区之 外,有时候也须要对数据进行不同的分区。假设你是一个 B2B 供应商,你有 一 个大客 户,它是手持设备 Banana 的制造商。 Banana 占据了你总体业务 10% 的份额。若是使用默 认的散列分区算怯, Banana 的帐号记录将和其余帐号记录一块儿被分配给相同的分区,致使 这个分区比其余分区要大一些。服务器可能所以出现存储空 间不足、处理缓慢等问题。我 们须要给 Banana 分配单独的分区,而后使用散列分区算住处理其余帐号 。对象

下面是一个自定义分区器的例子 :blog

相关文章
相关标签/搜索