Sincronização com sistema offline

9

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 :

  1. Se assim faz sentido? Enquanto o volume e o tempo do processo de sincronização ainda forem aceitáveis.
  2. De uma maneira geral, quais conceitos devo examinar. Bônus: se houver alguma implementação desses conceitos em um módulo Spring.
Walfrat
fonte
O que causa o offline? Quero dizer, quando o dispositivo está offline, significa que não há acesso apenas ao servidor ou à Internet também?
LAIV
Não tem acesso à internet. Ou não com frequência.
Walfrat 07/07
Se você tiver vários clientes / servidores sincronizando, primeiro decida o domínio dos dados , caso algo seja diferente. Se você considerar apenas conexões intermitentes e vários clientes, definitivamente não há como fazer isso de forma incremental.
tofro
O domínio de dados @tofro é fácil de determinar no meu caso, por isso não é um problema. No entanto, por que não seria possível fazer isso de forma incremental com conexões intermitentes? Não devo usar apenas a última data de sincronização? O único problema no meu caso em usar essa data seria como saber que os dados que estão atualmente no meu dispositivo foram movidos e devem ser excluídos no dispositivo.
Walfrat
Pela sua descrição, entendi que o mesmo item de dados pode ser alterado no servidor ou em um ou mais clientes múltiplos. Como você sincronizaria em três vias um item de dados que foi para o celular nº 1, depois foi alterado no servidor, passou para o celular nº 2 e foi alterado para lá, então o celular nº 1 se conecta (com um celular nº 2 desconectado)?
tofro

Respostas:

1

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:

Server.send("MODIFY FOO", 3);

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 .

Jeffrey Sweeney
fonte
O sistema pode ficar offline (sem acesso ao servidor) por alguns dias e deve registrar a data em que o evento ocorreu, não quando o evento foi sincronizado com o servidor. É por isso que eu tenho que usar datas. Também tenho um número de revisão para o optimisticLocking, mas pelo mesmo motivo, 2 dispositivos podem baixar a versão X de um POJO e, quando eles são sincronizados posteriormente, cada um envia eventos que devem gerar uma versão X + 1 e X + 2. E os dispositivos não podem se comunicar.
218 Walfrat
O número da revisão nesta resposta é sempre gerado no servidor, o cliente envia números de revisão antigos, não precisa conhecer outros clientes, pois o incremento da revisão não é de sua responsabilidade. Essa resposta não menciona a resolução de conflitos, que é a parte mais importante da solução proposta.
Basilevs
0

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:

  1. 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.

  2. Se eu entendi direito, você usa o Controle de Concorrência Otimista . Não vejo nada que esteja intrisicamente errado em sua abordagem.

  3. Esta pergunta é sobre a implementação do bloqueio otimista na primavera . Talvez você possa encontrar alguma inspiração nele.

danidemi
fonte
Preciso registrar a data em que a ação foi executada, pois estou preso à data do celular. A data do celular é ressincronizada frequentemente com o sistema. Somente dispositivos registrados podem sincronizar com o servidor. Quanto à segurança é outra preocupação deixado para agora (autenticação do dispositivo X509, ...)
Walfrat
A data pode ser registrada como mais um campo de dados, não sendo necessário tratá-la como um token de sincronização.
Basilevs