Microsoft Orleans

Orleans é uma estrutura multiplataforma projetada para simplificar a criação de aplicativos distribuídos. De um único servidor a milhares de aplicativos baseados em nuvem, Orleans fornece ferramentas para ajudar a gerenciar as complexidades dos sistemas distribuídos. Ele estende conceitos de C# familiares para ambientes de vários servidores, permitindo que os desenvolvedores se concentrem na lógica do aplicativo.

Veja o que Orleans oferece:

  • Ele foi projetado para ser dimensionado elasticamente. Adicione ou remova servidores e Orleans ajuste adequadamente para manter a tolerância a falhas e a escalabilidade.
  • Ele simplifica o desenvolvimento de aplicativos distribuídos com um conjunto comum de padrões e APIs, tornando-o acessível até mesmo para os novos sistemas distribuídos.
  • Ele é nativo de nuvem e é executado em plataformas em que há suporte para .NET — Linux, Windows, macOS e muito mais.
  • Ele dá suporte a opções de implantação modernas, como Kubernetes, Serviço de Aplicativo do Azure e Aplicativos de Contêiner do Azure.

Orleans geralmente é chamado de ".NET distribuído" devido ao seu foco na criação de serviços nativos de nuvem resilientes e escalonáveis.

Novidades na Orleans versão 10.0

Orleans A versão 10.0 apresenta vários novos recursos e melhorias:

  • Orleans Painel de Controle: um painel de controle integrado para monitoramento em tempo real do seu Orleans cluster, grains e silos.
  • Provedores Redis: provedores Redis estáveis para clustering, persistência e lembretes.
  • Suporte para token de cancelamento em destinos do sistema: suporte estendido ao token de cancelamento em todo o framework.

Dica

Orleans O 10.0 tem como destino o .NET 8.0, o .NET 9.0 e o .NET 10.0.

Novidades no Orleans 9.x

Orleans O 9.x apresenta vários recursos significativos:

  • Suporte total ao CancellationToken: os métodos grain agora dão suporte total a tokens de cancelamento.
  • Strong-Consistency Grain Directory: um novo diretório distribuído em memória com fortes garantias de consistência.
  • Desativação de Ativação Baseada em Memória: desativação automática de grains sob pressão de memória.
  • Cluster de Teste Em Processo: infraestrutura de teste simplificada para testes de Orleans aplicativos.
  • Protocolo de Associação aprimorado: detecção de falha mais rápida (90 segundos versus 10 minutos em versões anteriores).
  • Activation Rebalancing: Rebalanceamento automático de grãos entre silos (estável, experimental na versão 8.2).
  • Alteração de posicionamento padrão (9.2): a estratégia de posicionamento padrão foi alterada de Aleatório para ResourceOptimized.

Dica

Orleans O 9.x tem como destino o .NET 8.0 e o .NET 9.0.

Novidades no Orleans 8.x

Orleans O 8.x introduziu vários recursos importantes:

  • .NET Aspire Integration: suporte de primeira classe para .NET Aspire para desenvolvimento nativo de nuvem simplificado.
  • Posicionamento Otimizado para Recursos: uma nova estratégia de posicionamento com base na utilização da CPU e da memória.
  • Reparticionamento de Ativação (8.2, Experimental): redistribuição automática de grains para melhor desempenho.
  • Nova API de Temporizador de Grão (8.2): RegisterGrainTimer substitui o método preterido RegisterTimer .
  • Serializador MessagePack (8.2): uma nova opção de serialização de alto desempenho.
  • Provedor de Clustering Cassandra (8.2): suporte para Apache Cassandra como provedor de clustering.

Dica

Orleans O 8.x tem como destino o .NET 8.0.

Novidades na Orleans versão 7.0

Orleans 7.0 foi uma versão importante com melhorias significativas:

  • APIs simplificadas: padrões de construtor simplificados usando UseOrleans e UseOrleansClient.
  • Geradores de origem: substituiu a geração de código por geradores de origem para melhor desempenho em tempo de build.
  • Novo Sistema de Serialização: um novo framework de serialização tolerante a versões de alto desempenho.
  • Suporte a IAsyncEnumerable (7.2): respostas em fluxo contínuo de métodos de grain.
  • Tempos Limite por Chamada (7.2.2): especifica tempos limite em chamadas de grain individuais.
  • Provedores do Cosmos DB (7.2): suporte do Azure Cosmos DB para clustering, persistência e lembretes.

Dica

Orleans O 7.0 tem como destino o .NET 7.0 e posterior.

Orleans 3.x (Legado)

Orleans 3.x é uma versão herdada. Para novos projetos, considere atualizar para Orleans 7.0 ou posterior para aproveitar o desempenho aprimorado, as APIs simplificadas e os novos recursos.

