使用 Akka 演员按流量分片

Sharding by traffic using Akka actors

假设您有一项服务 returns 四个欧洲首都的餐厅评级:

使用 Akka,假设您将每个城市分配给一个 Actor,然后将这些 Actor 划分到两个节点(想想 Akka Cluster)。如果我们天真地按字母顺序对 actor 进行分片,则结果为:

显然流量会很不平衡。如果您事先不知道城市的人口,Akka 是否提供了一个工具来动态重新配置您如何分片这些城市?

感谢任何指点或参考。感谢您的帮助!

我认为 Cluster Sharding 可能是我需要的 Akka 功能。

正如您所提到的,集群分片允许您轻松地在集群中分布您的参与者。默认情况下,在分配的分片数量最少 (LeastShardAllocationStrategy) 的区域(节点)上创建一个新分片,但您可以使用不同的规则轻松创建自己的自定义 ShardAllocationStrategy

为此,扩展 ShardAllocationStrategy 并实施这 2 个方法:

def allocateShard(requester: ActorRef, shardId: ShardId, 
  currentShardAllocations: Map[ActorRef, immutable.IndexedSeq[ShardId]])
  : Future[ActorRef]

def rebalance(currentShardAllocations: Map[ActorRef,
  immutable.IndexedSeq[ShardId]], rebalanceInProgress: Set[ShardId])
  : Future[Set[ShardId]]

第一个确定分配新分片时将选择哪个区域,并为您提供已分配的分片。 第二个定期调用,让您控制将哪些分片重新平衡到另一个区域(例如,如果它们变得太不平衡)。

两个函数return一个Future,这意味着你甚至可以查询另一个actor来获取你需要的信息(在你的例子中,例如,获取"weight"的每个城市选择权重最小的区域)。