Bom caso de uso para Akka [fechado]

605

Ouvi muitos elogios sobre o Akka framework (plataforma de serviço Java / Scala), mas até agora não vi muitos exemplos reais de casos de uso para os quais seria bom. Então, eu estaria interessado em ouvir sobre as coisas que os desenvolvedores usaram com sucesso.

Apenas uma limitação: não inclua o caso de escrever um servidor de bate-papo. (por quê? como isso foi usado em excesso como um exemplo para muitas coisas semelhantes)

StaxMan
fonte
10
Não é mais fácil começar com o problema e encontrar uma solução para ele do que ter uma solução e procurar um problema para aplicá-lo? Meu palpite é que, em vez de usar o RMI, o Akka e seus atores parecem muito mais fáceis / simples de escrever código.
20910 Kennet
67
Sim, se eu tivesse um problema específico a resolver. Não estou procurando uma "desculpa para usar o Akka", mas estou interessado em aprender um pouco mais. Isso pode ajudar a resolver problemas futuros também, mas é principalmente para o processo de aprendizado contínuo.
StaxMan
Não é questão relacionada mas sobre a aplicação AKKA para aplicação existente + alguns casos de uso: stackoverflow.com/questions/16595685/...
ses
2
O Akka é uma solução melhor sobre o JMS ou um sistema de filas de mensagens distribuídas no estilo MQ. Essa é a melhor maneira de entender por mim mesmo, que recentemente fez a mesma pergunta: "Eu entendo como usá-lo e vejo onde poderia usá-lo, mas não consigo ver onde isso proporcionaria uma vantagem real". As principais premissas do design por trás do Akka são muito melhores do que aquelas por trás do JMS / MQ, especificamente em relação ao isolamento do processo, design sem bloqueio e manipulação de novas tentativas / falhas. Em segundo lugar, a API é muito mais elegante que as ferramentas JMS / MQ.
precisa saber é o seguinte
2
@ user2684301 hmmh. Acho essa resposta um pouco injusta, da maneira das maçãs às laranjas. MQs são (logicamente) blocos de construção simples que fazem muito menos que o Akka, e eu não os compararia lado a lado. Mas acho que se eu o leio como "comparado a sistemas distribuídos construídos usando JMS, escritos declarativamente", então faria mais sentido.
precisa saber é o seguinte

Respostas:

321

Eu o usei até agora em dois projetos reais com muito sucesso. ambos estão no campo de informações de tráfego quase em tempo real (tráfego como em carros nas rodovias), distribuídos por vários nós, integrando mensagens entre várias partes, sistemas de back-end confiáveis. Ainda não tenho a liberdade de especificar detalhes sobre os clientes, quando eu receber o OK, talvez ele possa ser adicionado como referência.

A Akka realmente se destacou nesses projetos, apesar de termos começado na versão 0.7. (estamos usando scala por sinal)

Uma das grandes vantagens é a facilidade com que você pode compor um sistema a partir de atores e mensagens quase sem caldeira, dimensiona-se extremamente bem sem todas as complexidades da segmentação manual e você recebe mensagens assíncronas passando entre objetos quase de graça.

É muito bom na modelagem de qualquer tipo de manipulação de mensagens assíncronas. Eu preferiria escrever qualquer tipo de sistema de serviços (web) nesse estilo do que qualquer outro estilo. (Você já tentou escrever um serviço da Web assíncrono (lado do servidor) com JAX-WS? Isso é muito complicado). Então, eu diria que qualquer sistema que não deseja travar em um de seus componentes, porque tudo é chamado implicitamente usando métodos síncronos, e que um componente está travando em alguma coisa. É muito estável e a solução para falhas do supervisor let-it-crash + realmente funciona bem. Tudo é fácil de configurar programaticamente e não é difícil fazer o teste de unidade.

Depois, existem os excelentes módulos complementares. O módulo Camel realmente se conecta bem ao Akka e permite um desenvolvimento tão fácil de serviços assíncronos com pontos de extremidade configuráveis.

Estou muito feliz com a estrutura e ela está se tornando um padrão defacto para os sistemas conectados que construímos.

