【问题标题】:Creating actor per domain object为每个域对象创建参与者
【发布时间】:2016-04-19 17:57:41
【问题描述】:

我一直在尝试使用带有ConsistentHashingPool 的路由器来动态创建actor,以根据对象ID 来消费消息,在这个简单的例子中,它是一个唯一的字符串。

我希望每个域聚合一个参与者,这似乎是一种非常简单的方法。

但是散列似乎在做一些奇怪的事情,并向已经从不同的散列映射值生成的参与者发送消息。

ActorSystem.ActorOf(
    Props.Create(() => new MyAggergateActor()).WithRouter(
        new ConsistentHashingPool(10)
        .WithHashMapping(o => (o as MyEvent)?.MyAggregateUniqueId ?? string.Empty)
        .WithResizer(new DefaultResizer(1, int.MaxValue))), 
    "myAggregateRouter");

同时调整 nrOfInstances 的值似乎也破坏了事情,这意味着哈希可能只适用于初始实例集,并且没有产生新的参与者?我认为调整大小应该在这里帮助我?

请原谅我的幼稚,我才刚刚开始使用 Akka。

【问题讨论】:

    标签: routing akka.net


    【解决方案1】:

    这里的关键是了解路由器的真正作用。一致散列意味着,给定所有可能的一致散列值范围,路由器池中的每个参与者都负责处理所有可能性范围中的散列范围

    例如:如果您的一致性哈希值可以是 1-100 的可能范围中的一个值,则具有 10 个参与者池的一致性哈希路由器会将哈希值从 1-10 的消息委托给第一个参与者 11-20到第二个,依此类推......一旦你调整了池的大小,这些哈希范围将重新调整到池中的每个参与者 - 所以在这种情况下,在将池的大小调整为 20 个参与者之后,第一个现在将服务范围从 1-5,秒 6-10 等。

    如果您想动态创建参与者并根据某个实体 ID 将消息路由给他们,我相信您正在寻找的东西是 Akka.Cluster.Sharding

    【讨论】:

    • 我认为 akka.cluster 和分片对我的应用程序来说完全是多余的。还。但是,我想我是想通过使用圆钉作为方孔来变得聪明。现在我对路由器有了更好的了解(感谢您的回复)我意识到我的方式错误。我现在只是使用一个actor来管理实例并将消息转发到正确的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2018-09-04
    • 2020-04-20
    相关资源
    最近更新 更多