1. 程式人生 > >Orleans 2.0官方文件(閆輝的個人翻譯)——1.2 常見問題

Orleans 2.0官方文件(閆輝的個人翻譯)——1.2 常見問題

常見問題

可用性

我可以在專案中自由使用奧爾良嗎?

當然可以。原始碼已在MIT許可釋出。NuGet包釋出在nuget.org上

Orleans準備用於生產了嗎?我聽說這是一個研究專案。

事實上,Orleans最初是作為微軟研究院的研究專案開始的。它後來發展成為一種產品,並自2011年起在微軟內部用於生產,並在2015年公開發布後被其他公司用於生產。Orleans無疑已經是生產就緒,併為許多高可用性系統和雲服務提供支援。

微軟是否支援奧爾良?

Orleans的原始碼已經在GitHub上的MIT許可下釋出。微軟繼續投資Orleans並接受社群對程式碼庫的貢獻。

定位

Orleans是伺服器產品嗎?我如何經營Orleans?

Orleans是一個框架,一組庫,可以幫助您構建應用程式。基於Orleans的應用程式可以在各種託管環境,雲中或本地群集中執行,甚至可以在單臺機器上執行。應用程式開發人員有責任在其目標託管環境中構建,部署和執行基於Orleans的應用程式。

我在哪裡可以跑Orleans?

Orleans可以在任何可以執行.NET應用程式的環境中執行。在Orleans 2.0之前,它需要完整的.NET Framework。從2.0開始,Orleans符合.NET Standard 2.0,因此可以在Windows和支援.NET Core的非Windows環境中的.NET Core上執行。

Orleans是否為Azure而構建?

不。我們相信您應該能夠按照您需要的方式在任何地方經營Orleans。Orleans非常靈活,有許多可選的提供程式可以幫助在雲環境中託管它,例如Azure,AWS或GCP,或者在本地叢集上,可以選擇支援Orleans叢集協議的技術。

Orleans和其他Actor語言和框架有什麼區別,比如Erlang或Akka?

雖然基於Actor模型的相同基本原則,Orleans向前邁進了一步,並引入了虛擬Actor的概念,極大地簡化了開發人員的體驗,更適合雲服務和大規模系統。

Microsoft有另一個Actor模型實現 - Azure Service Fabric Reliable Actors。我如何在兩者之間做出選擇?

可靠的Actors與Service Fabric緊密整合,以利用其核心功能,例如複製的群集記憶體儲。Orleans具有更豐富的功能集,不依賴於任何特定的託管平臺,並且幾乎可以在任何環境中執行。Orleans提供了一個可選的整合包,用於在Service Fabric中託管Orleans應用程式。

最後,應用程式開發人員決定從可靠的Actors與Service Fabric的底層平臺的緊密整合以及在任何地方執行的靈活性和Orleans的功能集中獲益多少。

設計

grain應該在我的應用中有多大或多小?

grain隔離模型使它們非常善於表示獨立的狀態和計算的孤立上下文。在大多數情況下,grain自然地對映到使用者,會話,帳戶等應用程式實體。這些實體通常彼此隔離,可以獨立訪問和更新,並公開一組定義明確的支援操作。這與直觀的“一個實體 - 一個grain”建模很好地配合。

如果應用程式實體封裝太多狀態,則可能太大而無法通過單個grain有效地表示,因此必須處理對它的高請求率。即使單個grain通常每秒可以處理多達幾千個普通的呼叫,但經驗法則是要警惕每秒接收數百個請求的單個grain。這可能是grain過大的跡象,將其分解成一組較小的grain可能會導致更穩定和平衡的系統。

應用程式實體可能太小而不能成為grain,如果這會導致其他grain與其不斷持續互動從而導致過多的訊息傳遞開銷。在這種情況下,使那些緊密相互作用的實體成為單個grain的一部分可能更有意義,這樣它們就可以直接呼叫彼此。

你應該如何避免grain過熱?

grain的吞吐量受其啟用可以執行的單個執行緒的限制。因此,建議避免單個grain收到不成比例的請求或涉及處理對其他grain的請求的設計。有多種模式有助於防止單個grain過載,即使邏輯上它是一箇中心通訊點。

例如,如果grain是一些計數器或統計資料的聚合器,這些計數器或統計資料是由大量grain定期報告的,一種行之有效的方法是增加一定數量的中間聚合器grain,並將每個報告grain(使用鍵或雜湊上的模)分配給中間聚合器grain,使得負載或多或少均勻地分佈在所有中間聚合器grain上,而這些中間聚合器grain又定期將其聚合結果,報告給中央聚合器grain。