Raymond Roestenburg
fonte
14
Qual é o benefício dessa abordagem em comparação ao uso de um back-end de mensagens (por exemplo, ActiveMQ) para a passagem de mensagens em sua opinião?
Magiconair 23/09/12
27
Os produtos MQ são realmente para um caso de uso diferente. garantias diferentes e desempenho muito diferente. Os produtos MQ precisam de muita configuração; você não usaria filas nesse produto da mesma maneira que usaria objetos. Os atores são cidadãos de primeira classe em akka; você os usa como quiser, semelhante à maneira como usaria objetos; portanto, há muito menos sobrecarga no modelo de programação e na configuração. Produtos MQ que você usaria mais para integrar-se a outros sistemas externos, não para criar os 'internos' de um sistema, algo para o qual você usaria atores.
Raymond Roestenburg
26
O novo URL para o estudo de caso do DBP é downloads.typesafe.com/website/casestudies/…
Bas
2
Com base no @RaymondRoestenburg, re: sistemas e alternativas MQ. O RabbitMQ, por exemplo, é construído sobre uma linguagem de programação baseada em atores, Erlang. Essa é uma maneira de pensar sobre a relação (e distinção) entre ator e MQ. Enquanto o Apache Spark não é baseado em trabalho e fila nem em ator, o BUT pode ser usado com o Akka: Typesafe demonstra como usar o Spark Streaming com o Akka .
Driftcatcher
6
@RaymondRoestenburg Você não mencionou que o modelo do ator atual promove uma estrutura parecida com espaguete. O livro "Akka em ação" que você escreveu é a melhor demonstração para esse "recurso". Os exemplos de código lidam com histórias bastante básicas. No entanto, o fluxo de trabalho é muito difícil de compreender e seguir a partir do código. Um problema relacionado é que o código Akka estará irreversivelmente em toda a lógica de negócios da maneira mais intrusiva que você possa imaginar. Muito mais do que qualquer outra estrutura que não seja ator. É simplesmente impossível escrever um fluxo de trabalho básico sem dissecá-lo em diferentes seções separadas.
extasiada
222

Disclaimer: Eu sou o PO da Akka

Além de oferecer um smorgasbord de simultaneidade que é muito mais simples de raciocinar e se corrigir (atores, agentes, simultaneidade de fluxo de dados) e com controle de simultaneidade na forma de STM.

Aqui estão alguns casos de uso que você pode considerar:

  1. Processamento de transações (jogos online, finanças, estatísticas, apostas, mídias sociais, telecomunicações, ...)
    • ampliar, dimensionar, tolerância a falhas / HA
  2. Serviço de back-end (qualquer setor, qualquer aplicativo)
    • serviço REST, SOAP, cometa etc
    • agir como hub de mensagens / camada de integração
    • ampliar, dimensionar, tolerância a falhas / HA
  3. Simultaneidade / paralelismo de snap-in (qualquer aplicativo)
    • Corrigir
    • Simples de trabalhar e entender
    • Basta adicionar os jars ao seu projeto JVM existente (use Scala, Java, Groovy ou JRuby)
  4. Processamento em lote (qualquer setor)
    • Integração de camelo para conectar-se a fontes de dados em lote
    • Os atores dividem e conquistam as cargas de trabalho em lote
  5. Hub de comunicações (telecomunicações, mídia da web, mídia móvel)
    • ampliar, dimensionar, tolerância a falhas / HA
  6. Servidor de jogos (jogos online, apostas)
    • ampliar, dimensionar, tolerância a falhas / HA
  7. BI / datamining / trituração de uso geral
    • ampliar, dimensionar, tolerância a falhas / HA
  8. insira outros casos de uso legais aqui
Viktor Klang
fonte
10
Entendo os benefícios do Futuro e do STM, mas não encontro bons casos de uso para os atores. Para um jogo ou servidor de apostas, qual é a vantagem de usar o Actors vs vários servidores de aplicativos atrás de um balanceador de carga?
Martin Konicek
8
@ViktorKlang POs! = Líder técnico. Eles trabalham juntos, mas são papéis diferentes.
taylorcressy
79

