Estou projetando um sistema a partir do qual sincronizarei os dados corporativos do dispositivo móvel (que possui um aplicativo incorporado) que gera dados e os envia de volta ao servidor. Cada linha sincronizada gera um log de negócios específico no banco de dados.
Se o que sincronizar gerar dados com uma data (dentro dos dados de sincronização) inferior à data da última modificação dos meus dados comerciais, devo ignorá-los e apenas adicionar o banco de dados de logon. Depois que os dados enviados são processados, os dados são buscados no banco de dados e baixados no dispositivo.
Devido a esse download logo após a gravação, a sincronização deve ser síncrona. Ainda é possível ter um padrão de leitor / gravador se algo assim valer o suficiente para substituir minha solução existente. O mais importante é poder fazer o download de dados atualizados. Esses dados são buscados como um todo, não há diferenças implementadas no momento (podem vir mais tarde, mas isso não será um problema).
Eu posso ter várias sincronizações no mesmo objeto de negócios em execução, é improvável, mas pode acontecer e eu prefiro poder lidar com isso. A sincronização deve durar alguns segundos, mas não alguns minutos, a menos que você use o aplicativo móvel incorporado sem ressincronização por alguns dias.
Não é esperado que o volume de dados sincronizados seja grande, nem o processo de sincronização.
Então, acabei usando uma exclusão mútua no meu método de sincronização, mais precisamente, estou usando Java e coloquei um método de gravação sincronizado, não todo o processo de sincronização para não bloquear a sincronização somente leitura.
Eu gostaria de saber :
- Se assim faz sentido? Enquanto o volume e o tempo do processo de sincronização ainda forem aceitáveis.
- De uma maneira geral, quais conceitos devo examinar. Bônus: se houver alguma implementação desses conceitos em um módulo Spring.
fonte
Respostas:
Uma abordagem que venho investigando há algum tempo (com algum sucesso) para sincronizar os dados do cliente com os dados do servidor, sem depender de datas (que podem não ser confiáveis) ou solicitações síncronas, é uma combinação de patches JSON (talvez POJO s no seu caso) e fornecimento de eventos .
A idéia básica é que, em vez de armazenar o estado atual no cliente e no servidor, o cliente e o servidor armazenem uma lista de alterações e enviem mensagens entre si por meio de eventos ou solicitações de patch.
Portanto, em vez de o cliente enviar todos os dados mais uma data para o servidor, o cliente envia um evento, juntamente com um número de revisão que corresponde à última vez que o cliente pensa que os dados foram atualizados. Algo assim:
Depois que o servidor obtém esse evento (de forma assíncrona), ele o reconcilia com outros eventos que já podem ter recebido. Por exemplo, é possível que outro cliente que trabalhe com os mesmos dados já tenha modificado algumas coisas, e agora o número da revisão no servidor esteja em 5. Portanto, essa revisão precisará ser aplicada antes da aplicação dos últimos 2 e todos os os clientes precisarão ser notificados dessa alteração.
Quando o servidor termina, ele notifica todos os clientes interessados sobre as alterações feitas e o novo número de revisão atual. O cliente aplica essas alterações e atualiza seu número de revisão interna.
Sua milhagem pode variar, mas espero que ajude.
Editar: outro nome para essa abordagem, ou uma variação dela, é chamado de enfileiramento de mensagens , conforme mencionado nesta pergunta relacionada .
fonte
A primeira questão é usar datas como uma maneira de sincronizar dados. Tenho certeza de que não obtive todos os detalhes da sua solução, mas diria que:
As datas são geradas nos celulares? Nesse caso, você tem certeza de que o aplicativo executado nos celulares sempre usará as datas corretas? E um usuário mal-intencionado que é capaz de alterar a data do sistema em seu dispositivo móvel? E os usuários em diferentes fusos horários? Como @jeffrey disse, talvez não seja a melhor abordagem confiar nas datas geradas nos dispositivos.
Se eu entendi direito, você usa o Controle de Concorrência Otimista . Não vejo nada que esteja intrisicamente errado em sua abordagem.
Esta pergunta é sobre a implementação do bloqueio otimista na primavera . Talvez você possa encontrar alguma inspiração nele.
fonte