Grain 協調屬性
開發人員可以指定叢集應如何協調其有關特定 Grain 類別的 Grain 目錄和時機。 GlobalSingleInstanceAttribute 表示我們希望行為與在單一全域叢集中執行 Orleans 時相同:也就是,將所有呼叫路由傳送至單一啟動的 Grain。 相反地,[OneInstancePerCluster]
屬性表示每個叢集都可以有其獨立的啟動。 如果叢集之間不需要通訊,這是適當的做法。
這些屬性會在實作 Grain 時發生。 例如:
using Orleans.MultiCluster;
[GlobalSingleInstance]
public class MyGlobalGrain : Orleans.Grain, IMyGrain
{
// ...
}
[OneInstancePerCluster]
public class MyLocalGrain : Orleans.Grain, IMyGrain
{
// ...
}
如果 Grain 類別未指定其中一個屬性,則預設為 OneInstancePerClusterAttribute,或如果將設定參數 GlobalConfiguration.UseGlobalSingleInstanceByDefault 設定為 true
,則預設為 GlobalSingleInstanceAttribute。
適用於全域單一執行個體 Grain 的通訊協定
存取全域單一執行個體 (GSI) Grain 且已知沒有啟動存在時,會先執行特殊的 GSI 啟動通訊協定,再啟動新的執行個體。 具體來說,要求會傳送至目前多叢集設定中的所有其他叢集,檢查這些叢集是否有此 Grain 的啟動。 如果所有回應皆否,則在此叢集中建立新的啟動。 否則,會使用遠端的啟動 (並在本機目錄中快取該啟動的參考)。
適用於一個叢集一個執行個體 Grain 的通訊協定
一個叢集一個執行個體的 Grain 之間不會進行叢集內通訊。 這些 Grain 只會在每個叢集內部獨立使用標準的 Orleans 機制。 在 Orleans 架構本身內部,以 OneInstancePerClusterAttribute 標示的 Grain 類別如下:
ManagementGrain
SystemTargetBasedMembershipTable
GrainBasedReminderTable
不確定的啟動
如果 GSI 通訊協定在 3 次重試 (或設定參數 GlobalSingleInstanceNumberRetries 指定的任何數字) 後仍未收到來自所有叢集的最終回應,通訊協定會樂觀地在本機建立新的「不確定」啟動,優先達到可用性而非一致性。
不確定的啟動可能會有重複 (因為在 GSI 通訊協定啟動期間未回應的某些遠端叢集仍可能有此 Grain 的啟動)。 因此,系統定期每隔 30 秒會針對不確定的啟動 (或設定參數 GlobalSingleInstanceRetryInterval 指定的任何間隔) 再次執行 GSI 通訊協定。 這可以確保一旦還原叢集之間的通訊,就可以偵測到並移除重複的啟動。