Um exemplo de como o usamos seria em uma fila prioritária de transações com cartão de débito / crédito. Temos milhões deles e o esforço do trabalho depende do tipo de string de entrada. Se a transação é do tipo CHECK, temos muito pouco processamento, mas se é um ponto de venda, há muito o que fazer, como mesclar com metadados (categoria, rótulo, tags, etc.) e fornecer serviços (alertas por email / sms, detecção de fraudes, baixo saldo de fundos, etc). Com base no tipo de entrada, compomos classes de várias características (chamadas mixins) necessárias para lidar com o trabalho e depois executar o trabalho. Todos esses trabalhos entram na mesma fila no modo em tempo real de diferentes instituições financeiras. Depois que os dados são limpos, eles são enviados para diferentes armazenamentos de dados para persistência, análise ou envio por push a uma conexão de soquete ou para o ator Lift cometa. Os atores que trabalham são constantemente auto-balanceados, para que possamos processar os dados o mais rápido possível. Também podemos obter serviços adicionais, modelos de persistência e para pontos críticos de decisão.

A mensagem de estilo Erlang OTP transmitida na JVM é um ótimo sistema para o desenvolvimento de sistemas em tempo real nas costas das bibliotecas e servidores de aplicativos existentes.

O Akka permite que você faça a passagem de mensagens como faria em um mas com velocidade! Também fornece ferramentas na estrutura para gerenciar a grande quantidade de conjuntos de atores, nós remotos e tolerância a falhas que você precisa para sua solução.

Wade Arnold
fonte
1
Então, é justo dizer que é o caso de (algumas) solicitações de longa latência, em que o encadeamento único por solicitação não seria bem dimensionado?
StaxMan
7
Eu acho que a parte importante da programação de atores em geral é o fluxo de mensagens. Depois de começar a conceituar fluxos de dados que não têm efeitos colaterais, você deseja que ocorra o maior número possível de fluxos por nó. Isso é muito diferente da computação de alto desempenho, onde você tem trabalhos semi-homogêneos que não enviam mensagens e levam muito tempo para serem processados. Eu acho que uma implementação de Fibonacci baseada em ator é um exemplo muito limitante, pois não mostra por que usar atores, mas apenas esses atores paralisam as tarefas. Pense na arquitetura orientada a eventos para casos de uso.
Wade Arnold
4
A arquitetura orientada a eventos é uma maneira diferente de pensar sobre os problemas. Vale a pena ler o Erlang OTP in Action de trip, se você estiver pensando em codificar no Akka. Muitas das construções no akka são influenciadas pelo Erlang OTP e o livro fornece os princípios dos motivos pelos quais Jonas Boner construiu o akka api da maneira que ele fez. Akka é uma grande montanha em que você está! Se seus atores são persistentes através de mudanças de estado que você realmente precisa 10k escreve uma segunda sustentada
Wade Arnold
8
Wade, como vocês lidam com garantias de mensagens? você menciona: (alertas por email / sms, detecção de fraude, saldo baixo de fundos, etc.), presumo que estes sejam potencialmente enviados a atores remotos? Como você garante que essas operações realmente aconteceram? e se o nó falhar ao processar um alerta de fraude? Isso se foi para sempre? Você tem um sistema eventualmente consistente que o limpa? obrigado!
James
2
Boa pergunta, James. É óbvio que ele se encaixa em um sistema em que a resposta não é necessária com urgência. Por exemplo, você pode processar faturas de cartão de crédito; calcular; enviar e-mail etc. Eu realmente me pergunto como essas coisas (transação) são tratadas quando uma resposta é necessária. No fim; se uma solicitação for feita de externo (usuário da Internet; um representante da central de atendimento etc.); ele ou ela espera uma resposta. Como posso ter certeza de que as subtarefas (que são executadas de forma assíncrona) são executadas; em uma transação xa para que eu possa retornar a resposta?
Kaan Yy
44

Usamos o Akka para processar chamadas REST de forma assíncrona - juntamente com o servidor da Web assíncrono (baseado em Netty), podemos obter uma melhoria de 10 vezes no número de usuários atendidos por nó / servidor, comparando com o modelo tradicional de solicitação por usuário / thread.

