奥尔良无状态工人

3

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

我想实现类似这个的东西。正如文档中建议的那样,我需要使用无状态工作者(Stateless Workers)来处理一些消息并激活最终将持有状态的谷粒(grains)。

我希望有多个调度器谷粒(grain)的实例来处理“初始化”操作,因为这个谷粒(grain)根本不处理任何状态,而且消息不需要按顺序排队。

我需要将这个谷粒(grain)标记为Reentrant吗?还是只用StatelessWorker (attribute)就足够了?

关于激活方面,看起来我需要从IGrainWithIntegerKey(或类似的接口)继承。这意味着我需要按照以下方式激活这个谷粒(grain):

GrainClient.GrainFactory.GetGrain<IDispatcherActor>(0)

由于我一直使用0作为ID,多个谷物实例是否仍会被激活?还是我需要创建不同的ID。似乎我不能按以下方式调用谷物:

GrainClient.GrainFactory.GetGrain<IDispatcherActor>()

即使我继承自IGrain
2个回答

7

简短回答

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

详细回答

无状态工作者与普通颗粒有几个不同之处:

  1. 它们始终在本地激活(在调用者所在的相同silo中)。
  2. 如果对无状态工作者激活的调用累积起来,可能会创建多个激活。

它们受到相同的停用语义影响。

无状态工作者拥有键可能会让人感到惊讶,但是有几个原因可能会有用:

  1. 无状态工作者激活可能具有不同的“风味”,这可能与其键有关。
  2. 可以通过使用一系列键来激活更大的无状态工作者池。

但如果这些特性对您没有用处,则惯例是使用键0


谢谢您的回复,Richard。"它们只能在内部调用"是否意味着我不能使用GrainClient来激活无状态工作者?并且使其可重入是否有意义?以便同一颗粒可以处理多个请求? - Jonny
无状态工作进程可以从其他颗粒中调用,但不能直接从外部客户端调用。我会使一个颗粒可重入以优化性能。我认为对于无状态工作进程来说没有必要这样做。 - Richard Astbury

3
  1. 它们只能从内部筒仓调用。

StatelessWorker颗粒可以从客户端调用。这实际上是一种常见的情况,当需要对来自客户端的调用进行预处理以便将其路由到其他颗粒进行实际处理时。


其他流行的场景包括执行纯函数/无状态操作和自动扩展热缓存项。 - sbykov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接