如何触发奥尔良谷物重新激活?

Jon*_*llo 0 .net orleans

如果我必须对奥尔良 Grains 集后面的持久层执行操作,如何确保受影响的 Grains 可以根据更新的数据重新激活?

我的示例是,我有一个 Employee 记录级别的 Grain(EmployeeID 作为 Grain ID),我需要对某些记录执行批量操作。显然,重要的是我确保在此操作后谷物重新加载到该状态。

我创建了一个奥尔良粮仓,用于执行各种操作,包括员工变更操作。我正在使用 GetGrain 功能,如下所示

var employeeGrain = _clusterClient.GetGrain<IEmployeeGrain>(employeeId, "employee");
Run Code Online (Sandbox Code Playgroud)

该颗粒在根据标准奥尔良生命周期使用时将保持活跃状态​​。我的问题是,如果我故意执行更改基础数据的操作,如何触发受影响的颗粒重新激活?

来自官方文档 https://dotnet.github.io/orleans/1.5/Documentation/Advanced-Concepts/Activation-Garbage-Collection.html

看来你可以强制单个颗粒停用

this.DeactivateOnIdle()
Run Code Online (Sandbox Code Playgroud)

但是,如果我进行更大的操作,我想避免对每粒颗粒都这样做吗?我想理想情况下回收特定类型的所有谷物。

Tse*_*eng 5

该颗粒在根据标准奥尔良生命周期使用时将保持活跃状态​​。我的问题是,我是否故意执行更改基础数据的操作......

我认为你没有完全理解奥尔良是如何运作的。您不允许在不经过粒度的情况下更改底层数据,这就是它的全部单点。如果这样做,您就违反了奥尔良授予您的“单线程执行”承诺。

对我来说,你似乎仍然坚持旧的非演员模式的思维方式。

对于 Orleans(或一般的 actor 模式),颗粒只需要通过 actor 本身进行修改。只有这样才能提供这种保证。

同样,参与者也充当一种热缓存,其中最近访问的参与者状态将保留在内存中并且不需要任何数据库。这是可行的,因为grain仅由单个筒仓中的单个线程处理,这意味着状态不能同时被多个线程更改(因此不需要同步或锁定)。

“单线程执行”保证一个参与者在任何给定时间只能由单个线程执行。这使得 Orleans 能够无限扩展,因为不存在并发问题(但是,您仍然可能会遇到grain A 尝试访问grain B 的死锁,而grain B 尝试访问grain A 并且该方法未标记为可重入) 。

...如何触发受影响的谷物重新激活?

当然,您可以重新启动筒仓集群作为离线迁移(到新数据模型)的一部分,但我宁愿再次小心这一点,更改grain之外的数据可能会破坏任何一致性并保证类不变性这样做。在这种情况下,您关闭集群,更新/迁移现有数据,部署新版本的软件,然后使用更新的模型启动集群。

或者,如果您的 Grain 不保留任何状态(无状态),您可以在停用后以具有特定生存时间的无状态 Grain 运行,并且它们的状态将在下次激活时更新。这在 Orleans 用作热缓存的情况下效果很好(即运行搜索操作并将结果缓存一点以减少数据库命中)