Diga ao seu chefe que a sua conta de hospedagem da AWS vai cair pelo fator 10 e é um acéfalo! Shh ... não conte para a Amazon embora ... :)

piotrga
fonte
3
E eu esqueci de mencionar que a natureza monádico de akka futuros, o que leva a código paralelo muito mais limpo salvos nos milhares de manutenção do código ...
piotrga
8
Presumo que as chamadas sejam de alta latência e baixa taxa de transferência? Como fazer chamadas para outros servidores, aguardando resposta (proxy)?
StaxMan
38

Estamos usando o Akka em um projeto Telco em larga escala (infelizmente não posso divulgar muitos detalhes). Os atores Akka são implantados e acessados ​​remotamente por um aplicativo da web. Dessa forma, temos um modelo RPC simplificado baseado no protobuffer do Google e alcançamos o paralelismo usando o Akka Futures. Até agora, este modelo funcionou brilhantemente. Uma observação: estamos usando a API Java.

Luciano Fiandesio
fonte
Você poderia nos contar um pouco mais, por favor? O Afaik Futures não pode ser enviado por fio (serializado). Você usa muitos futuros e poucos atores ou uma mistura entre os dois ou ...? Você usa protobuf para toda a serialização e envia como uma mensagem para os atores?
precisa
Parece que poderia ter sido tratado com a mesma facilidade sem o Akka.
precisa
1
A TDC é uma empresa de telecomunicações no caso da Fiaddesio.
Roman Kagan
37

Se você abstrair o servidor de bate-papo em um nível superior, obterá a resposta.

A Akka fornece um sistema de mensagens semelhante à mentalidade de "deixar bater" de Erlang.

Portanto, exemplos são coisas que precisam de níveis variados de durabilidade e confiabilidade das mensagens:

  • Servidor de bate-papo
  • Camada de rede para um MMO
  • Bomba de dados financeiros
  • Sistema de notificação para um aplicativo para iPhone / celular / qualquer que seja
  • Servidor REST
  • Talvez algo parecido com o WebMachine (suposição)

As coisas boas do Akka são as opções que ele oferece para persistência, é implementação do STM, servidor REST e tolerância a falhas.

Não fique chateado com o exemplo de um servidor de bate-papo, pense nele como um exemplo de uma certa classe de solução.

Com toda sua excelente documentação, sinto que uma lacuna é essa pergunta exata, casos de uso e exemplos. Tendo em mente os exemplos não são triviais.

(Escrito apenas com a experiência de assistir a vídeos e brincar com a fonte, não implementei nada usando o akka.)

tylerweir
fonte
2
Obrigado - não quis dizer que o servidor de bate-papo é necessariamente ruim, apenas que eu gostaria de exemplos complementares; mais fácil ter uma melhor idéia do potencial.
StaxMan
Curioso para saber como o servidor REST se encaixa aqui? Você o mencionou no contexto do servidor assíncrono no estilo Node.js. Obrigado por compartilhar os casos de uso de exemplo. Eu os achei úteis.
software.wikipedia
24

Usamos o Akka em vários projetos em andamento, o mais interessante deles relacionado ao reparo de colisão de veículos. Principalmente no Reino Unido, mas agora expandindo para os EUA, Ásia, Australásia e Europa. Utilizamos atores para garantir que as informações sobre reparo em acidentes sejam fornecidas em tempo real para permitir o reparo seguro e econômico de veículos.

A questão com a Akka é realmente mais 'o que você não pode fazer com a Akka'. Sua capacidade de integração com estruturas poderosas, sua poderosa abstração e todos os aspectos de tolerância a falhas o tornam um kit de ferramentas muito abrangente.

Rossputin
fonte
Então, qual aspecto você mais gosta se tivesse que escolher? Integração existente para outras estruturas, tolerância automática a falhas ou algo mais?
precisa saber é o seguinte
6
De uma perspectiva pessoal, é o nível de abstração elevado que Akka traz para a mesa que eu mais gosto. Da perspectiva da empresa, são os recursos de integração. Tem que ganhar a vida e Akka abrange negócios e lazer tanto muito bem :-)
rossputin
Você poderia elaborar como está o fluxo de mensagens? O usuário é a pessoa em uma oficina e insere detalhes sobre a falha em um formulário http e envia os dados para o servidor. Isso cria uma mensagem que é tratada pelo akka? Para fazer o que com esta mensagem? Extrair as informações inseridas para consultar o banco de dados e enfileirar a resposta para enviá-la de volta ao front-end da web?
Surfmuggle 26/09/18
24

