異質性定址接收器概觀
在指定的叢集上,定址接收器可以支援不同的 Grain 型別組合:
在此範例中,叢集支援 Grain 型別 A
、B
、C
、D
和 E
:
- Grain 型別
A
和B
可以放置在 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。
- 如果 Silo 4 離開叢集,用戶端仍會嘗試呼叫 Grain 型別
- 不支援無狀態 Grain:叢集中的所有定址接收器都必須支援相同的無狀態 Grain 組合。
- 不支援 ImplicitStreamSubscriptionAttribute,因此 Orleans Streams 中只能使用明確訂閱。