異質性定址接收器概觀

在指定的叢集上,定址接收器可以支援不同的 Grain 型別組合:

Heterogeneous silos overview diagram.

在此範例中,叢集支援 Grain 型別 ABCDE

  • Grain 型別 AB 可以放置在 Silo 1 和 2 上。
  • Grain 型別 C 可以放置在 Silo 1、2 或 3 上。
  • Grain 型別 D 只可以放置在 Silo 3 上。
  • Grain 型別 E 只可以放置在 Silo 4 上。

所有定址接收器都應該參考叢集中所有 Grain 型別的介面,但 Grain 類別只能由裝載 Grain 類別的定址接收器參考。 用戶端不知道哪個定址接收器支援指定的 Grain 型別。

重要

在支援指定 Grain 型別實作的每個定址接收器上,指定 Grain 型別實作必須相同。

下列為「無效」案例:

在 Silo 1 和 2 上:

public class C: Grain, IMyGrainInterface
{
   public Task SomeMethod() { /* ... */ }
}

在 Silo 3 上:

public class C: Grain, IMyGrainInterface, IMyOtherGrainInterface
{
   public Task SomeMethod() { /* ... */ }
   public Task SomeOtherMethod() { /* ... */ }
}

組態

您不需要任何設定,就可以在叢集中的每個定址接收器上部署不同的二進位檔案。 不過,如有必要,您可以在 TypeManagementOptions.TypeMapRefreshInterval 屬性支援的型別中,變更定址接收器和用戶端檢查變更的間隔。

基於測試目的,您可以使用 GrainClassOptions.ExcludedGrainTypes 屬性,這是您想要在定址接收器上排除的型別名稱清單。

限制

  • 如果支援的 Grain 型別組合有變更,已連線的用戶端將不會收到通知。 在上述範例中:
    • 如果 Silo 4 離開叢集,用戶端仍會嘗試呼叫 Grain 型別 E。 這會在執行階段失敗,擲回 OrleansException
    • 如果用戶端在 Silo 4 加入叢集之前已連線至叢集,則用戶端將無法呼叫 Grain 型別 E。 這會失敗,擲回 ArgumentException
  • 不支援無狀態 Grain:叢集中的所有定址接收器都必須支援相同的無狀態 Grain 組合。
  • 不支援 ImplicitStreamSubscriptionAttribute,因此 Orleans Streams 中只能使用明確訂閱