Por que Akka é bom para simultaneidade?


9

Sou novo no Akka e no quadro de atores - tenho certeza de que estou perdendo algo óbvio, aceite minhas desculpas com antecedência.

Eu continuo lendo que um dos principais pontos para escolher Akka é a maneira como ele gerencia a simultaneidade.

Não está claro para mim por que Akka é tão especial; Entendo que existem muitos pequenos atores que são muito leves e rápidos; no entanto, como isso pode me ajudar quando dois usuários salvam um formulário ao mesmo tempo?

Eu ainda não precisaria de algum tipo de bloqueio de simultaneidade (pessimista / otimista / etc.)?


Você está perguntando por que os atores são bons para simultaneidade ou especificamente para Akka?
Script #

Wouldn't I still need some sort of concurrency lock (pessimistic/optimistic/etc..)?- Sim, mas essa é a responsabilidade do RDBMS subjacente, não do ator. Muito provavelmente o ator Akka não está falando diretamente com seu usuário. Em vez disso, o ator Akka e o usuário (outro ator, essencialmente) interagem diretamente com o banco de dados.
Robert Harvey

Respostas:


7

Uma das vantagens dos modelos de processamento de mensagens, como atores e agentes, é que os problemas tradicionais de simultaneidade (principalmente a sincronização do estado compartilhado) não são mais um problema. O ator pode manter o estado privado e atualizá-lo livremente, sem bloqueios. A estrutura do ator garante que apenas uma mensagem seja processada por vez. Com o processamento serializado, o código pode ser gravado de maneira livre de bloqueios.

No seu exemplo de usuários salvando um formulário, assumindo que o ator mantinha uma Lista de alguns dados de cada formulário, o ator pode atualizar a lista sem bloqueios, porque a estrutura garante que apenas um formulário será processado por vez. Tradicionalmente, você teria que bloquear os acessos à lista ou usar uma lista simultânea.

A estratégia de concorrência é um assunto um pouco diferente e ainda é de sua responsabilidade (sem que a estratégia seja a estratégia mais comum). Para mudar um pouco o seu exemplo, digamos que os dois usuários tentem atualizar a instância do mesmo formulário ao mesmo tempo. Sem estratégia de concorrência, as alterações de uma pessoa substituem a outra (provavelmente a última vence). Tudo bem, mas, na melhor das hipóteses, isso resulta em comportamento inesperado para o usuário cujas alterações foram substituídas. Se eles visualizarem o formulário que acabaram de alterar, haverá valores inesperados (do outro usuário). Na pior das hipóteses (quando não estamos falando apenas de atualizações de formulários, mas de pedidos de remessa), isso pode resultar em perdas de vários tipos (tempo, receita etc.).

O uso de uma estratégia de simultaneidade ajuda a identificar esses casos e a resolvê-los com base nas regras de negócios. Por exemplo, a Concorrência Otimista faz com que o usuário envie a versão do formulário que está atualizando. Quando o ator processa a alteração, percebe que o segundo usuário pensa que está atualizando a Versão 5 quando o formulário está realmente na Versão 6 por causa da atualização do primeiro usuário. Agora, pelo menos, podemos notificar o segundo usuário que o formulário já foi alterado desde que ele começou a editá-lo. Ou quaisquer regras que a empresa queira impor lá.

No caso de atualizar um formulário, você provavelmente não liga muito para simultaneidade (depende, eu acho). Mas em outros casos, pode ser uma coisa muito importante, pelo menos, poder verificar e lidar com violações. Você pode até querer ignorar a violação de concorrência, como se os usuários alterassem seções diferentes (para continuar a analogia do formulário). Ou se a alteração tiver um grande impacto nos negócios (uma grande encomenda), você deseja aceitá-la e resolver pequenos conflitos mais tarde (por exemplo, a atualização anual das informações de contato não foi concluída).

Acredito que a Akka tenha várias outras dimensões, como a maneira como lida com falhas, supervisores etc., que são considerações importantes para os devops.


9

