Apresentando o Orleans 3.0

Este é um post convidado da equipe de Orleans. Orleans é uma estrutura de plataforma cruzada para a criação de aplicativos distribuídos com o .NET. Para mais informações, consulte https://github.com/dotnet/orleans .

Estamos felizes em anunciar o lançamento do Orleans 3.0. Foi introduzido um grande número de melhorias e correções, além de vários novos recursos, desde o Orleans 2.0. Essas mudanças foram impulsionadas pela experiência de muitas pessoas executando aplicativos baseados em Orleans na produção em uma ampla variedade de cenários e ambientes, e pela criatividade e paixão da comunidade global de Orleans, que sempre se esforça para tornar a base de código melhor, mais rápida e mais flexível. UM GRANDE Obrigado a todos que contribuíram para este lançamento de várias maneiras!



Principais mudanças desde o Orleans 2.0


O Orleans 2.0 foi lançado há pouco mais de 18 meses e desde então o Orleans fez progressos significativos. Algumas das alterações no título desde a versão 2.0 são:

  • Transações ACID distribuídas - vários grãos podem ingressar em uma transação, independentemente de onde seu estado esteja armazenado
  • Um novo planejador, que sozinho aumentou o desempenho em mais de 30% em alguns casos
  • Um novo gerador de código baseado na análise de código de Roslyn
  • Associação de cluster reescrita para maior velocidade de recuperação
  • Suporte de co-hospedagem

Assim como muitas outras melhorias e correções.

Desde os dias de trabalho no Orleans 2.0, a equipe estabeleceu um ciclo virtuoso de implementação ou integração de determinados recursos, como host genérico, opções nomeadas, em estreita colaboração com a equipe do .NET, antes que esses recursos estivessem prontos para fazer parte do .NET Versões principais, contribuindo com feedback e melhorias "upstream" e, em versões posteriores, alternando para suas implementações finais fornecidas com as versões .NET. Durante o desenvolvimento do Orleans 3.0, esse ciclo continuou, com o código Bedrock usado pelo Orleans 3.0.0-beta1 antes de finalmente ser lançado como parte do .NET 3.0. Da mesma forma, o suporte ao TLS nas conexões de soquete TCP foi implementado como parte do Orleans 3.0 e deve se tornar parte de uma versão futura do .NET Core. Vemos essa colaboração contínua como nossa contribuição para o ecossistema .NET maior, no verdadeiro espírito do código-fonte aberto.

Substituição da camada de rede com o ASP.NET Bedrock


O suporte para garantir a comunicação com o TLS tem sido uma solicitação importante há algum tempo, tanto da comunidade quanto dos parceiros internos. Com a versão 3.0, estamos apresentando o suporte a TLS, disponível no pacote Microsoft.Orleans.Connections.Security . Para mais informações, consulte o exemplo TransportLayerSecurity .

A implementação do suporte ao TLS foi um grande empreendimento, devido à maneira como a camada de rede nas versões anteriores do Orleans foi implementada: ela não podia ser facilmente adaptada para usar o SslStream , que é o método mais comum para implementar o TLS. Com o TLS como nossa força motriz, embarcamos em uma jornada para reescrever a camada de rede de Orleans.

O Orleans 3.0 substitui toda a sua camada de rede por uma construída sobre o Project Bedrock , uma iniciativa da equipe do ASP.NET. O objetivo do Bedrock é ajudar os desenvolvedores a criar clientes e servidores de rede rápidos e robustos.

A equipe do ASP.NET e a equipe de Orleans trabalharam juntas para projetar abstrações que suportam clientes e servidores de rede, são independentes de transporte e podem ser personalizadas usando o middleware. Essas abstrações nos permitem alterar o transporte de rede via configuração, sem modificar o código de rede interno específico de Orleans. O suporte ao TLS de Orleans é implementado como um middleware Bedrock e nossa intenção é que isso seja tornado genérico para que possa ser compartilhado com outras pessoas no ecossistema .NET.

Embora o ímpeto desse empreendimento fosse o suporte ao TLS, observamos uma melhoria de aproximadamente 30% na taxa de transferência, em média, em nossos testes de carga noturna.

A reescrita da camada de rede também envolveu a substituição de nosso pool de buffers customizados pelo MemoryPool<byte> e, ao fazer essa alteração, a serialização agora tira mais proveito do Span<T> . Alguns caminhos de código que anteriormente dependiam do bloqueio por meio de threads dedicados chamando BlockingCollection<T> agora estão usando o Channel<T> para passar mensagens de forma assíncrona. Isso resulta em menos threads dedicados, movendo o trabalho para o pool de threads .NET.

