上面這張圖中包含了Orleans中的幾個核心概念:編程
從這張圖,咱們應該能理清他們之間的關係。分佈式
Grain做爲最小的執行單元ide
Silo 是 Grain 的宿主運行環境,用來暴露具體的服務操作系統
Orleans Server 提供Silo的運行環境server
一個Server能夠運行多個Silo服務對象
多個Silo組成一個Cluster集羣blog
一個Cluster中的Grain是能夠直接進行交互生命週期
客戶端經過Orleans Client與Cluster創建鏈接進程
上面已經提到,Grain是Virtual Actor的具體表現。那如何理解Grain呢。ip
簡單來講:Grain是一個可尋址的隔離的.NET對象實例。
分解來看:
Grain是一個對象實例:也就是說其是具體的某個Grain Type的一個內存實例。既然是對象,也就是說Grain能夠有本身的狀態和行爲。
隔離的:是指Grain自身的狀態和行爲不受外界干預。
可尋址:並非指new一個對象返回的內存引用。若是是在單機環境,經過內存引用還能夠進行直接訪問。但對於分佈式應用,Grain可能分佈在集羣中的任一機器,簡單的內存引用,是沒法實現跨機器尋址的。
在面向對象編程中使用new建立對象時,獲取的引用能夠表示其標識的實例全部方面。但在分佈式系統中,對象引用不能表示實例標識,由於引用一般僅限於單個地址空間。
那如何實現分佈式環境Grain的可尋址呢?
那就須要給Grain一個身份,也就是Grain Identity。以訂單舉例,爲了標識某一個具體訂單,我能夠賦予訂單一個惟一的訂單編號,經過這個編號就能夠找到具體的某個訂單。
Grain Identity 也就是這種思路。經過給Grain打上邏輯身份標識,一方面能夠完成可尋址(方便其餘Grain或Client進行調用),一方面確保同一個Grain在集羣中可以按需建立。(單例、多例、指定數量的實例)。
默認grain 的身份標識能夠是:
long
GUID
string
GUID + string
long + string
因此基於GrainType和Grain Identity就能夠獲得集羣中惟一肯定的Grain。即 Unique Grain = Grain Type + Grain Identity。
Grain 的生命週期是由Silo管理的。主要分爲如下幾個階段:
Grain做爲Orleans中的最小執行單元,須要一個運行環境運行以暴露服務,而Silo就是這樣一個角色存在。若是說Grain是最小粒度的執行單元,那麼Silo就是最小的向外提供服務的執行單元。Silo經過將相關Grain進行組裝,暴露一組服務,並在運行時管理Grain的生命週期。
Silo本質上是一個進程單元,是須要運行在操做系統之上的,由於.NET Core的跨平臺特性,因此能夠運行在Windows、Linux或Mac系統中,固然也能夠運行在相應的容器中。因此Orleans Server就是爲Silo提供運行環境的宿主。
這裏須要澄清一點,由於一個Orleans Server能夠運行不一樣集羣的Silo,因此Orleans Cluster 並不是是指多個Orleans Server 組成的集羣,而是指多個Silo(具備相同的ClusterId)組成的集羣。Orleans經過內置的成員協議提供集羣管理,咱們有時將其稱爲Silo Membership。該協議的目標是讓全部Silo(Orleans Server)就當前活動的Silo集合達成一致,檢測故障Silo,並容許新的Silo加入集羣。