【问题标题】:Should Akka Cluster number of shard should be always equal number of Kafka partition?Akka Cluster 的分片数量是否应该始终等于 Kafka 分区的数量?
【发布时间】:2021-01-05 08:55:44
【问题描述】:

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

Akka Cluster Sharding

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

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

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

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

谢谢解答...

【问题讨论】:

  • 您能否将链接添加到建议take same number of shards as the number of partitions.的文档
  • doc.akka.io/docs/alpakka-kafka/current/cluster-sharding.html 可能是我对文本的解释有误,但这里是 >> 因此使用相同的 Kafka 消息密钥(分片实体 ID)和 Kafka 主题分区(分片)的数量至关重要。消息提取器可以选择查找给定主题名称的分片数量,或者用户可以显式提供分片数量

标签: apache-kafka akka akka-stream akka-cluster


【解决方案1】:

简短的回答是,该指南仅适用于您使用该链接中描述的可选外部分片分配器的情况。如果您使用的是“正常”分片分配器,则适用正常的集群分片建议。

无论是否使用 Kafka,使用 Cluster Sharding 的以下几点都是正确的:

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

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

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

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

【讨论】:

  • 我理解您的观点,但我还有其他复杂情况,我有几个依赖于业务案例的 Actor 必须一起工作。例如,我有 ActorType1、ActorType2、ActorType3、ActorType4、ActorType5,他们将参与一个商业案例。我打算做什么,为这些 Actor 传递消息的 kafka 主题将具有如下键,ActorType1uuid1_token1,ActorType2uuid1_token1,ActorType3uuid1_token1,ActorType4uuid1_token1,ActorType5uuid1_token1 和特殊的 Kafka Partiioner 我将确保它们将落在同一个主题分区中并使用
  • 分区数与分片数相同,所有必须一起工作的 Actor 实体将落在同一个分片中。这样我希望我不会付出序列化和 Akka 节点间通信的代价。如果它按我的计划工作,假设在 5 节点 Akka 集群中,例如,AkkaClusterNode3 -> shard3 -> (ActorType1uuid1_token1,ActorType2uuid1_token1,ActorType3uuid1_token1,ActorType4uuid1_token1,ActorType5uuid1_token1),因此集群节点间通信被阻止以完成此业务案例。
  • 如果我不按照我担心的这个计划,再次在 5 节点 Akka 集群中,Actor 可能会分布如下,AkkaClusterNode1 -> shard4-> ActorType1uuid1_token1,AkkaClusterNode2 - shard12->ActorType2uuid1_token1,AkkaClusterNode3 -> shard26 ->ActorType3uuid1_token1, AkkaClusterNode4 -> shard32 -> ActorType4uuid1_token1, AkkaClusterNode5 -> shard35 -> ActorType5uuid1_token1 并完成一个业务案例,每个节点都必须与另一个节点通信,然后我才真正开始为序列化和节点间付出代价通信,我开始不线性扩展。如果我添加节点 6,我会缩放
  • 如果将外部分片分配器与 5 分区主题一起使用,则根本不会扩展到超过 5 个节点,因为根本不会使用超过 5 个节点。您可以通过仅对令牌进行哈希处理来确保同一令牌的不同ActorTypes 哈希到同一个分片。
  • 如果需要扩展(在我们的分区策略中没有限制),我们可以去 10 个分区或 20 或 50 个分区,我只是不想直接去50,我不确定,因为 ClusterSharding (AkkaNode*10) 中的措辞,所以 5 低,因为 KafkaClusterSharding (partitionsizde=numberofshards) 的措辞
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 2023-02-17
  • 2017-02-11
  • 2011-01-30
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多