微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

如果我必须在一组奥尔良谷物后面的持久层上执行操作,如何确保受影响的那些谷物可以针对更新的数据重新激活?

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

我创建了一个带有谷物的奥尔良筒仓,以执行各种操作,包括员工更换。我正在使用以下GetGrain功能

var employeeGrain = _clusterClient.GetGrain<IEmployeeGrain>(employeeId,"employee");

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

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

看来您可以强迫单个谷物停用

this.DeactivateOnIdle()

但是,如果我做较大的手术,我想避免每粒这样做吗?我想理想的是回收所有特定类型的谷物。

解决方法

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

我认为您尚未完全了解奥尔良的工作方式。不允许更改不带纹理的基础数据,这就是其全部要点。如果这样做,您将违反奥尔良授予您的“单线程执行”承诺。

对我来说,您似乎仍然坚持旧的非角色模型思维方式。

对于奥尔良(或通常为演员模式),只需要通过演员本身对谷物进行修改。只有这样才能保证。

同样,actor也是一种热缓存,最近访问的actor状态将保留在内存中,并且不需要任何数据库。之所以可行,是因为谷物只能由单个筒仓中的单个线程处理,这意味着状态永远不能同时由多个线程更改(因此不需要同步或锁定)。>

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

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

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

或者,如果您的谷物不保持任何状态(无状态),则可以在停用后将其作为具有特定生存时间的无状态谷物运行,并且其状态将在下次激活时更新。在Orleans用作热缓存的情况下(例如,用于运行搜索操作并将结果缓存一小段以减少数据库命中),这种方法效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?