分片按流量使用阿卡演员
问题描述:
假设你有一个返回餐厅收视率在四个欧洲首都服务:分片按流量使用阿卡演员
- 阿姆斯特丹
- 都柏林
- 伦敦
- 巴黎
使用阿卡,想象你将每个城市分配给一个演员,然后将这些演员分配到两个节点(认为Akka集群)。如果我们天真地分片我们按字母顺序排列的演员,所产生的分工是:
- 节点1:阿姆斯特丹+都柏林的演员(总人口400万美元)
- 节点2:伦敦+巴黎参与者(总人口1100万)
很明显,交通将是非常不平衡的。如果你事先不知道城市的人口,Akka是否提供了一个工具来动态地重新配置你分割这些城市的方式?
我很欣赏任何指针或引用。谢谢你的帮助!
答
正如您所提到的,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
我认为他们提供某种'循环'选择的演员负载平衡 – Erix
我正在阅读部分[应用Akka模式](http://shop.oreilly.com/product/0636920043577.do)书,当我找出一些东西的时候,会回到这里! – ticofab