Principais diferenças em relação às versões mais recentes:

  • Utiliza ClientBuilder e SiloHostBuilder, em vez do padrão unificado UseOrleans.
  • Requer ConfigureApplicationParts() para verificação de assembly.
  • Usa o gerador de código herdado em vez de geradores de origem.

Para obter diretrizes de migração, consulte o guia de migração.

O modelo de ator

Orleans é baseado no modelo de ator. Originado no início da década de 1970, o modelo de ator agora é um componente principal de Orleans. No modelo de ator, cada ator é um objeto leve, simultâneo e imutável encapsulando um pedaço de estado e o comportamento correspondente. Os atores se comunicam exclusivamente usando mensagens assíncronas. Orleans notavelmente inventou a abstração do Ator Virtual , onde os atores existem perpetuamente.

Nota

Os atores são entidades puramente lógicas que existem sempre virtualmente. Um ator não pode ser criado nem destruído explicitamente e sua existência virtual não é afetada pela falha de um servidor que o executa. Como os atores sempre existem, eles são sempre endereçáveis.

Essa nova abordagem ajuda a criar uma nova geração de aplicativos distribuídos para a era da nuvem. O Orleans modelo de programação doma a complexidade inerente a aplicativos distribuídos altamente paralelos sem restringir recursos ou impor restrições.

Para obter mais informações, consulte Orleans: Atores virtuais por meio da Microsoft Research. Um ator virtual é representado como um grain do Orleans.

O que são grãos?

O grain é um dos vários primitivos do Orleans. Em termos de modelo de ator, um grain é um ator virtual. O bloco de construção fundamental em qualquer aplicativo Orleans é um grain. Os grains são entidades que compreendem identidade, comportamento e estado definidos pelo usuário. Considere a seguinte representação visual de um grão:

Um grão é composto por uma identidade estável, comportamento e estado.

As identidades de grão são chaves definidas pelo usuário, tornando os grãos sempre disponíveis para invocação. Outros grains ou qualquer número de clientes externos podem invocar grains. Cada grão é uma instância de uma classe que implementa uma ou mais das seguintes interfaces:

Os grãos podem ter dados de estado voláteis ou persistentes armazenados em qualquer sistema de armazenamento. Dessa forma, os grãos particionam implicitamente os estados do aplicativo, permitindo a escalabilidade automática e simplificando a recuperação de falhas. Orleans mantém o estado de grão na memória enquanto o grão está ativo, levando a uma latência menor e menos carga nos armazenamentos de dados.

O ciclo de vida gerenciado de um grão Orleans.

O runtime Orleans instancia automaticamente grains sob demanda. Os grãos não usados por um tempo são removidos automaticamente da memória para liberar recursos. Essa remoção é possível devido à sua identidade estável, permitindo a invocação de grains, estejam eles carregados na memória ou não. Isso também possibilita a recuperação transparente de falhas, pois o chamador não precisa saber em qual servidor um grain foi instanciado em nenhum momento. Os grãos têm um ciclo de vida gerenciado, com o Orleans runtime responsável por ativar/desativar e colocar/localizar grãos conforme necessário. Isso permite escrever código como se todos os grãos estivessem sempre na memória.

O que são silos?

Um silo é outro exemplo de um primitivo Orleans. Um silo hospeda um ou mais grãos. O Orleans runtime implementa o modelo de programação para aplicativos.

Normalmente, um grupo de silos é executado como um cluster para escalabilidade e tolerância a falhas. Quando executados como um cluster, os silos se coordenam para distribuir o trabalho e detectar e se recuperar de falhas. O runtime permite que os grãos hospedados no cluster se comuniquem como se estivessem dentro de um único processo. Para ajudar a visualizar a relação entre clusters, silos e grãos, considere o seguinte diagrama:

Um cluster tem um ou mais silos e um silo tem um ou mais grãos.

O diagrama anterior mostra a relação entre clusters, silos e grãos. Pode haver qualquer número de clusters, cada cluster tem um ou mais silos e cada silo tem um ou mais grãos.

Além do modelo de programação principal, os silos fornecem aos grains serviços de runtime, como temporizadores, lembretes (temporizadores persistentes), persistência, transações, fluxos e muito mais. Para obter mais informações, consulte o que pode ser feito com Orleans?.

Os aplicativos Web e outros clientes externos chamam grains no cluster usando a biblioteca de clientes, que gerencia automaticamente a comunicação de rede. Os clientes também podem ser co-hospedados no mesmo processo com silos para simplicidade.

O que pode ser feito com Orleans?

Orleans é uma estrutura para a criação de aplicativos nativos de nuvem e deve ser considerada ao criar aplicativos .NET que eventualmente precisam ser dimensionados. Há maneiras aparentemente intermináveis de usar Orleans, mas as seguintes são algumas das mais comuns: jogos, bancos, aplicativos de chat, rastreamento de GPS, negociação de ações, carrinhos de compras, aplicativos de votação e muito mais. A Microsoft usa Orleans no Azure, Xbox, Skype, Halo, PlayFab, Gears of War e muitos outros serviços internos. Orleans tem muitos recursos facilitando o uso para vários aplicativos.