Você pode usar o Akka para vários tipos diferentes de coisas.

Eu estava trabalhando em um site, onde migrei a pilha de tecnologia para Scala e Akka. Nós o usamos para praticamente tudo o que aconteceu no site. Mesmo que você pense que um exemplo de bate-papo é ruim, todos são basicamente iguais:

  • Atualizações ao vivo no site (por exemplo, visualizações, curtidas, ...)
  • Mostrando comentários de usuários ao vivo
  • Serviços de notificação
  • Pesquisa e todos os outros tipos de serviços

Especialmente, as atualizações ao vivo são fáceis, pois se resumem ao que é um exemplo de bate-papo. A parte de serviços é outro tópico interessante, porque você pode simplesmente optar por usar atores remotos e, mesmo que seu aplicativo não esteja em cluster, você pode implantá-lo em diferentes máquinas com facilidade.

Também estou usando o Akka para um aplicativo de autorouter de PCBs com a idéia de poder escalar de um laptop para um data center. Quanto mais energia você der, melhor será o resultado. Isso é extremamente difícil de implementar se você tentar usar a simultaneidade usual, porque o Akka também oferece transparência de localização.

Atualmente, como um projeto de tempo livre, estou construindo uma estrutura da Web usando apenas atores. Novamente, os benefícios são a escalabilidade de uma única máquina para um cluster inteiro de máquinas. Além disso, o uso de uma abordagem orientada a mensagens torna o serviço de software orientado desde o início. Você tem todos esses componentes legais, conversando entre si, mas não necessariamente se conhecendo, vivendo na mesma máquina, nem mesmo no mesmo data center.

E desde que o Google Reader foi desligado, comecei com um leitor de RSS, usando o Akka, é claro. É tudo sobre serviços encapsulados para mim. Como conclusão: o próprio modelo de ator é o que você deve adotar primeiro e o Akka é uma estrutura muito confiável, ajudando você a implementá-lo com muitos benefícios que você receberá ao longo do caminho.

Joa Ebert
fonte
Olá Joe, você poderia explicar como as mensagens são usadas para atualizar o site? Você tem um sistema para o autor do conteúdo; ele cria um novo artigo e pressiona salvar. Isso cria uma mensagem que é enviada para vários servidores que lidam com o tráfego de entrada. Cada servidor processa a mensagem de atualização assim que possível. Cada nova solicitação de navegador recebe uma versão atualizada da página? Obrigado
surfmuggle 26/09/18
18

Estamos usando o akka com seu plug-in camel para distribuir nossa análise e processamento de tendências para twimpact.com . Temos que processar entre 50 e 1000 mensagens por segundo. Além do processamento de vários nós com camelo, também é usado para distribuir o trabalho em um único processador para vários trabalhadores para obter o máximo desempenho. Funciona muito bem, mas requer alguma compreensão de como lidar com congestionamentos.

Matthias L. Jugel
fonte
você também está usando a tolerância a falhas da Akka?
precisa
E quanto ao Spark Streaming se você tiver acesso ao cluster Spark?
Skjagini 18/09/19
18

Eu estava tentando minhas mãos no Akka (Java api). O que tentei foi comparar o modelo de concorrência baseado em ator da Akka com o modelo de concorrência Java simples (classes java.util.concurrent).

O caso de uso era um mapa canônico simples, reduzindo a implementação da contagem de caracteres. O conjunto de dados era uma coleção de seqüências geradas aleatoriamente (400 caracteres de comprimento) e calculava o número de vogais nelas.

