O documento apresenta o modelo de atores e sua implementação no .NET através de frameworks como Microsoft Orleans e Akka.NET. A agenda inclui tópicos sobre sistemas escaláveis, modelo de atores, características desse modelo e demonstrações das implementações Orleans e Akka.NET.
23. Modelo de Atores
“Erlang is a programming language
used to build massively scalable soft
real-time systems with requirements on
high availability.
Some of its uses are in telecoms,
banking, e-commerce, computer
telephony and instant messaging.
Erlang's runtime system has built-in
support for concurrency, distribution
and fault tolerance.”
24. Modelo de Atores
“We work on the Erlang programming
language, libraries and tools.
Our mission is to push Erlang technology
forward, and develop WhatsApp's
reputation as a major contributor in the
broader Erlang user community.”
25. Modelo de Atores - Características
● Unidade computacional: ator
● Ator se comunica com outros atores através de mensagens
imutáveis
● Ao receber uma mensagem um ator pode:
○ Criar um outro ator
○ Enviar mensagem para outro ator
○ Alterar seu estado
26. Modelo de Atores - Características
● Ator tem apenas referência a outro ator
○ Endereço
○ Transparência de localização
● Apenas 1 mensagem é processada por vez
○ Mailbox de mensagens
○ Assincronamente
● Ator é ‘barato’ (lightweight)
27. Implementações .NET
● Akka.NET
● Portado no Akka (JVM)
● Mantenedora: Petabridge
● Criação explícita de atores
● Detecção de falhas baseado em árvore de supervisão
○ Ator que cria outro ator é responsável por ele
○ Decide o que fazer quando ele falha
● Clustering é um add-on
29. Akka.NET
public class GreetingActor : ReceiveActor
{
public GreetingActor()
{
Receive<Greet>(greet =>
Sender.Tell($"Greeting {greet.Who}", Self));
}
}
30. Akka.NET
var system = ActorSystem.Create("MySystem");
var greeter = system.ActorOf<GreetingActor>("greeter");
var result = await greeter.Ask<string>(
new Greet("Hello World"));
31. Implementações .NET
● Microsoft Orleans
● Microsoft Research
● Abraça o TAP (async/await)
○ Métodos -> Mensagens
● Atores Virtuais
○ Não é preciso criar um ator explicitamente
● Cluster-aware por padrão
32. MS Orleans
● Grain (Ator)
● Identificador (Int, Guid ou String)
● Criado sob demanda
● Transparência de localização
● Silo
● Nós do cluster
● Onde grains são executados
34. MS Orleans
public class HelloGrain: Orleans.Grain, IHello
{
Task<string> Greet(string greeting)
{
return Task.FromResult($"You said: '{greeting}'");
}
}
35. MS Orleans
var client = new ClientBuilder().UseLocalhostClustering()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "HelloWorldApp";
}).Build();
await client.Connect();
var hello = client.GetGrain<IHello>(“Minelli”);
var result = await hello.Greet("Hello World!");
36. Implementações .NET
● Proto.Actor
● Virtual Actors do MS Orleans
● Modelo conceitual Akka / Erlang
● Interoperabilidade
○ C#, Go, Java e Kotlin
● Projeto menos maduro que os anteriores
37. Proto.Actor
public class HelloActor : IActor
{
public Task ReceiveAsync(IContext context)
{
var msg = context.Message;
if (msg is Greet greet)
{
context.Respond(greet.Who);
}
return Actor.Done;
}
}
38. Proto.Actor
var context = new RootContext();
var props = Props.FromProducer(() => new HelloActor());
var actor = context.Spawn(props);
var result = await context.RequestAsync<string>(
actor,
new Greet { Who = "Alex" });
40. Referências
● The Inevitable Rise of the Stateful Web Application
● Developing APIs using Actor model in ASP.NET Core
● Akka.Net
● Orleans
● Proto.Actor
● MS Orleans in Real World Application
● Scalable by Design
Notas do Editor
O que um sistema precisa permitir para dizermos que é escalável?
Escalabilidade vertical é mais barata no curto prazo - equipes de desenvolvimento geralmente são mais caras.Mas e.v. tem um limite de volume que pode suportar.Longo prazo ou volumes muito grandes, escalabilidade horizontal é mais vantajosa
Recomendação de arquitetura ou desenho
Podemos adicionar servidores de forma que qualquer um poderá atender qq requisição
Adicionar diagrama de API stateless
Ops…
Mentira: desconsiderando apis funcionais ou CRUD, sempre há estado!!Para uma API stateless funcionar, todo o estado deve ser carregado antes da execução!
Cache
NoSql
Cache + NoSql
Repositorios para estado externo são complexos e/ou dificeis de escalarComplexidade operacional e arquitetural
Analogia do callcenter:Stateless - cada vez q vc fala: aguarde, estou pesquisando seu cadastro…Stateful - cadastro está na tela o tempo todo
Implementar isto não é facil.
Sistemas de atores entregam as partes complicadas destas funcionalidades ‘stateful’
Ou abstraem boa parte da complexidade para obtermos aquelas caracteristicas
Modelo de atores não é nada novo, na verdade. Vem dos anos 70/80
Uma das primeiras implementações foi feita no Erlang, originalmente desenvolvida pela Ericsson (Ericsson Language)
Switches e equipamentos dela ainda usam nas redes de telecom, principalmente europeias.Curiosidade: adivinhem ai uma empresa bastante conhecida e que usa Erlang?
Whatsapp feito em Erlang - citação direta da pagina de vagas de engenharia do WA
Vamos ver algumas caracteristicas dos modelos ou sistemas de atores
Unidade computacional -> tudo é modelado como um atorÉ comum ouvir dizer que atores não andam sozinhos, são sempre encontrados em sistemas
Transparencia, Assincrono -> facilitam a implementação de sistemas de atores distribuidos
Iniciado 2014
ActorSystem
ActorSystem
ActorSystem
Research em 2012 - Hallo 4 e 5
ActorSystem
ActorSystem
ActorSystem
Iniciado por um dos desenvolvedores originais do Akka.NET - Roger Johanson
Iniciado em 2017