【问题标题】:Orleans StatelessWorkers奥尔良无国籍工人
【发布时间】:2017-02-11 17:53:32
【问题描述】:

我发现很难找到有关使用 StatelessWorkers 的任何详细文档。

我想实现类似于this 的东西。正如文档中所建议的,我需要使用无状态工作者来处理一些消息并激活最终将保持状态的颗粒。

我希望调度程序grain 的多个实例处理“初始化”,因为这个grain 绝不处理任何状态,并且消息不需要按顺序排队。

我是否需要将此颗粒标记为可重入?还是 StatelessWorker(属性)就足够了?

关于激活,似乎我需要从IGrainWithIntegerKey(或类似接口)继承。这意味着我需要按如下方式激活谷物:

GrainClient.GrainFactory.GetGrain<IDispatcherActor>(0)

由于我总是使用 0 作为 ID,是否仍会激活grain 的多个实例?还是我需要创建不同的 ID。看来我不能这样称呼谷物:

GrainClient.GrainFactory.GetGrain<IDispatcherActor>()

即使我继承自IGrain

【问题讨论】:

    标签: c# .net concurrency actor orleans


    【解决方案1】:

    简答

    您可以通过继承 IGrainWithIntegerKey 并使用密钥 0 创建无状态工作者。

    长答案

    无国籍工人与普通谷物相同,但有一些不同:

    1. 它们始终在本地激活(与调用者在同一孤岛中)。
    2. 如果对无状态工作器激活的调用增加,则可以创建多个激活。

    它们遵循相同的停用语义。

    无状态工作者拥有密钥可能令人惊讶,但密钥可能有用的原因有两个:

    1. 无状态工作者激活可能有不同的“风格”,这可能与其密钥有关。
    2. 可以通过使用一系列密钥寻址来激活更大的无国籍工人池。

    但如果这些功能对您没有用处,惯例是使用0 的密钥。

    【讨论】:

    • 感谢您的回复,理查德。 “只能从筒仓内部调用它们”是否意味着我无法使用 GrainClient 激活无状态工作者?让它可重入有意义吗?这样同一个grain可以处理多个请求?
    • 可以从其他grain调用无状态工作者,但不能直接从外部客户端调用。我会做一个谷物可重入以优化性能。我认为没有必要对无国籍工人这样做。
    【解决方案2】:
    1. 只能从筒仓内部调用它们。

    StatelessWorker grains 可以从客户端调用。这实际上是一种流行的场景,当来自客户端的调用在被路由到其他grain进行实际处理之前应该进行预处理。

    【讨论】:

    • 其他流行的场景是执行纯函数式/无状态操作和自动扩展热缓存项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2017-05-18
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多