Orleans StatelessWorkers
本文关键字:StatelessWorkers Orleans | 更新日期: 2023-09-27 18:11:30
我发现很难找到任何关于使用StatelessWorkers的详细文档。
我想实现类似的东西。正如文档中所建议的,我需要使用无状态工人来处理一些消息并激活最终将保持状态的颗粒。
我希望有多个调度程序粒度的实例来处理"初始化",因为这个粒度绝不处理任何状态,消息也不需要按顺序排队。
我需要将这个纹理标记为可重入的吗?或者StatelessWorker(属性)就足够了吗?
关于激活,似乎我需要从IGrainWithIntegerKey
(或类似的接口)继承。这意味着我需要像下面这样激活纹理:
GrainClient.GrainFactory.GetGrain<IDispatcherActor>(0)
因为我总是使用0作为ID,谷物的多个实例仍然被激活吗?还是我需要创建不同的id ?似乎我不能像下面这样调用谷物:
GrainClient.GrainFactory.GetGrain<IDispatcherActor>()
即使我继承了IGrain
简短回答
您可以通过继承IGrainWithIntegerKey
并使用密钥0
来创建无状态工作器。
无状态工作线程与正常的粒度相同,但有几个不同之处:
- 它们总是在本地激活(与调用者在相同的筒仓中)。
- 如果对无状态工作者激活的调用增加,可以创建多个激活。
它们遵循相同的去激活语义。
无状态工作者有键可能令人惊讶,但有几个原因可以解释为什么键可能有用:
- 无状态工作线程激活可能有不同的"风味",这可能与它们的键有关。
- 一个更大的无状态工作线程池可以通过一系列的键来寻址来激活。
但是如果这些特性对您没有用处,惯例是使用0
键
- 它们只能从筒仓内部调用。
StatelessWorker粒度可以从客户端调用。这实际上是一种流行的场景,当来自客户端的调用在可以路由到其他粒度进行实际处理之前应该进行预处理。