使用Akka演员通过流量进行分片

时间:2017-09-14 14:51:11

标签: scala akka scalability sharding akka-cluster

想象一下,您有一项服务可以在四个欧洲国家的首都返回餐厅评级:

  • 阿姆斯特丹
  • 都柏林
  • 伦敦
  • 巴黎

使用Akka,想象你将每个城市分配给一个Actor,然后将这些角色划分为两个节点(想想Akka Cluster)。如果我们按字母顺序天真地对我们的演员进行分类,那么结果是:

  • 节点1:阿姆斯特丹+都柏林演员(总人口400万)
  • 节点2:伦敦+巴黎演员(总人口1,100万)

显然交通非常不平衡。如果你事先不知道城市的人口,Akka是否提供了动态重新配置你如何分割这些城市的工具?

我感谢任何指针或参考。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

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

为此,请扩展ShardAllocationStrategy并实施这两种方法:

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]]

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

这两个函数都返回一个Future,这意味着您甚至可以查询另一个演员以获取您需要的信息(例如,在您的情况下,获取每个城市的“权重”以选择具有该区域的区域最小的重量。)

答案 1 :(得分:0)

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