Para a Akka, usei um BalancedDispatcher (para balanceamento de carga entre threads) e RoundRobinRouter (para manter um limite nos meus atores de função). Para Java, usei a técnica simples de junção de bifurcação (implementada sem nenhum algoritmo de roubo de trabalho) que mapearia / reduziria execuções e juntaria os resultados. Resultados intermediários foram realizados em filas de bloqueio para tornar a junção o mais paralela possível. Provavelmente, se não estou errado, isso imitaria de alguma forma o conceito de "caixa de correio" dos atores Akka, onde eles recebem mensagens.

Observação: Até cargas médias (~ 50000 entradas de string), os resultados foram comparáveis, variando ligeiramente em diferentes iterações. No entanto, conforme eu aumentava minha carga para ~ 100000, a solução Java era interrompida. Eu configurei a solução Java com 20 a 30 threads sob essa condição e ela falhou em todas as iterações.

Aumentar a carga para 1000000, também foi fatal para a Akka. Posso compartilhar o código com qualquer pessoa interessada em fazer uma verificação cruzada.

Então, para mim, o Akka parece melhor do que a solução multithread Java tradicional. E provavelmente o motivo é a mágica oculta de Scala.

Se eu puder modelar um domínio de problema como uma mensagem orientada a eventos passando uma, acho que o Akka é uma boa opção para a JVM.

Teste realizado em: versão Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bits. 3GB de RAM. Processador Intel Core i5, velocidade de clock de 2,5 GHz

Observe que o domínio do problema usado para o teste pode ser debatido e tentei ser o mais justo que meu conhecimento de Java permitia :-)

sutanu dalui
fonte
3
"Eu posso compartilhar o código com qualquer pessoa interessada em fazer uma verificação cruzada". Eu gostaria, se você não se importa.
N1r3 5/09/12
3
Também gostaria do código, você pode postar um link no github?
quer
Obrigado pelo seu interesse. Infelizmente, tenho alguns problemas para configurar um repositório do github. Se você puder me enviar seus e-mails, eu posso enviar um e-mail com o código-fonte. E lamenta por uma resposta tardia!
sutanu dalui 31/01
@sutanudalui Você ainda tem o código, por favor, para que eu possa compartilhar meu e-mail?
Jay
16

Usamos Akka em sistemas de diálogo falado ( primetalk ). Internamente e externamente. Para executar simultaneamente muitos canais de telefonia em um único nó do cluster, é obviamente necessário ter alguma estrutura de multithreading. Akka funciona perfeitamente. Temos um pesadelo anterior com a concorrência de java. E com a Akka é como um balanço - simplesmente funciona. Robusto e confiável. 24 * 7, sem parar.

Dentro de um canal, temos um fluxo de eventos em tempo real que são processados ​​em paralelo. Em particular: - reconhecimento de fala automático demorado - é feito com um ator; - produtor de saída de áudio que mistura algumas fontes de áudio (incluindo fala sintetizada); - a conversão de texto em fala é um conjunto separado de atores compartilhados entre canais; - processamento semântico e de conhecimento.

Para fazer interconexões do processamento complexo de sinais, usamos o SynapseGrid . Ele tem o benefício da verificação em tempo de compilação do DataFlow nos sistemas de atores complexos.

Arseniy Zhizhelev
fonte
14

Eu recentemente implementei o exemplo canônico de redução de mapa no Akka: contagem de palavras. Portanto, é um caso de uso da Akka: melhor desempenho. Foi mais um experimento dos atores de JRuby e Akka do que qualquer outra coisa, mas também mostra que Akka não é apenas Scala ou Java: funciona em todas as linguagens da JVM.

Daniel Ribeiro
fonte
Você sabe o que é responsável por um melhor desempenho (e também comparado a qual alternativa)? Isso se deve ao uso do JRuby na JVM (vs Ruby nativo), devido à E / S sem bloqueio ou algo mais?
precisa saber é o seguinte
2
A comparação que escrevi foi: Jruby sequencial VS Jruby com atores. Portanto, a única coisa que pode ser responsável por uma execução mais rápida é a participação dos atores. Nenhuma E / S participou das experiências (um arquivo é carregado do disco, mas é feito antes que o cronômetro de referência seja definido).
Daniel Ribeiro
Eu tenho implementado recentemente um mapa reduzir exemplo bem, mas é simplesmente baunilha java github.com/chaostheory/jibenakka
teoria do caos