Visão Geral do Modelo de Atores
O Modelo de Atores é um dos modelos mais interessantes que já vi. Ele foi projetado para alta concorrência, escalabilidade e tolerância a falhas. A maioria das linguagens de programação possui um framework que o implementa, mas algumas, como Erlang/Elixir, são desenvolvidas com esse modelo em mente.
História
O modelo de atores foi criado em 1973, inspirado pela física e por linguagens como Smalltalk e Lisp. Ele foi concebido para lidar com máquinas altamente paralelas, compostas por dezenas, centenas ou milhares de microprocessadores independentes, cada um com memória local e comunicação via rede de alto desempenho.
Conceitos Fundamentais
Em Programação Orientada a Objetos, tudo é tratado como objeto. No modelo de atores, tudo é um ator.
Ator
O ator é a unidade básica de concorrência. Ele reage a mensagens alterando seu estado, modificando seu comportamento para a próxima mensagem ou enviando novas mensagens. Um ator pode:
- Enviar um número finito de mensagens para outros atores.
- Criar um número finito de novos atores.
- Designar o comportamento para a próxima mensagem.
Mensagem
A mensagem é a unidade de comunicação entre atores. Ela deve ser serializável para ser transmitida em redes.
Caixa de Correio (Mailbox)
A caixa de correio é onde um ator recebe mensagens. Normalmente, segue a ordem FIFO (First-In, First-Out), mas pode ser personalizada para priorizar mensagens.
Estado
O estado do ator só pode ser modificado por ele mesmo, embora outros atores possam ler seu estado.
Comportamentos (Behaviours)
Define como um ator reage a uma mensagem.
PID ou Referência do Ator
O Process Identification (PID) é o "endereço" do ator. Pode ser local ou remoto, permitindo comunicação entre máquinas.
Supervisão
A supervisão define como o modelo coordena tarefas e garante resiliência. Quando um ator falha, ele emite um sinal ao supervisor, que decide:
- Parar apenas o ator com falha (One-For-One).
- Parar todos os atores filhos (All-For-One).
- Repassar o sinal ao supervisor hierárquico superior.
Ator Virtual/Grain
Conceito criado pela Microsoft no projeto Orleans, onde o ator é identificado por um ID único, e o framework gerencia sua localização ou criação [[6]]. Combina-se bem com DDD (Domain-Driven Design) e Event Sourcing, usando o ID do ator como ID de domínio.
Frameworks
A escolha do framework depende da linguagem. Em C#, destacam-se:
Microsoft Orleans
Implementa apenas o Ator Virtual (chamado de Grain), com termos adaptados (Silos = nós). É fácil de usar, mas carece de flexibilidade na supervisão.
Akka.NET
Port do Java, segue o modelo clássico, mas não suporta Ator Virtual. Requer adaptações para DDD.
Proto.Actor
Implementa tanto o modelo clássico quanto o Ator Virtual, sendo altamente flexível e recomendado para casos complexos.
Elixir/Erlang
Baseadas na BEAM VM, nativamente alinhadas ao modelo de atores. Não possuem suporte nativo para Ator Virtual, exigindo bibliotecas externas.
Conclusão
O modelo de atores é ideal para sistemas de alta escalabilidade e combina-se com DDD, Event Sourcing e CQRS. Frameworks como Proto.Actor oferecem implementações completas, enquanto Orleans simplifica o uso de Atores Virtuais.
Referências
https://proto.actor/docs/actors/
https://doc.akka.io/libraries/akka-core/current/general/actors.html
https://en.wikipedia.org/wiki/Actor_model
Top comments (1)
Tenho estudado o Microsoft Orleans tem vários anos e acho fascinante. Tenho criado algumas PoCs e acredito que uma delas vai virar produto aqui na empresa. Essa abordagem é muito interessante, porém, modelar atores é algo que acredito ser bem complexo.