Pergunta

Estou implementando um servidor de documentos.Atualmente, se dois usuários abrirem o mesmo documento, modificá-lo e salvar as alterações, o estado do documento será indefinido (as alterações do primeiro usuário serão salvas permanentemente ou as do segundo).Isto é totalmente insatisfatório.Considerei duas possibilidades para resolver este problema:

A primeira é bloquear o documento quando for aberto por alguém pela primeira vez e desbloqueá-lo quando for fechado.Mas se a conexão de rede com o servidor for interrompida repentinamente, o documento permanecerá bloqueado para sempre.A solução óbvia é enviar pings regulares ao servidor.Se o servidor não receber K pings consecutivos (K > 1) de um cliente específico, os documentos bloqueados por esse cliente serão desbloqueados.Se esse cliente reaparecer, os documentos serão bloqueados novamente, caso alguém ainda não os tenha bloqueado.Isso também pode ajudar se o aplicativo cliente (em execução no navegador da Web) for encerrado inesperadamente, impossibilitando o envio de um sinal de 'encerrar, desbloquear meus documentos' ao servidor.

A segunda é armazenar múltiplas versões do mesmo documento salvas por diferentes usuários.Se as alterações no documento forem feitas em rápida sucessão, o sistema oferecerá a mesclagem de versões ou a seleção de uma versão preferida.Para otimizar o espaço de armazenamento, apenas as diferenças de documentos devem ser mantidas (assim como o software de controle de origem).

Qual método devo escolher, levando em consideração que a conexão com o servidor pode às vezes ser lento e indiferente?Como devem ser determinados os parâmetros (intervalo de ping, intervalo de sucessão rápida)?

P.S.Infelizmente, não consigo armazenar os documentos em um banco de dados.

Foi útil?

Solução

Minha sugestão seria algo parecido com a sua primeira.Quando o primeiro usuário (Bob) abre o documento, ele adquire um bloqueio para que os demais usuários possam ler apenas o documento atual.Se o usuário salvar o documento enquanto o utiliza, ele mantém o bloqueio.Somente quando ele sai do documento ele é desbloqueado e outras pessoas podem editá-lo.

Se o segundo usuário (Kate) abrir o documento enquanto Bob estiver com o bloqueio, Kate receberá uma mensagem dizendo que o documento não pode ser editado, mas ela poderá lê-lo até que o bloqueio seja liberado.

Então, o que acontece quando Bob adquire o bloqueio, talvez salva o documento uma ou duas vezes, mas sai do aplicativo deixando o bloqueio suspenso?

Como você mesmo disse, exigir que o cliente com bloqueio envie pings em uma determinada frequência é provavelmente a melhor opção.Se você não receber um ping do cliente por um determinado período de tempo, isso significa efetivamente que o cliente não está mais respondendo.Se este for um aplicativo da web, você pode usar javascript para os pings.O último documento salvo libera seu bloqueio e o Kate agora pode adquiri-lo.

Um ping pode conter o nome do documento no qual o cliente está bloqueado e o servidor pode calcular quando o último ping desse documento foi recebido.

Outras dicas

A primeira opção que você descreve é ​​essencialmente um modelo de bloqueio pessimista, enquanto a segunda é um modelo otimista.Qual escolher realmente se resume a uma série de fatores, mas essencialmente se resume a como a empresa deseja funcionar.Por exemplo, seria indevidamente inconveniente para os usuários se um documento que eles precisavam editar fosse bloqueado por outro usuário?O que acontece se um documento estiver bloqueado e alguém sair de férias com o seu cliente conectado?Qual é a provável disputa para cada documento - ou seja,qual a probabilidade de o mesmo documento ser modificado por dois usuários ao mesmo tempo? qual a probabilidade de as modificações serem localizadas em um único documento?(Se a mesma seção for modificada regularmente, a execução de uma mesclagem poderá demorar mais do que simplesmente fazer as alterações novamente).

Supondo que a contenção seja relativamente baixa e/ou o tamanho de cada alteração seja bastante pequeno, então eu provavelmente optaria por um modelo otimista que resolva conflitos usando uma mesclagem automática ou manual.Um número de versão ou uma soma de verificação do conteúdo do documento pode ser usado para determinar se uma mesclagem é necessária.

Atualmente os documentos são publicados por um grupo limitado de pessoas, cada uma delas trabalhando em um assunto distinto.Assim, o inconveniente introduzido pelos bloqueios é minimizado.A maioria das pessoas amplia documentos existentes e corrige erros neles contidos.

Falando sobre o modelo pessimista, o cenário de ‘cliente deixado conectado por N dias’ poderia ser evitado definindo a data de expiração do bloqueio para, digamos, um dia antes da data de início do bloqueio.Como os documentos editados não são de forma alguma de missão crítica e raramente são modificados por vários usuários, isso pode ser suficiente.

Agora considere o modelo otimista.Como devem ser detectadas as diferenças, se os documentos têm alguma estrutura regular (digamos, hierárquica)?Se não?Quais são as chances de uma mesclagem automática bem-sucedida nesses casos?

A situação torna-se mais complicada, porque alguns dos documentos (editados pelo grupo de utilizadores 'admins') contêm informações de configuração importantes (índice global do documento, funções de utilizador, etc.).Na minha opinião, os bloqueios são mais vantajosos justamente para esse tipo de informação, porque não são alterados no dia a dia.Portanto, alguma solução híbrida pode ser aceitável.

O que você acha?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top