分片按流量使用阿卡演员

分片按流量使用阿卡演员

问题描述:

假设你有一个返回餐厅收视率在四个欧洲首都服务:分片按流量使用阿卡演员

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

使用阿卡,想象你将每个城市分配给一个演员,然后将这些演员分配到两个节点(认为Akka集群)。如果我们天真地分片我们按字母顺序排列的演员,所产生的分工是:

  • 节点1:阿姆斯特丹+都柏林的演员(总人口400万美元)
  • 节点2:伦敦+巴黎参与者(总人口1100万)

很明显,交通将是非常不平衡的。如果你事先不知道城市的人口,Akka是否提供了一个工具来动态地重新配置你分割这些城市的方式?

我很欣赏任何指针或引用。谢谢你的帮助!

+0

我认为他们提供某种'循环'选择的演员负载平衡 – Erix

+0

我正在阅读部分[应用Akka模式](http://shop.oreilly.com/product/0636920043577.do)书,当我找出一些东西的时候,会回到这里! – ticofab

正如您所提到的,Cluster Sharding允许您轻松地在集群中分配角色。默认情况下,在分区分区(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]] 

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

这两个函数都会返回一个Future,这意味着您甚至可以查询另一个actor来获取所需的信息(例如,获取每个城市的“权重”以选择权重最小的区域) 。

+0

谢谢@Pierre! – ticofab

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