Akka ou reator [fechado]

94

Estou começando um novo projeto (baseado em java). Eu preciso construí-lo como uma arquitetura modular, distribuída e resiliente.

Portanto, gostaria que os processos de negócios se comuniquem entre si, sejam interoperáveis, mas também independentes.

Estou olhando agora para dois frameworks que, além de suas diferenças de idade, expressam 2 visões diferentes:

O que devo considerar ao escolher uma das estruturas acima?

Pelo que eu entendi até agora, Akka ainda é de alguma forma acoplado (de uma forma que eu tenho que 'escolher' o ator para o qual desejo enviar as mensagens), mas muito resiliente. Enquanto o Reactor está solto (com base na postagem do evento)

Alguém pode me ajudar a entender como tomar uma decisão adequada?

ATUALIZAR

Depois de revisar melhor o Event Bus do Akka, acredito que de alguma forma os recursos expressos pelo Reactor já estão incluídos no Akka.

Por exemplo, a assinatura e a publicação do evento, documentadas em https://github.com/reactor/reactor#events-selectors-and-consumers , podem ser expressas em Akka da seguinte forma:

final ActorSystem system = ActorSystem.create("system");
final ActorRef actor = system.actorOf(new Props(
    new UntypedActorFactory() {

        @Override
        public Actor create() throws Exception {

            return new UntypedActor() {
                final LoggingAdapter log = Logging.getLogger(
                        getContext().system(), this);

                @Override
                public void onReceive(Object message)
                        throws Exception {
                    if (message instanceof String)
                        log.info("Received String message: {}",
                                message);
                    else
                        unhandled(message);
                }
            };
        }
    }), "actor");

system.eventStream().subscribe(actor, String.class);
system.eventStream().publish("testing 1 2 3");

Portanto, parece-me agora que as principais diferenças entre os dois são:

  • Akka, mais maduro, ligado ao Typesafe
  • Reator, estágio inicial, vinculado à primavera

Minha interpretação está correta? Mas qual é a diferença conceitual entre o Ator em Akka e o Consumidor em Reactor ?

David Riccitelli
fonte
8
A Akka não é obrigada a ser usada pelo Scala, na verdade, a maioria usa a partir do Java.
Viktor Klang
1
David: Algo como: Akka EventBus API em conjunto com Akka Actors implementa o Reactor Pattern
Viktor Klang
9
Só para esclarecer: o Reactor não está vinculado ao Spring. Nós intencionalmente evitamos quaisquer dependências do Spring porque, como uma estrutura básica, não faz sentido restringir seu uso apenas aos usuários do Spring. Quanto à diferença entre um Ator e um Consumidor: no que diz respeito ao Reactor, o seu Consumidor pode ter estado ou não. Presume-se que você deseje usar uma classe anônima sem estado ou lambda Java 8, mas isso não é um requisito. E, como mencionei em minha resposta, o conjunto de ferramentas Reactor é, para as primeiras iterações, intencionalmente sucinto. Não estamos tentando criar "o próximo Akka".
Jon Brisbin
8
Apenas deixando de mencionar o vertx.io, pois acredito que esteja no mesmo campo orientado a eventos, com alguns conceitos interessantes em veia semelhante para aqueles que estão pesquisando.
Opentuned
1
Passando alguns anos, também estou em uma situação semelhante. Meu aplicativo é principalmente baseado em molas e agora preciso lidar com um recurso orientado a eventos. Existe um vencedor claro b / w Akka e Spring-reactor? Estou procurando um framework com comunidades de usuários ativos, caso chegue a cenários mais complicados.
tintin

Respostas:

47

É difícil dizer neste ponto porque o Reactor ainda é um esboço e eu (líder de tecnologia da Akka) não tenho uma ideia de para onde ele irá. Será interessante ver se o Reactor se tornará um concorrente do Akka, estamos ansiosos por isso.

Pelo que eu posso ver, em sua lista de requisitos, o Reactor está perdendo resiliência (ou seja, o que a supervisão oferece em Akka) e transparência de localização (ou seja, referindo-se a entidades ativas de uma forma que permite abstrair sobre mensagens locais ou remotas; que é o que você implica por “distribuído”). Para “modular”, não sei o suficiente sobre o Reactor, em particular como você pode pesquisar componentes ativos e gerenciá-los.

Se você começar um projeto real agora e precisar de algo que satisfaça sua primeira frase, não acho que seria controverso recomendar Akka neste momento (como Jon também observou). Sinta-se à vontade para fazer perguntas mais concretas sobre o SO ou na lista de e-mail do akka-user .

