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.)?
concurrency
locks
actor-model
akka
abx78
fonte
fonte
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.Respostas:
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.
fonte
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
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.
Impõe imutabilidade
Menos propenso a erros
Eficiente
Facilmente escalável
Desvantagens
Nem todos os idiomas impõem facilmente a imutabilidade;
Ainda bastante complexo
Não impede deadlock ou fome
Não é tão eficiente
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.
fonte