本人也是英文盲,翻譯不對的地方請諒解。由於翻譯內容較多,會慢慢更新 orleans簡稱ol,一些專用詞不做翻譯。先決條件,讀這表文章之前需要瞭解:actor,es,cqrs 參考鏈接: https://www.cnblogs.com/netfocus/p/4150084.html http://ww ...
本人也是英文盲,翻譯不對的地方請諒解。由於翻譯內容較多,會慢慢更新
orleans簡稱ol,一些專用詞不做翻譯。先決條件,讀這表文章之前需要瞭解:actor,es,cqrs
參考鏈接:
https://www.cnblogs.com/netfocus/p/4150084.html
http://www.infoq.com/cn/articles/microservices-aggregates-events-cqrs-part-1-richardson
https://studygolang.com/articles/6250
一.基礎開始:
1.使用ol的必要條件:ol是一個來自NuGet的類庫。你需要 .NET Core 2.0以上和.NET Framework 4.6.1以上版本才能使用它。在.net core 下ol可以在windows,Linux,MacOS下運行。
目前ol是在windows上測試的,但是許多用戶在非Windows平臺上也成功運行了ol。
開發工具,建議使用Visual Studio 2017或更高版本。
在生產環境中,為了維護可靠的集群成員關係,ol需要持久化存儲。你可以選擇以下其中一種
Azure Table Storage 8.2.1或以上版本
SQL Server 2008或以上版本
ZooKeeper 3.4.0或以上版本
MySQL 5.0或以上版本
PostgreSQL 9.5或以上版本
Consul 0.7.0或以上版本
DynamoDB
還有一種辦法是使用Azure的service fabric
2.Grains
grains是ol編程模型的關鍵,grains構成了ol應用,它是隔離的,持久的,分佈的。grain就好比.net中的實體對象。grain之間可以通過介面相互調用。
ol的目標是大大簡化構建可伸縮應用程式的難度,並避免了大多數併發性問題,grain之間不共用事例,只能通過消息傳遞。每個grain保證單線程運行
一個典型grain有狀態和行為(例如特定的用戶或方法或會話)
每一個grain都有一個唯一標識,也稱為grain主鍵。主鍵可以試long,string ,guid。
如何訪問一個grain
一個grain類實現一個或多個grain介面,要調用一個grain,調用者需要知道grain類實現的介面,該介面包括調用者想要調用的方法和目標grain的唯一標識。
例如,如果使用電子郵件作為唯一標識,則可以調用用戶配置grain來更新用戶地址。
var user = grainFactory.GetGrain<IUserProfile>(userEmail); await user.UpdateAddress(newAddress);
GetGrain的調用是一種廉價的本地操作,用於構建對目標grain的引用。註意,不需要創建或實例化目標grain,我們調用usergrain來更新地址,就好像usergrain已經實例化了。
這是ol編程模型的最大優勢之一我們從來不需要創建、實例化或刪除grain。可能有數百萬的grain在記憶體中等待我們調用它,在內部ol能通過一系列複雜的操作來把grain載入到記憶體中。
grain的生命周期
grain在執行容器里,叫做silo。silo形成一個集群,將多個物理或虛擬機的資源組合在一起,當有對grain請求時,ol確保在集群中的一個silo上有該穀物的實例。如果任何silo上沒有grain實例,ol記憶體管理將創建一個。這個過程叫做激活。
如果grain使用了持久化,在激活時自動從存儲器讀取狀態。一旦在silo上激活,grain處理來自其他grain或來自前端web伺服器的傳入請求。在處理請求的過程中,grain可以調用其他grain。
如果一個grain停止接收請求並保持空閑,在一段不活動時間後,ol將grain從記憶體中刪除(使其失效),以釋放資源用於其他grain。如果並且當有一個新的grain請求時,ol會再次激活它,可能是在一個不同的silo上激活,
所以調用者會有這樣的感覺,grain會一直留在記憶體中。grain經歷了生命周期,從僅作為其存儲中的持久化狀態(如果有的話)存在,到在記憶體中實例化,到從記憶體中刪除。
ol能隱式控制grain的激活和停用過程,應此在編寫一個grain時,開發人員假設所有gain都被激活。
grain生命周期中的關鍵事件順序是這樣的:
一個grain或一個客戶端調用另一個grain的方法
grain被激活(如果它還沒有在集群中的某個地方被激活的話),grain類的一個實例被創建,稱為grain激活
grain的構造函數使用依賴註入(如果適用)來執行,如果聲明瞭持久性,則從存儲中讀取grain的狀態
如果重寫,則調用OnActivateAsync(此方法在grain激活時會被調用)
grain處理傳入的請求
grain閑置了一段時間
silo記憶體管理決定停用grain
如果重寫OnDeactivateAsync,則調用OnDeactivateAsync(此方法在grain停用時會被調用)
silo記憶體管理從記憶體中刪除穀物
當一個silo被正確的關閉時,它所擁有的所有grain激活都被停用。