3

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

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

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

我需要将此谷物标记为可重入吗?还是 StatelessWorker (属性)就足够了?

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

GrainClient.GrainFactory.GetGrain<IDispatcherActor>(0)

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

GrainClient.GrainFactory.GetGrain<IDispatcherActor>()

即使我继承自IGrain

4

2 回答 2

7

简答

IGrainWithIntegerKey您可以通过继承和使用 key创建无状态工作者0

长答案

无国籍工人与普通谷物相同,但有几个区别:

  1. 它们总是在本地激活(在与调用者相同的筒仓中)。
  2. 如果对无状态工作者激活的调用建立,则可以创建多个激活。

它们受制于相同的停用语义。

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

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

但是,如果这些功能对您没有用处,约定是使用0.

于 2016-10-04T14:12:54.753 回答
3
  1. 它们只能从筒仓内部调用。

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

于 2016-10-04T16:23:15.780 回答