Roland Kuhn
fonte
Obrigado Roland, adoro ver que as pessoas de ambos os projetos estão contribuindo para a resposta. Atualmente, estou testando o Akka. Como você previu, é muito prematuro fornecer uma resposta final para a pergunta, exceto que o Reactor ainda está nos estágios iniciais, portanto, ainda não é adequado para uma comparação. Então, vamos esperar e ver como as coisas evoluem :-) Obrigado, David
David Riccitelli
7
Obrigado pela sua resposta, Roland. Eu só queria esclarecer que o Reactor não é um concorrente Akka. Existem semelhanças devido a uma área de preocupação sobreposta em relação aos aplicativos assíncronos. Mas o Reactor deve ser uma estrutura básica sobre a qual outros sistemas podem ser construídos. Esses outros sistemas podem se sobrepor ainda mais ao Akka do que o próprio Reactor. Mas no futuro próximo, o Reactor continuará sendo uma estrutura que permite outros sistemas e não será uma estrutura completa. Você terá que adiar a gratificação no tiroteio Reactor / Akka. ;)
Jon Brisbin
Não se preocupe, acho que você se sairá bem e estou certo de que veremos a polinização cruzada à medida que mais bibliotecas entrarem neste campo.
Roland Kuhn
37

O Reactor não está vinculado ao Spring, é um módulo opcional. Queremos que o Reactor seja portátil, uma base como Jon descreveu.

Não vou estar confiante em empurrar para a produção, pois não somos nem mesmo Milestone (1.0.0.SNAPSHOT), a esse respeito, eu daria uma olhada mais profunda no Akka, que é um fantástico framework assíncrono IMO. Considere também Vert.x e Finagle, que podem ser adaptados se você procurar uma plataforma (o primeiro) ou futuros composíveis (o último). Se você procura uma ampla gama de padrões assíncronos, talvez o GPars forneça uma solução mais completa.

No final, podemos certamente ter sobreposições, na verdade, estamos inclinados a uma abordagem mista (eventos combináveis ​​flexíveis, distribuídos e não vinculados a qualquer estratégia de despacho) onde você pode facilmente encontrar bits de RxJava , Vert.x , Akka etc. Não somos nem mesmo opinativos pela escolha do idioma, mesmo que estejamos fortemente comprometidos com Groovy, as pessoas já começaram as portas Clojure e Kotlin . Adicione a essa mistura o fato de que alguns requisitos são orientados pelo Spring XD e Grails .

Muito obrigado pelo seu interesse testemunhado, espero que você tenha mais pontos de comparação em alguns meses :)

Stephane Maldini
fonte
Obrigado, Stephane, acredito que sua resposta (e o comentário de Jon, stackoverflow.com/questions/16595393/akka-or-reactor/… ) dão uma perspectiva muito mais clara. Ainda vou esperar antes de marcar a pergunta respondida, como você disse, vamos ver o que acontece em um futuro próximo. Novamente, eu realmente aprecio que as pessoas envolvidas em ambos os projetos gastaram tempo fornecendo idéias úteis.
David Riccitelli
Eu concordaria com Vert.x. Eu usei o Vert.x no ambiente de produção em alguns projetos para se comunicar entre os componentes e ele funciona perfeitamente.
Vence em
33

Esta é uma excelente pergunta e a resposta mudará nas próximas semanas. Não podemos fazer nenhuma promessa de como será a comunicação entre os nós agora, só porque é muito cedo. Ainda temos algumas peças a juntar antes de podermos demonstrar o clustering no Reactor.

Com isso dito, só porque o Reactor não faz comunicações OOTB entre nós, não significa que não possa . :) Seria necessário apenas uma camada de rede bastante fina para coordenar entre os reatores usando algo como Redis ou AMQP para dar a ele alguma inteligência em cluster.

Definitivamente, estamos falando e planejando cenários distribuídos no Reactor. É muito cedo para dizer exatamente como isso vai funcionar.

Se você precisa de algo que faça cluster agora, estará mais seguro ao escolher o Akka.

Jon Brisbin
fonte
Obrigado Jon, acho o Reactor muito promissor. Ainda assim, preciso entender se há uma diferença conceitual entre o Reactor e o Akka, além dos recursos que o Reactor está faltando (é claro, estando em seu estágio inicial). Em resumo, qual é a diferença conceitual entre um Ator no Akka e um Consumidor no Reactor? Também atualizei minha pergunta com um exemplo de evento em Akka que, acredito, se assemelha à inscrição / envio de evento na página Reactor do GitHub. Obrigado.
David Riccitelli
Jon, eu estava lendo sua resposta aqui: blog.springsource.org/2013/05/13/… - então podemos supor que no longo prazo Akka e Reactor serão frameworks semelhantes, ambos suportando o padrão Reactor e o modelo Actor.
David Riccitelli
O comentário acima não está mais correto devido ao seguinte: stackoverflow.com/questions/16595393/akka-or-reactor/… e stackoverflow.com/a/16674388/565110
David Riccitelli
Não entendo como este comentário agora está incorreto? Nada aqui contradiz a explicação da direção estratégica do Reactor.
Jon Brisbin
1
Peguei vocês. Sim, você entendeu corretamente. Obrigado por fazer essas perguntas! :)
Jon Brisbin