無狀態背景工作粒紋

根據預設,Orleans 執行階段不會在叢集內建立一個以上的粒紋啟用。 這是 Virtual Actor 模型最直覺的運算式,每個粒紋都對應至具有唯一類型/身分識別的實體。 不過,應用程式也會需要執行未繫結至系統中特定實體的功能無狀態作業。 例如,如果用戶端傳送需要解壓縮的壓縮承載要求,才能將其路由傳送至目標粒紋以進行處理,此類解壓縮/路由邏輯不會繫結至應用程式中的特定實體,且可以輕鬆地向外延展。

StatelessWorkerAttribute 套用至粒紋類別時,其會向 Orleans 執行階段指出該類別的粒紋應該視為無狀態背景工作角色粒紋。 無狀態背景工作角色粒紋具有下列屬性,讓其執行與一般粒紋類別的執行非常不同。

  1. Orleans 執行階段可以在叢集的不同定址接收器上建立無狀態背景工作角色粒紋的多個啟用。
  2. 只要尋址接收器相容,對無狀態背景工作粒紋所做的要求就會在本機執行,因此它們不會產生網路或序列化成本。 如果本機尋址接收器不相容,要求會轉送至相容的尋址接收器。
  3. 如果已存在的背景工作角色粒紋忙碌中,Orleans 執行階段會自動建立無狀態背景工作角色粒紋的其他啟用。 除非選擇性 maxLocalWorkers 引數明確指定,否則執行階段在每個定址接收器所建立的最大無狀態背景工作角色粒紋啟用數目依預設會受限於電腦上的 CPU 核心數目。
  4. 由於 2 和 3,無狀態背景工作角色粒紋啟用無法個別定址。 對無狀態背景工作角色粒紋的後續兩個要求,可能會由不同的啟用來處理。

無狀態背景工作角色粒紋可讓您直接建立自動管理的粒紋啟用集區,以根據實際負載自動相應增加和減少。 執行階段一律會以相同順序掃描可用的無狀態背景工作角色粒紋啟用。 因此,其一律會將要求分派至第一個閒置的本機啟用,且只有在所有先前的啟用都忙碌時,才會到達最後一個。 如果所有啟用都在忙碌中,且尚未達到啟用限制,則其會在清單結尾建立一個以上的啟用,並分派要求。 這表示當無狀態背景工作角色粒紋的要求率增加,而現有的啟用目前都忙碌中時,執行階段就會將其啟用集區擴充到限制為止。 相反地,當負載下降,且可以由較少的無狀態背景工作角色粒紋啟用來處理時,清單結尾的啟用將不會收到分派來的要求。 這些啟用將會變成閒置狀態,而最後會由標準啟用收集程序停用。 因此,啟用的集區最終會縮小以符合負載。

下列範例會定義具有預設最大啟用數目限制的無狀態背景工作角色粒紋類別 MyStatelessWorkerGrain

[StatelessWorker]
public class MyStatelessWorkerGrain : Grain, IMyStatelessWorkerGrain
{
    // ...
}

呼叫無狀態背景工作角色粒紋與任何其他粒紋相同。 唯一的差異在於,在大部分情況下,系統會使用單一粒紋識別碼,例如 0Guid.Empty。 當有多個無狀態背景工作角色粒紋集區時,可以使用多個粒紋識別碼,理想是每個識別碼一個。

var worker = GrainFactory.GetGrain<IMyStatelessWorkerGrain>(0);
await worker.Process(args);

這一個會定義無狀態背景工作角色粒紋類別,每個定址接收器不會有一個以上的粒紋啟用。

[StatelessWorker(1)] // max 1 activation per silo
public class MyLonelyWorkerGrain : ILonelyWorkerGrain
{
    //...
}

請注意,StatelessWorkerAttribute 不會變更目標粒紋類別的重新進入。 如同任何其他粒紋一樣,無狀態背景工作角色粒紋預設為非重新進入。 您可以將 ReentrantAttribute 新增至粒紋類別,以明確地使其重新進入。

州/省

「無狀態背景工作角色」的「無狀態」部分並不表示無狀態背景工作角色不能有狀態,而是僅限於執行功能性作業。 如同任何其他粒紋一樣,無狀態背景工作角色粒紋可以透過其任何所需的狀態載入並保留在記憶體中。 這是因為可以在叢集的相同和不同定址接收器上建立無狀態背景工作角色粒紋的多個啟用,因此無法輕易地協調不同啟用所持有的狀態。

數個實用的模式牽涉到無狀態背景工作角色保留狀態。

相應放大經常性儲存層快取項目

針對體驗高輸送量的經常性快取層項目,將每個此類項目保持在無狀態背景工作角色粒紋中,即可:

  1. 在定址接收器內,以及跨叢集中的所有定址接收器自動相應放大,以及;
  2. 讓資料一律可在接收用戶端要求的定址接收器上透過其用戶端閘道本機取得,以便可以在沒有額外的網路躍點的情況下回應對另一個定址接收器的要求。

減少樣式彙總

在某些情況下,應用程式必須計算叢集中特定類型所有粒紋的特定計量,並定期報告彙總。 範例是報告每個遊戲地圖的數個玩家、VoIP 通話的平均持續時間等等。如果數千個或數百萬個粒紋要將其計量報告給單一全域彙總工具,彙總工具就會立即超載,而無法處理報告的溢流。 替代方法是將此工作轉換為 2 個 (或更多) 步驟,以減少樣式彙總。 第一層彙總是透過報告粒紋以將其計量傳送至無狀態背景工作角色預先彙總粒紋來完成。 Orleans 執行階段會自動為每個定址接收器建立無狀態背景工作角色粒紋的多個啟用。 由於所有此類呼叫都會在本機處理,且不會對訊息進行遠端呼叫或序列化,因此此類彙總的成本將會大幅低於遠端案例。 現在,每個預先彙總無狀態背景工作角色粒紋啟用、獨立或與其他本機啟用協調,都可以將其彙總報告傳送至全域最終彙總工具 (或視需要傳送至另一個縮減層),而不會使其多載。