Orleans 術語解讀
上面這張圖中包含了Orleans中的幾個核心概念:
- Grain
- Silo
- Orleans Cluster
- Orleans Client
從這張圖愧口,我們應該能理清他們之間的關系。
Grain作為最小的執(zhí)行單元
Silo 是 Grain 的宿主運行環(huán)境垃沦,用來暴露具體的服務
Orleans Server 提供Silo的運行環(huán)境
一個Server可以運行多個Silo服務
多個Silo組成一個Cluster集群
一個Cluster中的Grain是可以直接進行交互
客戶端通過Orleans Client與Cluster建立連接
Orleans 的第一公民:Grain
Grain 簡介
上面已經提到奔誓,Grain是Virtual Actor的具體表現。那如何理解Grain呢。
簡單來說:Grain是一個可尋址的隔離的.NET對象實例剧董。
分解來看:
Grain是一個對象實例:也就是說其是具體的某個Grain Type的一個內存實例兔仰。既然是對象茫负,也就是說Grain可以有自己的狀態(tài)和行為。
隔離的:是指Grain自身的狀態(tài)和行為不受外界干預乎赴。
可尋址:并不是指new一個對象返回的內存引用忍法。如果是在單機環(huán)境,通過內存引用還可以進行直接訪問榕吼。但對于分布式應用饿序,Grain可能分布在集群中的任一機器,簡單的內存引用羹蚣,是無法實現跨機器尋址的嗤堰。
Grain Identity
在面向對象編程中使用new創(chuàng)建對象時,獲取的引用可以表示其標識的實例所有方面度宦。但在分布式系統(tǒng)中踢匣,對象引用不能表示實例標識,因為引用通常僅限于單個地址空間戈抄。
那如何實現分布式環(huán)境Grain的可尋址呢离唬?
那就需要給Grain一個身份,也就是Grain Identity划鸽。以訂單舉例输莺,為了標識某一個具體訂單,我可以賦予訂單一個唯一的訂單編號裸诽,通過這個編號就可以找到具體的某個訂單嫂用。
Grain Identity 也就是這種思路。通過給Grain打上邏輯身份標識丈冬,一方面可以完成可尋址(方便其他Grain或Client進行調用)嘱函,一方面確保同一個Grain在集群中能夠按需創(chuàng)建。(單例埂蕊、多例往弓、指定數量的實例)。
默認grain 的身份標識可以是:
long
GUID
string
GUID + string
long + string
所以基于GrainType和Grain Identity就可以得到集群中唯一確定的Grain蓄氧。即 Unique Grain = Grain Type + Grain Identity函似。
Grain Lifecycle
Grain 的生命周期是由Silo管理的。主要分為以下幾個階段:
- 其他Grain或Client調用目標Grain
- Silo運行時去激活Grain (若Grain是有狀態(tài)的喉童,激活時會同時恢復狀態(tài))
- Grain處理調用請求
- Grain閑置
- Silo運行時決定是否銷毀Grain
- 銷毀Grain撇寞,從內存中移除(若Grain是有狀態(tài)的,則需要先持久化Grain的狀態(tài),以便下次激活時恢復狀態(tài))
Grain的運行環(huán)境: Silo
Grain作為Orleans中的最小執(zhí)行單元蔑担,需要一個運行環(huán)境運行以暴露服務露氮,而Silo就是這樣一個角色存在。如果說Grain是最小粒度的執(zhí)行單元钟沛,那么Silo就是最小的向外提供服務的執(zhí)行單元畔规。Silo通過將相關Grain進行組裝,暴露一組服務恨统,并在運行時管理Grain的生命周期叁扫。
Silo的宿主:Orleans Server
Silo本質上是一個進程單元,是需要運行在操作系統(tǒng)之上的畜埋,因為.NET Core的跨平臺特性莫绣,所以可以運行在Windows、Linux或Mac系統(tǒng)中悠鞍,當然也可以運行在相應的容器中对室。所以Orleans Server就是為Silo提供運行環(huán)境的宿主。
Silo的集群: Orleans Cluster
這里需要澄清一點咖祭,因為一個Orleans Server可以運行不同集群的Silo掩宜,所以Orleans Cluster 并非是指多個Orleans Server 組成的集群,而是指多個Silo(具有相同的ClusterId)組成的集群么翰。Orleans通過內置的成員協議提供集群管理牺汤,我們有時將其稱為Silo Membership。該協議的目標是讓所有Silo(Orleans Server)就當前活動的Silo集合達成一致浩嫌,檢測故障Silo檐迟,并允許新的Silo加入集群。