使用 Akka 演员按流量分片
Sharding by traffic using Akka actors
假设您有一项服务 returns 四个欧洲首都的餐厅评级:
- 阿姆斯特丹
- 都柏林
- 伦敦
- 巴黎
使用 Akka,假设您将每个城市分配给一个 Actor,然后将这些 Actor 划分到两个节点(想想 Akka Cluster)。如果我们天真地按字母顺序对 actor 进行分片,则结果为:
- 节点1:阿姆斯特丹+都柏林演员(总人口400万)
- 节点2:伦敦+巴黎演员(总人口1100万)
显然流量会很不平衡。如果您事先不知道城市的人口,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"的每个城市选择权重最小的区域)。
假设您有一项服务 returns 四个欧洲首都的餐厅评级:
- 阿姆斯特丹
- 都柏林
- 伦敦
- 巴黎
使用 Akka,假设您将每个城市分配给一个 Actor,然后将这些 Actor 划分到两个节点(想想 Akka Cluster)。如果我们天真地按字母顺序对 actor 进行分片,则结果为:
- 节点1:阿姆斯特丹+都柏林演员(总人口400万)
- 节点2:伦敦+巴黎演员(总人口1100万)
显然流量会很不平衡。如果您事先不知道城市的人口,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"的每个城市选择权重最小的区域)。