[英]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.