Vou escrever sobre o Modelo de Ator em geral (não apenas Akka) em comparação com outros modelos de simultaneidade, como a simultaneidade clássica baseada em bloqueio e a pura memória transacional.

Vantagens

  1. Conceito mais fácil de entender e usar

    • A simultaneidade baseada em bloqueio é difícil; em particular, é muito difícil acertar, porque existem muitos conceitos para entender e usar para serem corretos e eficientes: bloqueios, semáforos, threads, sincronização, exclusão mútua, barreira de memória etc.

    • Atores, por outro lado, são um conceito mais abstrato; você tem atores que enviam e recebem mensagens. Não há necessidade de entender e usar conceitos de baixo nível, como a barreira da memória.

  2. Impõe imutabilidade

    • A mutabilidade é uma fonte de muitos erros e bugs na programação, especialmente em aplicativos multithread. O modelo de ator resolve esse problema impondo a imutabilidade.
  3. Menos propenso a erros

    • Por causa das duas razões acima
  4. Eficiente

    • Não é tão eficiente quanto uma boa gravação baseada em bloqueio, mas geralmente é mais eficiente que a memória transacional do software.
  5. Facilmente escalável

    • Teoricamente, pelo menos, o aplicativo deve ser dimensionado muito bem, adicionando mais atores para executar seus trabalhos. Com bloqueio é muito difícil de escalar.

Desvantagens

  1. Nem todos os idiomas impõem facilmente a imutabilidade;

    • Erlang, a linguagem que primeiro popularizou os atores tem imutabilidade em sua essência, mas Java e Scala (na verdade, a JVM) não impõem a imutabilidade.
  2. Ainda bastante complexo

    • Os atores são baseados em um modelo assíncrono de programação que não é tão direto e fácil de modelar em todos os cenários; é particularmente difícil lidar com erros e cenários de falha.
  3. Não impede deadlock ou fome

    • Dois atores podem estar no estado que aguardam a mensagem um do outro; portanto, você tem um impasse como nos bloqueios, embora seja muito mais fácil depurar. Com a memória transacional, no entanto, você está garantido sem conflitos.
  4. Não é tão eficiente

    • Por causa da imutabilidade imposta e porque muitos atores precisam mudar usando o mesmo encadeamento, os atores não serão tão eficientes quanto a concorrência baseada em bloqueio.

Conclusão

A simultaneidade baseada em bloqueio é a mais eficiente, mas é difícil de programar e propensa a erros; a memória transacional do software é a mais clara, fácil de programar e menos propensa a erros, mas também é a menos eficiente. Os atores estão em algum lugar entre esses dois modelos com todos os aspectos: fácil programação, eficiência e propensão a erros.


Para sua vantagem número 2, não deveria ser "A mutabilidade é uma fonte de muitos erros ..." e "... resolve esse problema proibindo a mutabilidade " em vez de " imutabilidade "? Além disso, a segunda frase tem duas menções redundantes para resolver o problema.
21bit15

@ 8bittree Sim, você está correto; eu escrevi errado. Caso não saiba, você pode editar as respostas para corrigir esses problemas.
M3th0dman 23/10/2015

Estou ciente disso, apenas reluto em fazer mudanças que invertam ou mudam drasticamente o significado de algo, caso seja um mal-entendido da minha parte.
8bittree

Você pode elaborar um impasse? Parece que você teria que construir uma configuração de ator muito incômoda (comunicação bidirecional) para encontrar isso. Se você estiver usando um padrão de estilo pedir-(A pergunta B para resposta, B processa a solicitação e respostas para o remetente pedido, mas nunca contata um diretamente) Eu não vejo como um impasse é possível
Daenyth

11
@Daenyth Concordo que você teria que usar uma construção estranha para alcançar um impasse com os atores; mas de uma perspectiva semelhante, você teria que usar uma construção estranha para obter um conflito com simultaneidade baseada em bloqueio (embora eu concorde que é muito mais fácil criar um conflito com um mutex do que com um ator). De qualquer forma, a idéia é que apenas a memória transacional garante que você não pode ter um impasse, independentemente da construção estranha que você escolheu implementar.
M3th0dman 23/10/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.