簡體   English   中英

如何確保奧爾良谷物的一致性?

[英]How can I ensure orleans grain consistency?

在erlang中,您可以在生成它時將初始狀態傳遞給actor。 這樣你就不需要處理 init 消息,這些消息將 actor 再次帶到它的初始狀態,或者需要 init 消息的消息之前到達。 在奧爾良,假設谷物始終存在,您不能使用構造函數。 有什么方法可以將初始狀態傳遞給谷物,從而避免任何需要在任何其他方法之前調用而破壞一致性的 init 方法?

當我說“讓actor進入它的初始狀態”時,我的意思是,在奧爾良上下文中,兩次調用特定grain激活的init方法。 這就像覆蓋狀態。 可能你需要這個重置狀態的消息之王,但如果你不需要它,這是一個陷阱,一個潛在的錯誤來源。

我正在尋找某種類型的構造函數,例如來自 erlang 的spawn(module, function, [initial state]) 我的第一次嘗試是使用以下簽名查找 GetGrain 的任何重載: GrainFactory.GetGrain<IGrain>(id, initialState);

正如@svick 所建議的, OnActivateAsync是加載谷物初始狀態的最佳方法。

 public class ExampleGrain : Orleans.Grain, IExampleGrain
 {

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

 ...

每次初始化谷物時都會調用此方法(不僅僅是第一次)。 您可以使用 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();
    }

有關持久性的更多信息,請參閱本教程:

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

Orleans 中的 Grains 始終存在,因此您的方法將在每次激活時 [有條件地] 重新初始化 Grain。 這真的是你想要做的嗎?

好吧,如果你真的需要將特定的grain初始化到特定的狀態,那么你可以使用它的key(字符串key或者key的字符串部分)傳入一些json。 請記住,密鑰對其大小有一些限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM