Akka Cluster 的分片数量应该始终等于 Kafka 分区的数量吗?

问题描述

我目前正在使用 Akka 项目,该项目由一个 5 节点 Akka 集群组成。当我们第一次设置项目时,我们决定将分片数设置为 50,主要是因为以下链接中的声明。

Akka Cluster Sharding

根据经验,分片的数量应该比计划的最大集群节点数大十倍

现在我们正在将我们的消息传递解决方案更改为 Kafka,如果我在 akka 流 kafka 正确阅读了文档,他们建议采用与分区数量相同的分片数量

我们不想在我们的主题中有 50 个分区,所以我可能会去 5 个分区(等于 Akka 集群节点),这意味着将 Akka 集群中的分片数量从 50 个减少到 5 个。

这是个坏主意吗?如此少的分片会不会对 Akka 集群产生负面影响?

感谢回答...

解决方法

简短的回答是,该指南仅在您使用该链接中描述的可选外部分片分配器时才适用。如果您使用的是“普通”分片分配器,则适用普通的集群分片建议。

无论是否使用Kafka,以下情况都适用于使用集群分片:

  • 分片的数量绝不能少于要托管分片实体的集群中的节点数量(否则,集群的某些节点将未被使用)
  • 一般来说,您拥有的分片越多,工作负载的分布就越均匀(感谢大数定律),但每个分片确实会增加一些协调开销(即,极端分片数量的收益递减)

当消息序列化或其他网络瓶颈导致性能大幅下降时,可以使用用于集群分片的 Kafka 外部分片分配器。从 Kafka 消费时,您可以使用“正常”分片分配器(无论分片数量如何),您甚至可以在它们之间切换(对于涉及更改分片数量的任何事情,您必须确保在任何时候都不做任何事情)集群中的两个节点在分片数量或确定分片键的方法上存在分歧:这意味着此类更改需要完全重启集群)以评估哪个更适合您的需求。

我倾向于不使用 Kafka 外部分片分配器:对我来说,我的处理可扩展性基本上与 Kafka 分区计数分离(如果多个服务从同一主题消费,这一点尤其重要)。此外,如果负责处理的参与者正在接收从多个主题中提取的消息,那么外部分片分配器甚至可能不会带来太多好处。

根据我的经验,很多人忘记了性能和可扩展性不是一回事:很多时候,为提高性能而进行的更改会限制可扩展性,而为提高可扩展性而进行的更改会带来性能损失。外部分片分配器是改进性能的一个很好的例子,这限制了可扩展性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...