Akka.Net ConsistentHashing 路由器作为内存数据对象的负载平衡器

Akka.Net ConsistentHashing router as a load balancer for in memory data object

我有大量的内存对象,我只是想知道,我是否可以创建一个 ConsistentHashing 路由器并能够将负载分摊给底层参与者。 主要问题是我需要在创建后使用数据摄取演员,所以只是想知道如何实现这一点。 master对象有好几条记录,会按Id字段分组

这是我的想法:

  1. 创建 actor 时 - 我可以获取它的哈希池以从主对象检索所需的 ID 吗?

  2. 创建 actor 时,我可以包装摄取消息 ConsistentHashableEnvelope,然后在查询时使用相同的包装来请求数据——这行得通吗?

reference

根据对您问题的评论,我更了解您要做什么。

我做过类似的事情,但参与者必须启动的方式略有不同:一个缓存系统,我在 ConsistentHashableEnvelope 中使用用户 ID 将请求路由到应该执行的参与者处理该用户的请求。如果用户的数据不可用,则会从第三方服务将其加载到内存中。以下所有请求都将对内存中的此数据进行操作。

对于你的情况,我会以这种方式解决问题:

  • 设置您的 ConsistentHashing 路由器,让 actor 启动时可以 Receive<> 他们需要的各个条目。
  • 简单地 Tell() 路由器使用 ConsistentHashableEnvelope 作为包装器将您要分割的这个大对象中的所有单个条目,路由器会将每个条目发送到其正确的目的地。
  • 在 actor 中,Receive<> 条目并使用某种方法将接收到的数据合并到现有的内部结构中。这意味着当 actor 第一次启动时,它只会存储切片,如果它稍后收到条目,您可以决定要做什么(替换、更新,随心所欲)。
  • 将子请求消息传递给路由器时,始终确保您使用的是正确的密钥ConsistentHashableEnvelope,否则消息将被路由到一个actor没有数据!

从你的 post 我不太了解你的项目要求的其余部分,但是如果你需要能够在处理依赖于此数据的其他请求之前先用他们的切片填充演员,您可能希望使用 Become()AwaitingData 状态启动路由,然后在接收到它们的数据后将它们移动到 Ready 状态。

如果您添加更多关于您的项目的信息,我也许可以为您提供更多帮助。