erlang 如何确保奥尔良谷物的一致性?

dy2hfwbg  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(186)

在Erlang中,你可以在生成actor时将初始状态传递给它。这样你就不需要处理将actor再次带到其初始状态的init消息,或者需要init消息的消息在之前到达。在orleans中,假设颗粒总是存在,你不能使用构造函数。有没有什么方法可以将初始状态传递给颗粒,从而避免任何需要在任何其他方法之前调用而破坏一致性的init方法?
当我说“把actor带到它的初始状态”时,我的意思是,在orleans的上下文中,调用特定粒度激活的init方法两次。这就像覆盖状态。可能你需要这个重置状态的消息之王,但如果你不需要它,这是一个陷阱,一个潜在的bug来源。
我正在寻找某种类型的构造函数,类似于erlang中的spawn(module, function, [initial state])。我的第一个尝试是寻找任何具有以下签名的GetGrain重载:GrainFactory.GetGrain<IGrain>(id, initialState);

mutmk8jj

mutmk8jj1#

正如@svick所建议的,OnActivateAsync是加载晶粒初始状态的最佳方法。

public class ExampleGrain : Orleans.Grain, IExampleGrain
 {

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

 ...

每次初始化晶粒时都会调用这个方法(不仅仅是第一次)。您可以使用Orleans中内置的持久性基础结构来记录晶粒是否已经在之前创建过(可能使用状态类上的布尔属性),即:

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();
    }

有关持久性的详细信息,请参见本教程:
http://dotnet.github.io/orleans/Tutorials/Declarative-Persistence.html

nvbavucw

nvbavucw2#

Grains in Orleans are always exist, so you with your approach are going to [conditionally] re-initialize the grain every time when it gets activated. Is this really what you want to be done?
Well, if you really need to initialize the specific grain to the specific state, then you can use its key (string key or string part of the key) to pass in some json. Just remember that the key has some limitations for its size.

相关问题