Persistência

Orleans fornece um modelo de persistência simples que garante a disponibilidade de estado antes de processar uma solicitação e manter a consistência. Os grãos podem ter vários objetos de dados persistentes nomeados. Por exemplo, um pode ser chamado de "profile" para o perfil de um usuário e outro de "inventory" para seu inventário. Esse estado pode ser armazenado em qualquer sistema de armazenamento.

Enquanto um grain é executado, Orleans mantém o estado na memória para atender solicitações de leitura sem acessar o armazenamento. Quando o grain atualiza seu estado, chamar IStorage.WriteStateAsync garante que o armazenamento subjacente seja atualizado para durabilidade e consistência.

Para obter mais informações, consulte Persistência de granularidade.

Temporizadores e lembretes

Lembretes são um mecanismo de agendamento durável para grains. Use-os para garantir que uma ação seja concluída em um ponto futuro, mesmo que o grain não esteja ativado no momento. Os temporizadores são o equivalente não durável aos lembretes e podem ser usados para eventos de alta frequência que não exigem confiabilidade.

Para obter mais informações, consulte Temporizadores e lembretes.

Posicionamento flexível de grãos

Quando um grain é ativado em Orleans, o runtime decide em qual servidor (silo) ativá-lo. Esse processo é chamado de posicionamento de grãos.

O processo de posicionamento no Orleans pode ser totalmente configurado. Escolha entre políticas de posicionamento prontas para uso, como aleatória, preferência local e baseada em carga, ou configure a lógica personalizada. Isso permite flexibilidade total na decisão de onde os grãos são criados. Por exemplo, coloque grãos em um servidor próximo aos recursos com os quais eles precisam operar ou outros grãos com os quais se comunicam.

Para saber mais, consulte o Posicionamento de grains.

Controle de versão de grains e clusters heterogêneos

Atualizar sistemas de produção de maneira segura, levando em conta as alterações, pode ser desafiador, especialmente em sistemas que mantêm estado. Para levar isso em consideração, as interfaces de grain podem ser versionadas em Orleans.

O cluster mantém um mapeamento de quais implementações de grãos estão disponíveis em quais silos e suas versões. O runtime usa essas informações de versão com estratégias de posicionamento para tomar decisões de posicionamento ao rotear chamadas para grains. Além de atualizar com segurança um grão versionado, isso também possibilita clusters heterogêneos em que diferentes silos têm diferentes conjuntos de implementações de grãos disponíveis.

Para saber mais, consulte o Controle de versão de grains.

Trabalhadores sem estado

Workers sem estado são grains especialmente marcados, sem estado associado, que podem ser ativados em vários silos simultaneamente. Isso permite maior paralelismo para funções sem estado.

Para obter mais informações, consulte Grãos para trabalhador sem estado.

Filtros de chamada de grain

Um filtro de chamada de grain é uma lógica comum a muitos grains. Orleans dá suporte a filtros para chamadas de entrada e saída. Os usos comuns incluem autorização, registro em log e telemetria e tratamento de erros.

Contexto da solicitação

Transmita metadados e outras informações com uma série de solicitações usando o contexto de solicitação. Use o contexto de solicitação para manter informações de rastreamento distribuídas ou quaisquer outros valores definidos.

Transações ACID distribuídas

Além do modelo de persistência simples descrito acima, os grãos podem ter estado transacional. Vários grains podem participar de transações ACID juntos, independentemente de onde seu estado seja armazenado. As transações em Orleans são distribuídas e descentralizadas (ou seja, nenhum gestor ou coordenador central de transações) e apresentam isolamento serializável.

Para obter mais informações sobre transações, consulte Transações.

Fluxos

Os fluxos ajudam a processar uma série de itens de dados quase em tempo real. Orleans Os fluxos são gerenciados; não é necessário criá-los ou registrá-los antes que um grain ou cliente publique ou se inscreva. Isso permite maior desacoplamento entre produtores e consumidores de fluxos e a infraestrutura.

O processamento de fluxos é confiável: os grains podem armazenar pontos de verificação (cursores) e redefinir para um ponto de verificação armazenado durante a ativação ou em qualquer momento subsequente. Os fluxos dão suporte à entrega em lote de mensagens aos consumidores para melhorar a eficiência e o desempenho de recuperação.

Os fluxos são apoiados por serviços de fila, como Hubs de Eventos do Azure, Amazon Kinesis e outros.

Um número arbitrário de fluxos pode ser multiplexado em um número menor de filas e a responsabilidade de processar essas filas é equilibrada uniformemente em todo o cluster.

Introdução ao vídeo Orleans

Para uma introdução em vídeo de Orleans, confira o seguinte vídeo:

Próximas etapas