Passei a última semana mergulhando profundamente nos documentos da Akka e finalmente entendendo o que são os sistemas de atores e os problemas que eles resolvem.
Meu entendimento (e experiência) com os intermediários de mensagens JMS / AMQP tradicionais é que eles existem para fornecer o seguinte:
- Processamento assíncrono entre produtor e consumidor; e
- Garantia de entrega de mensagens, persistência, tentativas e fallbacks incluídos
Mas a Akka não fornece isso, sem toda a infraestrutura necessária e as despesas operacionais?
- No Akka, toda a comunicação com o ator é assíncrona e sem bloqueio; e
- Em Akka,
SupervisorStrategies
existem para realizar novas tentativas, fallback e escalação. Os atores podem ser configurados para persistir em praticamente qualquer tipo de loja, se isso também for um requisito.
Então, isso me fez pensar: se meu aplicativo usa o Akka, é necessário trazer os agentes JMS / AMQP (por exemplo, ActiveMQ, RabbitMQ, Kafka)? Em outras palavras, existe um caso de uso em que um novo aplicativo baseado em Akka também justificaria a introdução de um novo cluster do JMS / AMQP broker? Por que ou por que não?
O único argumento seria que talvez meu aplicativo Akka precise se integrar a outro sistema. Mas, nesse caso, o módulo Akka-Camel permite que a Akka aproveite a lista exaustiva e quase infinita de recursos de integração do Camel (TCP, FTP, ZeroMQ, a lista continua ...).
Pensamentos?
Respostas:
Modelo do ator
O modelo de ator é uma estratégia de ciência da computação para criar aplicativos que lidam com muita computação simultânea e processamento com estado. Não é a única estratégia, mas é uma abordagem muito bem testada, simples e confiável que move a computação para os atores , que se comunicam por meio de mensagens que eles processam uma de cada vez e em ordem.
O Akka é uma estrutura que implementa o modelo de ator e permite que você construa sistemas de atores com toda a infraestrutura e recursos já construídos (como usar JQuery em vez de javascript).
Mensagens
Os sistemas de mensagens são aplicativos que podem enviar e recuperar mensagens. Existem muitas variedades, de filas básicas a softwares para grandes empresas, com tópicos, pub / sub, persistência e outros recursos, mas o objetivo final é o mesmo. Salve alguns bytes em algum lugar e recupere-os mais tarde, com algum tipo de pedido. O principal caso de uso hoje é desacoplar sistemas e permitir o processamento assíncrono em diferentes agendamentos ou velocidades. RabbitMQ, NATS, Kafka, etc, são exemplos de sistemas de mensagens.
Comparação
O modelo Actor e a estrutura Akka são ferramentas de baixo nível que são uma ótima maneira de criar aplicativos , como filas de mensagens.
Você pode usar o Akka em vez de uma fila de mensagens? Certo. Se você está criando um software que já usa o modelo de ator, provavelmente não precisa de uma fila de mensagens externa, especialmente para enviar mensagens no mesmo encadeamento ou aplicativo. Você pode usar os recursos do Akka Remoting para enviar mensagens para outros sistemas de atores em execução em outras máquinas.
No entanto, isso torna os sistemas de mensagens obsoletos? Absolutamente não. Só porque você pode codificar tudo isso não significa que você precisa, especialmente quando um modelo de ator não é bom para o seu problema ou você precisa de diferentes idiomas, aplicativos, APIs externas, sistemas operacionais, bancos de dados etc. para se comunicar uns com os outros (sejam eles sistemas de atores ou não).
Se você só precisa passar algumas mensagens entre dois sistemas, use uma fila de mensagens. Se você precisar de processamento com estado escalável e mensagens de baixa latência no mesmo aplicativo, use o modelo de ator. Ambos existem em níveis completamente diferentes e como você os utiliza depende da solução que você está construindo.
Há uma ótima resposta no SO sobre esse mesmo modelo de ator x sistema de mensagens: /programming/5693346/when-to-use-actors-instead-of-messaging-solutions-such-as-websphere-mq- or-tibco
fonte