當前位置: 妍妍網 > 碼農

探索 Orleans.NET

2024-06-27碼農


在當今的軟體開發環境中,對可延伸和彈性分布式應用程式的需求激增。現代應用程式必須處理大量數據,保持高可用性,並無縫擴充套件以滿足使用者需求,同時確保強大的效能和可靠性。這種不斷升級的復雜性需要新的框架來簡化開發過程,同時滿足這些嚴格的要求。進入 Orleans.NET ,這是一個旨在提高開發人員生產力並簡化高效能系統建立的Microsoft框架,它透過提供一組強大的抽象、保證和系統服務,從根本上改變開發人員應對分布式應用程式開發挑戰的方式,提供了構建分布式系統的獨特方法。

該框架設計直觀且易於存取,使其成為專家和新手程式設計師的寶貴工具。透過抽象分布式系統的復雜性,Orleans.NET 使開發人員能夠專註於業務邏輯,而不是復雜性的並行性、狀態管理和容錯。這種抽象大大減少了開發時間和精力,從而實作了健壯應用程式的快速叠代和部署。

Microsoft 本身在自己的產品中廣泛使用 Orleans.NET,展示了該框架的可靠性和可延伸性。值得註意的是,Orleans.NET 為 Azure 和 Xbox Live Microsoft多個關鍵服務提供支持,每秒處理數百萬個請求,具有高可用性和高效能。這種內部使用,通常被稱為「狗糧」,確保 Orleans.NET 在實際條件下不斷測試和完善,受益於Microsoft豐富的營運經驗和嚴格的品質標準。

主要特點

Orleans.NET 允許開發人員構建超越單個行程和硬體邊界的應用程式,使用點對點通訊來實作高可用性和彈性。這是透過利用熟悉的 C# 概念和模式來實作的,以簡化開發人員從單伺服器環境遷移到多伺服器環境的過渡,並專註於增強其適用性和易用性的關鍵功能:

  1. 可延伸性 :旨在從單個本地伺服器擴充套件到雲中數百或數千個分布式應用程式。該框架支持彈性縮放,這意味著新主機可以加入集群以承擔額外的負載,而現有主機可以在不中斷應用程式整體功能的情況下離開。

  2. 容錯 :集群自動檢測主機故障,並在其余主機之間重新分配工作負載,確保持續的可用性和可靠性。

  3. 跨平台支持 :可在任何支持 .NET 的地方執行,包括 Linux、Windows 和 macOS。它支持各種托管環境,如 Kubernetes、虛擬機器和平台即服務 (PaaS) 產品/服務,例如 Azure 套用服務和 Azure 容器套用。

  4. 簡化的分布式應用程式開發 :Orleans .NET 的主要目標之一是簡化分布式系統的復雜性。它提供了一組通用的模式和 API,使開發人員能夠構建彈性和可延伸的雲原生服務,而無需管理分布式計算的復雜細節。

  5. 演員模特: 建立在「actor 模型」之上,這是 1970 年代的編程範式。每個參與者(稱為「粒度」)都是一個輕量級、並行、不可變的物件,用於處理狀態和行為,透過異步訊息進行通訊。此模型透過確保參與者無限期存在來增強可伸縮性和容錯能力,即使在伺服器故障期間也是如此。

什麽是Grains?

在 Orleans .NET 中,其架構的基石在於紋理,這是一種復雜而強大的抽象,類似於虛擬角色。顆粒體現了使用者定義的身份、行為和狀態,構成了構建分布式系統的基石。無論由其他 grain 還是外部客戶端呼叫,每個 grain 都遵循特定的介面,例如 IGrainWithGuidKey、IGrainWithIntegerKey 或 IGrainWithStringKey,描述辨識和存取 grain 的機制。

在顆粒領域,能夠容納揮發性和永續性狀態數據,能夠儲存在不同的儲存系統中。這種靈活的設計使顆粒能夠自動分割應用程式狀態,從而增強可延伸性並簡化故障恢復協定。當處於活動狀態時,粒度數據駐留在記憶體中,從而加快了處理速度,最大限度地減少了延遲,並減輕了底層數據儲存的負擔。Orleans執行時巧妙地管理了這種粒度生命周期的編排,根據操作需求在啟用和停用之間無縫切換,從而為開發人員提供了在所有粒度永久記憶體存在的假設下編寫程式碼的奢侈。

除了其理論基礎外,Orleans 還擁有 Mardi Gras .NET 參考應用程式中舉例說明的實際應用程式,其中 Person grain 作為 Orleans 的實用性、易用性和適用性的實際範例脫穎而出,如以下程式碼片段所示:

