当前位置: 首页 > 知识库问答 >
问题:

Akka集群分片:基于通信模式的移动actor分片

刘昌翰
2023-03-14

我正在使用Akka(特别是远程和集群包)构建一个开源的分布式经济模拟平台。这类仿真中的一个关键瓶颈是参与者之间的通信模式在仿真过程中不断演变,并且参与者最终通常会通过集群中节点之间的线路发送消息负载。

我正在寻找一种机制来检测某些节点上的参与者,这些参与者正在与其他节点上的参与者进行大量通信,并将它们移动到其他节点。是否可以使用现有的Akka集群分片功能?也许这就是罗兰·库恩所说的“自动演员树划分”是他对这个SO问题的回答。

共有1个答案

充煌
2023-03-14

通过实现自定义的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,这意味着您甚至可以查询另一个actor以获得您需要的信息(例如,一个具有您的actor之间的亲和力信息的actor)。

对于亲和力本身,我觉得你得自己去实现一些东西。例如,参与者可以收集关于其发送方节点的统计信息,并定期将这些信息发布到集群单例中,该集群单例将确定哪些参与者应该移动到同一节点。

 类似资料:
  • 我正致力于将一个单节点akka actor系统应用程序改为akka集群。一个变化是将一种有状态的参与者(在运行时可以有很多)变成集群分片托管实体。现在它在多个节点上运行良好。 我面临的一个问题是如何查询(获取全部)在集群中划分区域所创建的实体。以前在单节点模式下,它使用actor system ActorSelection进行actor路径匹配以获得匹配的actor列表,这在集群分片中不再起作用。

  • 配置 在使用range分表函数前先了解 分库分表规则原理及自定义配置,range分表与普通规则基本原理相同,只是配置略有不同。根据range的分库分表与原有的稍有不同,具体的规则的xml格式及在管理平台上配置后最后存储的格式其实如下: <?xml version="1.0" encoding="UTF-8"?> <router-rule> <table-shard-rule table="

  • 调整集群的分片分配 在ElasticSearch Server一书中,我们探讨了如何强制改变分片的分配方式,如何取消、如何使用一条API命令在集群中转移分片。然而在谈论到分片分配时,ElasticSearch允许我们做的不止如此,我们还可以定义以系列用于分片分配的规则。例如,假定一个4-节点的集群,图示如下: 正如你所看到的一样,集群由4个节点构成。每个节点都绑定了一个特定的IP地址,同时每个节点

  • 我尝试基于Akka创建一些使用CQRS的微服务。所以我的微服务有Httpendpoint的写端(向集群发送命令)和读端(从数据库读取投影),但这不是主要问题。由于许多微服务,问题出现了为客户端收集复杂的API。我找到了答案:API网关模式。但我还有下一个问题:如何实现它? > < li> 我可以创建单独的项目,该项目将实现API网关模式(在简单的情况下,它是一个反向代理)。完整堆栈将: 赞成的意见

  • 我想创建一个分布式系统,其中数据在所有节点上分片。我知道有像Hazelcast或Apache Ignite这样的库为您做这些工作。在我的例子中,对于每个分片密钥,我需要创建一个到另一个系统的套接字订阅,所以这不仅仅是关于如何分发数据,还包括如何以分布式的方式实际创建这些订阅。 其思想是为每个分片密钥创建对另一个系统的订阅。每个订阅都将保留一个条目列表,其中包含用于检查来自套接字连接的每个更新的数据