O protocolo principal para Orleans permaneceu fixo desde seu lançamento inicial. Com o Orleans 3.0, adicionamos suporte para atualizar progressivamente o protocolo de rede via negociação de protocolo. O suporte à negociação de protocolo adicionado no Orleans 3.0 permite aprimoramentos futuros, como a personalização do serializador principal, mantendo a compatibilidade com versões anteriores. Um benefício do novo protocolo de rede é o suporte a conexões silo a silo full-duplex, em vez dos pares de conexões simplex estabelecidos anteriormente entre os silos. A versão do protocolo pode ser configurada via ConnectionOptions.ProtocolVersion .

Co-hospedagem via host genérico


A co-hospedagem do Orleans com outras estruturas, como o ASP.NET Core, no mesmo processo agora é mais fácil do que antes, graças ao .NET Generic Host .

Aqui está um exemplo de adição de Orleans ao lado do ASP.NET Core a um host usando UseOrleans :
 var host = new HostBuilder() .ConfigureWebHostDefaults(webBuilder => { // Configure ASP.NET Core webBuilder.UseStartup<Startup>(); }) .UseOrleans(siloBuilder => { // Configure Orleans siloBuilder.UseLocalHostClustering(); }) .ConfigureLogging(logging => { /* Configure cross-cutting concerns such as logging */ }) .ConfigureServices(services => { /* Configure shared services */ }) .UseConsoleLifetime() .Build(); // Start the host and wait for it to stop. await host.RunAsync(); 

Usando o construtor de host genérico, o Orleans compartilhará um provedor de serviços com outros serviços hospedados. Isso concede a esses serviços acesso a Orleans. Por exemplo, um desenvolvedor pode injetar IClusterClient ou IGrainFactory em um controlador ASP.NET Core MVC e chamar grãos diretamente de seu aplicativo MVC.

Essa funcionalidade pode ser usada para simplificar sua topologia de implantação ou adicionar funcionalidade adicional a um aplicativo existente. Algumas equipes usam internamente a co-hospedagem para adicionar sondagens de prontidão e disponibilidade do Kubernetes aos seus silos de Orleans usando as verificações de integridade do ASP.NET Core .

Melhorias na confiabilidade


Agora, os clusters se recuperam mais rapidamente das falhas graças às fofocas prolongadas. Nas versões anteriores do Orleans, os silos enviavam mensagens de fofocas aos membros, instruindo-os a atualizar as informações dos membros. As mensagens de fofocas agora incluem instantâneos imutáveis ​​e com versão da associação ao cluster. Isso melhora o tempo de convergência após um silo ingressar ou sair do cluster (por exemplo, durante upgrade, dimensionamento ou após uma falha) e alivia a contenção no armazenamento de associação compartilhada, permitindo transições mais rápidas do cluster. A detecção de falhas também foi aprimorada, com mais mensagens de diagnóstico e aprimoramentos para garantir uma detecção mais rápida e precisa. A detecção de falhas envolve silos em um cluster, monitorando-se colaborativamente, com cada silo enviando análises periódicas de integridade a um subconjunto de outros silos. Agora, os silos e os clientes também se desconectam proativamente dos silos que foram declarados extintos e eles negam conexões com esses silos.

Os erros de mensagens agora são tratados de maneira mais consistente, resultando em erros de prompt sendo propagados de volta ao chamador. Isso ajuda os desenvolvedores a descobrir erros mais rapidamente. Por exemplo, quando uma mensagem não puder ser totalmente serializada ou desserializada, uma exceção detalhada será propagada de volta para o chamador original.

Extensibilidade aprimorada


Agora, os fluxos podem ter adaptadores de dados personalizados, permitindo a ingestão de dados em qualquer formato. Isso dá aos desenvolvedores maior controle sobre como os itens de fluxo são representados no armazenamento. Ele também fornece ao provedor de controle o controle sobre como os dados são gravados, permitindo a integração dos fluxos com sistemas legados e / ou serviços que não são de Orleans.

As extensões de grão permitem que um comportamento adicional seja adicionado a um grão em tempo de execução, anexando um novo componente com sua própria interface de comunicação. Por exemplo, as transações do Orleans usam extensões de granulação para adicionar métodos de ciclo de vida da transação, como Preparar , Confirmar e Interromper , a um granulado de forma transparente ao usuário. Agora, as extensões de grãos também estão disponíveis para Serviços de grãos e destinos do sistema.

O estado transacional personalizado agora pode declarar quais funções ele pode desempenhar em uma transação. Por exemplo, uma implementação de estado transacional que grava eventos do ciclo de vida da transação em uma fila do Barramento de Serviço não pode cumprir as funções do gerenciador de transações, pois é somente para gravação.

As estratégias de posicionamento predefinidas estão acessíveis ao público agora, para que qualquer diretor de posicionamento possa ser substituído durante o tempo de configuração.

Junte-se ao esforço


Agora que o Orleans 3.0 está pronto, estamos voltando nossa atenção para lançamentos futuros - e temos alguns planos interessantes! Venha se juntar à nossa comunidade calorosa e acolhedora no GitHub e Gitter e nos ajude a tornar esses planos realidade.

Equipe de Orleans

Source: https://habr.com/ru/post/pt474226/


All Articles