usingDomain.Interfaces;
namespaceDomain.Grains;
public classPerson(ILogger<Person> logger) : IPerson
{
privatereadonlyILogger _logger = logger;
publicstring Name { get; privateset; } = string.Empty;
publicint Energy { get; privateset; } = 100;
ValueTask<string> IPerson.Do(ActionType action)
{
switch (action)
{
case ActionType.Eat:
Eat();
break;
case ActionType.Drink:
Drink();
break;
case ActionType.Party:
Party();
break;
case ActionType.Sleep:
Sleep();
break;
default:
thrownewArgumentException("Invalid action type.");
}
return ValueTask.FromResult($"{Name} has {Energy} energy left after {action}.");
}
ValueTask<string> IPerson.GetName()
{
return ValueTask.FromResult(Name);
}
Task IPerson.SetName(stringvalue)
{
Name = value;
return Task.CompletedTask;
}
voidEat()
{
_logger.LogInformation($"{Name} is eating.");
Energy += 10;
if (Energy > 100) Energy = 100;
}
voidDrink()
{
if(Energy - 5 <= 0) thrownewInvalidOperationException($"{Name} does not have enough energy to drink.");
_logger.LogInformation($"{Name} is drinking.");
Energy -= 5;
}
voidParty()
{
if(Energy - 20 <= 0) thrownewInvalidOperationException($"{Name} does not have enough energy to party.");
_logger.LogInformation($"{Name} is partying.");
Energy -= 20;
}
voidSleep()
{
_logger.LogInformation($"{Name} is sleeping.");
Energy += 30;
if (Energy > 100) Energy = 100;
}
publicoverridestringToString()
{
return$"{Name} (Energy: {Energy})";
}
}



















什麽是Silos?

Silos是奧爾良框架內谷物的重要容器。作為谷物的執行環境,筒倉促進了谷物的啟用、停用和通訊。在集群中,孤島協同工作,平衡工作負載並確保高效利用資源。它們提供了一個強大的執行時環境,為托管在其中的顆粒提供基本服務,如計時器、永續性、事務等。

谷物是計算的基本單位,依靠孤島來執行和管理它們。筒倉抽象出分布式系統的復雜性,使顆粒能夠像在單個過程中一樣無縫執行。它們透過與集群內的其他筒倉協調來確保谷物的可靠性和可延伸性。透過孤島,顆粒可以異步通訊,從而能夠開發響應迅速且可延伸的應用程式。

孤島在容錯方面也起著至關重要的作用,與其他孤島協作以檢測故障並正常恢復。它們為顆粒提供了彈性環境,即使在節點故障或網路分區的情況下也能確保連續執行。借助孤島,開發人員可以專註於應用程式邏輯,而不必擔心低階基礎架構問題。

簡而言之,孤島是 Orleans 框架的支柱,為 grain 提供執行環境和執行時服務。它們透過抽象出分布式系統的復雜性,支持開發可延伸、容錯的分布式應用程式。透過孤島,顆粒可以在集群內無縫通訊並高效執行,從而確保分布式應用程式的可靠性和響應能力。

在 Orleans 中設定具有孤島的本地集群非常簡單,使開發人員能夠輕松快速地建立用於測試和開發目的的本地集群環境。使用以下程式碼片段,開發人員可以初始化主機生成器,使用 localhost 群集配置 Orleans 思洛記憶體,並指定日誌記錄設定。此設定使 grains 能夠在本地集群中執行,使開發人員能夠專註於編寫應用程式邏輯,而無需擔心分布式系統的復雜性:

usingMicrosoft.Extensions.Hosting;
usingMicrosoft.Extensions.Logging;
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseOrleans(silo =>
{
silo.UseLocalhostClustering()
.ConfigureLogging(logging => logging.AddConsole());
})
.UseConsoleLifetime();
usingIHost host = builder.Build();
await host.RunAsync();

結論

Orleans.NET 確實是一個引人註目的框架,用於構建可延伸且有彈性的分布式應用程式。它的架構以顆粒和筒倉的概念為中心,為開發人員提供了強大的抽象和工具,以簡化開發過程並建立健壯的系統。

Grains 作為虛擬參與者,封裝了行為和狀態,使開發人員能夠專註於定義業務邏輯,而不是管理分布式計算的復雜性。借助 Orleans,可以輕松啟用、停用和通訊谷物,為開發人員提供無縫體驗。

另一方面,筒倉充當奧爾良框架內谷物的執行環境。它們抽象出分布式系統的復雜性,提供基本的執行時服務,並確保顆粒的可靠性和可延伸性。孤島在容錯、檢測故障和正常恢復以保持連續執行方面發揮著至關重要的作用。

由於提供了 API 和配置選項,因此在奧爾良設定具有思洛記憶體的本地集群非常簡單。開發人員可以快速建立用於測試和開發目的的本地集群環境,使他們能夠專註於編寫應用程式邏輯,而不會被分布式系統的復雜性所困擾。

如果你喜歡我的文章,請給我一個贊!謝謝