我目前正在与Akka项目合作,该项目由一个5节点的Akka集群组成。当我们第一次设置项目时,我们决定将碎片数量设置为50,主要是因为下面链接中的语句。
阿卡集群碎片
根据经验,碎片的数量应该比集群节点的计划最大数量大十倍
现在我们正在将消息传递解决方案更改为Kafka,如果我在akka流Kafka上正确阅读了文档,他们建议使用与分区数量相同的碎片数量。
我们不想在我们的主题中有50个分区,所以我可能会选择5个分区(等于Akka集群节点(,这意味着将Akka集群中的碎片数量从50个减少到5个。
这是个坏主意吗?这会对阿卡星团的碎片这么少产生负面影响吗?
谢谢你的回答。。。
简单的答案是,只有当您使用该链接中描述的可选外部碎片分配器时,该准则才适用。如果您正在使用";正常的";shard分配器,则应用正常的集群共享建议。
无论是否使用Kafka,使用集群共享都有以下情况:
- 碎片的数量永远不应该小于集群中要托管碎片实体的节点数量(否则,集群中的一些节点将不使用(
- 一般来说,碎片越多,工作负载分配就越均匀(这要归功于大数定律(,但每个碎片都会增加一些协调开销(即,极端碎片数量的回报递减(
当消息序列化或其他网络瓶颈导致性能大幅下降时,可以使用用于集群共享的Kafka外部碎片分配器。您可以使用";正常的";当从Kafka消费时,碎片分配器(不管碎片的数量(,您甚至可以在它们之间切换(就像任何涉及更改碎片数量的事情一样,您必须确保集群中的任何两个节点在任何时候都不会在碎片数量或确定碎片密钥的方法上存在分歧:这意味着这样的更改需要完全重新启动集群(,以评估哪一个更适合您的需求。
我倾向于不使用Kafka外部碎片分配器:对我来说,我的处理可伸缩性基本上与Kafka分区计数脱钩(如果多个服务使用同一主题,这一点尤其重要(。此外,如果负责处理的参与者正在接收来自多个主题的消息,那么外部碎片分配器甚至可能不会带来太多好处。
根据我的经验,很多人都忘记了性能和可扩展性不是一回事:通常情况下,为提高性能而进行的更改会限制可扩展性,而为提高可扩展性所做的更改会带来性能损失。外部分片分配器是一个很好的例子,可以用来改进限制可伸缩性的性能。