單個Orleans叢集可以跨多個數據中心執行嗎?

Orleans叢集目前僅支援一個叢集一個數據中心。作為替代解決方案,從1.3.0開始,您可以考慮進行多叢集部署,其中部署到不同資料中心的叢集形成單個多叢集。

在什麼情況下能發生“大腦分裂”(同時在多個silo中啟用相同的顆粒)?

在正常操作期間,Orleans執行時保證每個grain在叢集中最多隻有一個例項。唯一會違反此保證的情況是,當一個silo發生崩潰或在沒有正確關閉的情況下被殺掉。在這種情況下,有一個大約30秒(基於配置)視窗,其中grain可能會在多個silo中臨時例項化。每個grain被保證收斂到單例項,並且該視窗關閉時,將禁用重複啟用。

您還可以檢視Orleans的論文以獲取更詳細的資訊,但是您無需完全理解它,就能編寫應用程式程式碼。在編寫應用程式時,您只需要考慮擁有兩個Actor例項的罕見可能性。永續性模型保證在這種情況下,不會盲目覆蓋對儲存的任何寫入。

如何

我該如何拆掉grain?

一般來說,不需要應用程式邏輯來強制停用grain,因為Orleans執行時自動檢測並停用grain的空閒啟用,以回收系統資源。讓Orleans這樣做更有效率,因為它批量停用操作而不是逐個執行。在極少數情況下,當您認為確實需要加速一個grain的停用時,該grain可以通過呼叫base.deactivateOnIdle()方法來實現。

我告訴Orleans在哪裡啟用grain嗎?

可以使用限制性放置策略來實現,但我們通常認為這是一種需要仔細考慮的相當高階的模式。通過執行問題所建議的操作,應用程式將承擔資源管理的負擔,而不必充分了解系統的全域性狀態。在silo重啟的情況下——在雲環境中可能會定期進行作業系統打補丁,這尤其會適得其反。因此,特定放置可能會對應用程式的可伸縮性,以及對系統故障的恢復能力產生負面影響。

話雖如此,對於應用程式確實知道應該啟用特定grain的罕見情況,例如,如果它知道grain持久狀態的位置,在1.5.0中我們引入了自定義放置策略和導向器。

你如何修改grain或新增新的grain類和介面?

您可以將具有新grain類或現有grain類的新版本的silo新增到正在執行的叢集中。

 

可以從公共網際網路連線到Orleans silo嗎?

Orleans被設計為作為服務的後端部分進行託管,您需要建立外部客戶端將連線的前端層。它可以是基於HTTP的Web API專案,套接字伺服器,SignalR伺服器或其他符合應用程式需求的東西。如果將Silo的TCP端點暴露給它,則可以從Internet連線到Orleans,但從安全形度來看,這不是一個好的實踐。

如果一個Silo在我的grain返回呼叫後的響應之前發生故障,會發生什麼情況?

如果在grain呼叫過程中silo發生故障,您將收到一個異常,您可以在程式碼中捕獲並重試,或者根據應用程式邏輯執行其他操作來處理錯誤。隨著silo失敗的grain將在下次呼叫時自動重新例項化。Orleans執行時不會急切地從故障silo中重新建立grain,因為許多grain可能不會立即或完全被需要。相反,執行時僅在針對特定grain的新請求到達時,單獨地重新建立此類grain。對於每種grain,它選擇一個可用的筒silo作為新的主機。

這種方法的好處是,僅對實際使用的grain執行恢復過程,並且它會及時地在所有可用的silo中被傳播,這提高了系統的響應性和恢復速度。另請注意,在silo故障和Orleans叢集檢測到故障之間存在延遲。延遲是檢測速度和誤報概率之間的可配置權衡。在此過渡期間,對grain的所有呼叫都將失敗,但在檢測到失敗後,grain將在新的呼叫時在另一個silo上建立,因此它最終將可用。

如果grain呼叫執行時間過長,會發生什麼?

由於Orleans使用合作多工模型,它不會自動搶佔grain的執行,但Orleans會為長時間執行的grain呼叫生成警告,以便您可以檢測到它們。與搶佔式多工相比,協作式多工處理具有更好的吞吐量。請記住,grain呼叫不應同步執行任何長時間執行的任務(如IO操作),也不應阻塞其他要完成的任務。所有等待都應該使用await關鍵字或其他非同步等待機制非同步完成。grain應該儘快返回,讓其他grain執行以獲得最大吞吐量。