当前位置: 欣欣网 > 码农

探索 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 和配置选项,因此在奥尔良设置具有思洛存储器的本地集群非常简单。开发人员可以快速创建用于测试和开发目的的本地集群环境,使他们能够专注于编写应用程序逻辑,而不会被分布式系统的复杂性所困扰。

如果你喜欢我的文章,请给我一个赞!谢谢