Como você lida / reagir à entrada de concorrência do usuário na camada de GUI?
-
08-07-2019 - |
Pergunta
O que são boas maneiras de simultaneidade de entrada do usuário pega?
Como as respostas para esta questão já descarta bloqueio de banco de dados , como você lida com entradas de usuários simultâneos em geral?
está travando sempre uma má idéia, mesmo que não é implementado por bloqueio de linha? Existem melhores práticas que não são o uso dependente caso? Quais foram suas experiências com suas estratégias?
EDIT: Estou ciente de lidar com a concorrência em um nível de dados por meio de operações: Se dois usuários simultanteously desencadear uma mudança de dados complexos, a transação vai lidar com isso.
Mas eu estou interessado em manipulação ou pelo menos reagir a eles sobre a camada de GUI. E se a alteração de dados é parte de uma operação demorada com interação do usuário?
digamos dois ou mais usuários de Let está editando o mesmo arquivo através de uma interface web. Em algum momento um dos usuários bate no botão Salvar. O que happes aos outros usuários?
- Será que eles vão ser notificado e / ou forçado a recarga? Ou será que o eventualmente, substituir as alterações do primeiro usuário?
- Shall I bloquear o arquivo e impedir que vários usuários editando o mesmo arquivo?
- Posso colocar todo o processo de edição em uma transação (Eu duvido, mas quem sabe ...)
Qual é a melhor maneira de lidar com isso e situações semelhantes? Existem outras estratégias?
Solução
Melhor estratégia depende do que deve acontecer a partir de (negócio) perspectiva do processo - também questões importantes são o que os usuários normalmente esperar eo que iria surpreendê-los menos, e, é claro, se é viável para implementar o que eles esperam.
Seu exemplo de editar um arquivo sobre web pode ser dividido da seguinte forma:
- cheques user1 out / recebe / download / abre arquivo v0
- cheques user2 out / recebe / download / abre arquivo v0
- user1 faz alterações à sua cópia do arquivo v0
- user2 faz alterações à sua cópia do arquivo v0
- user1 salva versão do arquivo v1 ao servidor
- user2 salva versão do arquivo v2 ao servidor
Note, que é típico para aplicações web, e na verdade para programas normais de escritório desktop, também, que os mais recentes mudanças que o usuário só torna se tornam disponíveis (para os outros) depois de salvar-los, o que significa que não é um caso de ter digitação colega aparecer no topo de sua no cópia do arquivo que você está editando.
A abordagem clássica de controle de versão para isso é que para nada muda user1, em comparação com a edição de desktop Normal / processo de poupança.
Para user2, no entanto, quando ele tenta salvar v2 para o servidor, o aplicativo deve verificar se houve quaisquer alterações ao arquivo da versão v0 desde usuários o download do mesmo. Uma vez que este é o caso, um sistema de controle de versão normalmente mostrar-lhe as duas versões (V1 e V2) no lado da tela a lado, e deixá-lo misturar-los e salvar a versão resultante (v3) para o servidor.
Para arquivos de texto existem uma série de ferramentas e sistemas, tanto em Unix e Windows que tentar automatizar o processo de modo que se as áreas de arquivo editado não se sobrepõem, as alterações são mescladas automaticamente.
A alternativa é bloqueio de arquivos para user2 até user1 tenha terminado de editá-lo.
Pondo edição em operação normalmente é de nenhuma relevância. É a operação final que tenta substituir ficheiro existente com a nova versão, que é importante. Edição acontece de forma independente em cada estação de trabalho usuários e não toca o servidor até o último ponto (economia).
Seu exemplo é, aliás, bem diferente de outra situação como a reserva de bilhetes de avião ou reservar uma consulta com um médico.
Quando a reserva de bilhetes, há um número limitado de assentos em um avião. É possível, devido ao fato de que a transferência de dados não é realmente instanteous para mais de uma pessoa para colocar uma reserva para o mesmo último assento em um avião.
Portanto, reserva deve ser pelo menos um processo de 2 etapas:
- mostra o sistema slots livres;
- user pede um dos slots livres (S1);
- sistema informa usuário se o slot é realmente ainda está livre, e se assim for, reservas para você.
- usuário conclui reserva.
O passo "realmente ainda livre" é porque a informação sobre usuário visualiza páginas web normalmente não é atualizada em tempo real, de modo que entre os passos 1 e 2, é possível que outro usuário solicitou o slot livre.
Outras dicas
Procure como lidar com "operações" em qualquer API idioma / banco de dados você está usando. Se você projetar estes corretamente ele vai lidar com isso para você.
E para entender a teoria, eu recomendo Sistemas de Couloris et al Distribuído mas existem muitos outros bons livros.