簡體   English   中英

Service Fabric參與者中的靜態對象

[英]Static objects in Service Fabric actors

有一個具有以下定義的服務結構IRemindable通過實現IRemindable接口可以注冊然后取消注冊。 該演員也有一個靜態字典。

[StatePersistence(StatePersistence.None)]
[ActorService(Name = "ProcessorActorService")]
public class ProcessorActor : BaseActor, IRemindable
{
 private static Dictionary<object,object> _myDictionary;

}

我的理解是,如果每個參與者的GUID在實例化時都不同,那么服務結構將創建同一參與者的多個實例。 在創建每個actor實例時,提醒動作將一個對象添加到字典中以供以后處理。

我的期望/理解是,字典的作用域在同一個實例化的actor中,但是當下一個actor的實例出現時,我意識到_myDictionary具有在另一個actor中添加的節點! 因此,給人的印象是該詞典在同一參與者類型的所有活動實例之間共享! 是再次呼喚正確的認識還是已經被實例化的演員?

由於actor實現了IRemindable我希望GC在注銷集群后將其從集群中刪除,但似乎沒有發生。 靜態字典是否可能導致參與者的實例出現問題?

我認為這更多是.Net問題而不是Service Fabric問題。 據我所知,僅在收集AppDomain之后 (通常在進程終止時)才收集靜態實例。

看一下垃圾收集的基礎知識,了解如何以及何時收集實例。

關於如何維護狀態,建議您看一下Service Fabric可靠角色簡介 ,它可能會幫助您實現所需的目標。

更新資料

另外,請參閱可靠參與者狀態管理

希望能幫助到你!

我的理解是,如果每個參與者的GUID在實例化時都不同,那么服務結構將創建同一參與者的多個實例。

這是對的。 每個新的ID都會生成Actor的新實例。


文檔

使用static修飾符聲明一個靜態成員,該成員屬於類型本身而不是特定對象。

當聲明private static Dictionary<object,object> _myDictionary; 作為靜態,您要告訴CLR該字段不屬於該對象的實例,而是屬於類型定義,在這種情況下,它將生成一個屬於Actor類型的實例,而不是由該Actor創建和銷毀的對象。運行。

保存角色狀態的正確方法是使用狀態管理器,如下所示:

[StatePersistence(StatePersistence.Persisted)]
class MyActor : Actor, IMyActor
{
  public MyActor(ActorService actorService, ActorId actorId)
    : base(actorService, actorId)
  {
  }

  public Task<int> GetCountAsync()
  {
    return this.StateManager.GetStateAsync<int>("MyState");
  }
} 

文檔對其進行了更詳細的說明。

暫無
暫無

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

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