【发布时间】:2016-08-22 15:14:27
【问题描述】:
我的 Service Fabric 演员可以在其工作期间在内存中创建一些大型数据结构。我不想在每个方法调用结束时更新可靠的集合。 我可以仅在 OnDeactivateAsync 方法中通过 StateManager 保存我的演员状态并在 OnActivateAsync 方法中恢复它吗?在这种情况下我可以失去状态吗?
【问题讨论】:
-
您是否担心垃圾收集器会收集存储在 Actor 对象中但不在 Actor 状态中的变量?或者您不确定是否可以更改 OnDeactivateAsync 和 OnActivateAsync 中的状态?
-
@cassandrad 我知道可以在 OnDeactivateAsync 中保存状态,但是否推荐在代码中保存状态?我以前每次更改状态时都会保存状态,但我认为当方法调用频繁且状态大小很大时,这种方法会在集群上造成低效负载。
-
如果参与者或其底层服务或节点崩溃,您将丢失数据。如果您可以负担松散状态或可以在 Actor ActivateAsync 上重建它,您可以将该结构保留为类成员。 (就像在普通的 poco 中一样)
-
@LoekD 这很正确,您应该将其发布为答案。
-
itellisense 工具提示告诉“不应从此方法调用状态更改等 Actor 操作”。而且我这样做时也会遇到不一致的行为。