Benefícios do Orleans
Os principais benefícios do Orleans são:
- Produtividade do desenvolvedor, inclusive para programadores não especializados.
- Escalabilidade transparente, por padrão, sem esforços especiais do programador.
Produtividade do desenvolvedor
O modelo de programação do Orleans aumenta a produtividade de programadores especialistas e não especialistas, fornecendo os principais serviços de sistema, garantias e abstrações a seguir.
Paradigma clássico de OOP (programação orientada a objeto)
A granularidade se refere a classes do .NET que implementam as interfaces de granularidade declaradas do .NET com métodos assíncronos. A granularidade é exibida para os programadores como objetos remotos cujos métodos podem ser invocados diretamente. Isso fornece ao programador o paradigma clássico de OOP, transformando chamadas de método em mensagens, encaminhando-os para os pontos de extremidade corretos, invocando os métodos de granularidade de destino e lidando com falhas e casos extremos de forma transparente.
Execução single-threaded de granularidade
O runtime garante que a granularidade nunca seja executada em mais de um thread de cada vez. Em combinação com o isolamento de outra granularidade, o programador nunca enfrenta simultaneidade no nível da granularidade e nunca precisa usar bloqueios ou outros mecanismos de sincronização para controlar o acesso a dados compartilhados. Este recurso isolado facilita o desenvolvimento de aplicativos distribuídos para programadores não especializados.
Ativação transparente
O runtime ativa a granularidade conforme necessário, somente quando há uma mensagem a ser processada. Essa ação separa claramente a noção de criar uma referência a uma granularidade, que é visível e controlada pelo código do aplicativo, e a ativação física da granularidade na memória, que é transparente para o aplicativo. Isso é semelhante à memória virtual, pois ela decide quando "sair da página" (desativar) ou "entrar na página" (ativar) da granularidade. O aplicativo tem acesso ininterrupto ao "espaço de memória" completo da granularidade criada logicamente, independentemente de estar na memória física em algum momento específico.
A ativação transparente permite o balanceamento de carga dinâmico e adaptável por meio do posicionamento e da migração de granularidade em todo o pool de recursos de hardware. Esse recurso é uma melhoria considerável no modelo de ator tradicional, em que o tempo de vida do ator é gerenciado pelo aplicativo.
Transparência da localização
Uma referência de granularidade (objeto de proxy) que o programador usa para invocar os métodos da granularidade ou passar para outros componentes contém apenas a identidade lógica da granularidade. A conversão da identidade lógica da granularidade em localização física e o encaminhamento correspondente das mensagens são feitos de forma transparente pelo runtime do Orleans.
O código do aplicativo se comunica com a granularidade, enquanto permanece alheio à localização física, o que pode mudar ao longo do tempo devido a falhas, ou ao gerenciamento de recursos ou porque a granularidade é desativada no momento em que é chamada.
Integração transparente com um armazenamento persistente
O Orleans permite o mapeamento declarativo do estado na memória da granularidade para um armazenamento persistente. Eles sincronizam atualizações, garantindo, de forma transparente, que os chamadores recebam resultados somente depois que o estado persistente tenha sido atualizado com êxito. Estender e/ou personalizar o conjunto de provedores de armazenamento persistente existentes e disponíveis é simples.
Propagação automática de erros
O runtime propaga automaticamente os erros não resolvidos na cadeia de chamadas, com a semântica de try/catch assíncrono e distribuído. Como resultado, os erros não são perdidos em um aplicativo. Isso permite que o programador coloque a lógica de tratamento de erros nos locais apropriados, sem o trabalho tedioso de propagar erros manualmente em cada nível.
Escalabilidade transparente por padrão
O modelo de programação do Orleans foi criado para orientar o programador de modo que ele seja bem-sucedido no dimensionamento de um aplicativo ou serviço por meio de várias ordens de magnitude. Isso é feito ao incorporar as melhores práticas e os padrões comprovados e ao implementar com eficiência a funcionalidade de sistema de nível inferior.
Veja abaixo alguns fatores importantes que viabilizam a escalabilidade e o desempenho:
Particionamento refinado implícito do estado do aplicativo
Ao usar a granularidade como entidades endereçáveis diretamente, o programador divide implicitamente o estado geral do aplicativo. Embora o modelo de programação do Orleans não prescreva qual deve ser a dimensão da granularidade, na maioria dos casos, faz sentido ter uma granularidade relativamente grande – milhões ou mais – e cada uma representa uma entidade natural do aplicativo, como uma conta de usuário ou uma ordem de compra.
Como a granularidade é endereçáveis individualmente e a localização física abstraída pelo runtime, o Orleans tem uma flexibilidade considerável ao balancear a carga e lidar com os pontos de acesso de forma transparente e genérica, sem qualquer perspectiva do desenvolvedor do aplicativo.
Gerenciamento de recursos adaptáveis
A granularidade não assume a localidade de outra granularidade enquanto interage com ela. Devido a essa transparência de localização, o runtime pode gerenciar e ajustar dinamicamente a alocação de recursos de hardware disponíveis. O tempo de execução faz isso tomando decisões refinadas sobre o posicionamento e a migração da granularidade no cluster de cálculo em reação aos padrões de carga e comunicação, sem falhas nas solicitações recebidas. Ao criar várias réplicas de uma granularidade específica, o runtime pode aumentar a taxa de transferência da granularidade, sem fazer alterações no código do aplicativo.
Comunicação multiplexada
As granularidades do Orleans têm pontos de extremidade lógicos, e as mensagens entre eles são multiplexadas em um conjunto fixo de conexões físicas de todos para todos (soquetes TCP). Isso permite que o runtime hospede milhões de entidades endereçáveis com baixa sobrecarga do SO por granularidade. Além disso, a ativação e a desativação de uma granularidade não incorrem no custo de registrar/cancelar o registro de um ponto de extremidade físico, como uma porta TCP ou URL HTTP, ou até mesmo de fechar uma conexão TCP.
Agendamento eficiente
O runtime agenda a execução de um grande número de grãos de thread único usando o Pool de Threads do .NET, que é altamente otimizado para desempenho. Com o código de granularidade gravado no estilo baseado em continuação e sem bloqueio (um requisito do modelo de programação do Orleans), o código do aplicativo é executado de maneira muito eficiente, "cooperativa" e multithreading, sem contenção. Isso permite que o sistema alcance uma alta taxa de transferência e seja executado com altíssima utilização da CPU (até mais de 90%) com uma excelente estabilidade.
O fato de que o aumento no número de granularidade do sistema e um aumento na carga não levam a threads adicionais ou outros primitivos do SO ajuda na escalabilidade de nós individuais e de todo o sistema.
Assincronismo explícito
O modelo de programação do Orleans torna explícita a natureza assíncrona de um aplicativo distribuído e orienta os programadores a gravar códigos assíncronos sem bloqueio. Em combinação com mensagens assíncronas e agendamento eficiente, isso permite um alto grau de paralelismo distribuído e taxa de transferência geral, sem o uso explícito de multithreading.