如何确保谷物的一致性?

Gui*_*lez 5 c# erlang actor orleans

在erlang中,你可以在产生它时将初始状态传递给actor.这样您就不需要处理init消息,这些消息会将actor再次置于初始状态,或者需要init消息之前到达的消息.在奥尔良,假设谷物总是存在,你不能使用构造函数.有没有办法将初始状态传递给grain,从而避免任何init方法通过在任何其他方法之前调用它来破坏一致性?

当我说"把演员带到它的初始状态"时,我的意思是,在奥尔良语境中,调用特定粒子激活的init方法两次.这就像覆盖国家.也许你需要这个重置状态的消息之王,但如果你不需要它,那就是一个陷阱,一个潜在的错误来源.

我正在寻找某种类型的构造函数,类似于spawn(module, function, [initial state])erlang.我的第一次尝试是使用以下签名寻找GetGrain的任何重载:GrainFactory.GetGrain<IGrain>(id, initialState);

Ric*_*ury 5

正如@svick 所建议的那样,OnActivateAsync是加载谷物初始状态的最佳方法。

 public class ExampleGrain : Orleans.Grain, IExampleGrain
 {

   public override Task OnActivateAsync()
   {
        // set initial state for grain
        return base.OnActivateAsync();
    }

 ...
Run Code Online (Sandbox Code Playgroud)

每次初始化谷物时都会调用此方法(不仅仅是第一次)。您可以使用 Orleans 中内置的 Persistence 基础结构来记录之前是否已创建谷物(可能使用状态类上的布尔属性),即

public class ExampleGrainState : GrainState
{
    public bool Initialised { get; set; }
}

[StorageProvider(ProviderName = "Storage")]
public class QuadKeyGrain : Orleans.Grain<ExampleGrainState>, IExampleGrain
{
    public override async Task OnActivateAsync()
    {
        if (!this.State.Initialised)
        {
            // do initialisation 
            this.State.Initialised = true;
            await this.WriteStateAsync();
        }
        await base.OnActivateAsync();
    }
Run Code Online (Sandbox Code Playgroud)

有关持久性的更多信息,请参阅本教程:

http://dotnet.github.io/orleans/Tutorials/Declarative-Persistence.html