Akka .NET – Construa Aplicações Reativas e Distribuídas

13 nov

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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *