Fala Galera,
Hoje venho falar sobre um conceito para se criar aplicações distribuídas e concorrentes, o Actor Model. Esse paradigma podemos dizer que é o futuro da programação distribuída e reativas e para atender esse paradigma surge o Akka .Net. Um framework para se construir aplicações reativas, concorrente e distribuídas.
Entendendo o conceito Actor Model
O Actor Model ajuda a criar sistemas escaláveis e distribuídos, abstraindo algumas problemáticas da computação concorrente, como a concorrência em threads e o estado compartilhado de dados.
Um ator é uma entidade leve que consiste em estado e comportamento que só se comunicará com o meio ambiente usando a passagem de mensagens.
As mensagens chegam ao ator e serão processadas de forma assíncrona, uma a uma.
Em vez de ter atores grandes e complicados, nos esforçamos para quebrar a funcionalidade da aplicação em uma hierarquia de pequenos atores de propósito único, onde os atores mais altos na hierarquia delegam e supervisionam os atores assim criando uma cadeia de fallback.
Akka .NET – O Framework Actor Model
O Akka .NET fornece as ferramentas necessárias para se criar aplicações resilientes, reativas, distribuídas e de alto desempenho usando o modelo Actor.
A ideia deste post é mostrar os conceito básicos do Akka .NET, já que o Framework é muito abrangente.
Show me the code!
O entry-point para o Akka é criar um ator chamado “System” que será o hosts do nossos atores. Os atores que serão gerados pelo “System” ou sejam os atores podem gerar outros atores e assim se criar um hierarquia de atores (micro-serviços).
Para esse exemplo estarei usando a API do GitHub (OctoKit), assim poderemos verificar a troca de mensagens entre os atores.
public class UserActor : ReceiveActor { public UserActor() { IActorRef repositoryActor = Context.ActorOf(Props.Create(() => new RepositoryActor())); var github = new GitHubClient(new ProductHeaderValue("AkkaSample"), new InMemoryCredentialStore(new Credentials("rafaelcruz-net", "brq#130301"))); Receive<String>(x => { Console.WriteLine($"Buscando o usuário {x}"); var user = github.User.Get(x).Result; Console.WriteLine($"Nome: {user.Name} \nLogin: {user.Login}"); var repos = github.Repository.GetAllForUser(x).Result; foreach (var item in repos) { repositoryActor.Tell(item.Name); } }); } }
No código acima criamos um Actor que fará a busca das informações do usuário no Github, quando ele achar o usuário passará uma mensagem para outro Actor que fará a exibição do seus repositórios
public class RepositoryActor : ReceiveActor { public RepositoryActor() { Receive<String>(x => { Console.WriteLine($"Nome dos Repositorio {x}"); }); } }
Neste código criarmos um novo Actor no qual recebe a mensagem e exibe o nome do repositório dele.
static void Main(string[] args) { var system = ActorSystem.Create("main"); var userActor = system.ActorOf(Props.Create(() => new UserActor())); userActor.Tell("rafaelcruz-net"); Console.Read(); }
No método principal, criamos o Main Actor ele é responsável por coordenar as ações entre outros atores.
Quando executamos esse código, temos o seguinte resultado.
Como podemos ver, esse foi um exemplo bem básico do que esse Framework pode fazer.
Ele é bem completo e ele foi portado de uma implementação em java, para cenários de alta escalabilidade e com concorrência ele se porta muito bem.
O código deste exemplo no GitHub através deste link
Não deixem de comentar!
Abs e até a próxima.