Tenho três projetos recebidos que compartilham um problema comum:
eles precisam ter a lógica em um sistema web e precisam de um aplicativo local (por exemplo, ponto de venda) que se comunique com esse sistema por meio de um serviço web RESTful.
Minha solução
A solução que eu consegui encontrar é implementar no serviço de enfileiramento de mensagens do aplicativo de desktop para armazenar operações enquanto o serviço está offline, mais precisamente, enfileiramento de mensagens assíncrono . No entanto, essa é a parte mais fácil (se essa for a melhor solução). Também estou preocupado com a sincronização de dados e resolução de conflitos.
O sistema principal precisa ser baseado na Web, já que um aplicativo da Web é necessário para relatórios e monitoramento pelas partes interessadas, e os serviços da Web lidam com solicitações de vários estabelecimentos.
Os clientes de desktop (preferencialmente thin) serão implementados com Java (mais especificamente Netbeans) e o sistema web com Symfony2. Dois dos projetos exigem integração de hardware para o cliente, portanto, tornar o aplicativo de desktop com tecnologia da Web (por exemplo, Appcelerator Titanium) pode ser um grande problema.
Minha pergunta
Qual é a melhor solução escalável, significando eficiência máxima com o mínimo de esforço (e de preferência sem custos adicionais, como a compra de um servidor de backup para operação local)?
Quem mais já lidou com isso antes? Como você resolveu seu problema? Que lições você pode compartilhar?
Como você lidou com a sincronização?
Editar: adicionada uma peça que faltava à minha pergunta no ponto 3
fonte
Faça tudo localmente e sincronize periodicamente .
Aqui está o que eu faria se fosse você (não estou ciente da estrutura de sincronização em Java como temos no .NET).
Mantenha um registro de data e hora no aplicativo local que reterá a última vez que você se conectou com sucesso.
Independentemente da hora em que você se reconectar, esse registro de data e hora será usado para extrair novos dados e enviar novos pedidos gerados localmente.
Você manterá dois carimbos de data e hora. Um para definir quando o pedido foi criado (local ou online) e outro para quando foi gravado pelo servidor.
Eu não recomendo o serviço de enfileiramento de mensagens para isso. Eu usei o MQ no passado para um site de comércio eletrônico que precisava ser conectado ao Navision. Tudo foi operado dentro da Navision, e as alterações foram enviadas ao site de comércio eletrônico através do MQ, incluindo o status do pedido e tudo, incluindo descrições de produtos, preços, etc. Novos pedidos também foram enviados à Navision pelo MQ.
fonte
Ou você deve observar implementações de bancos de dados de sistemas conectados ocasionalmente, que fazem o trabalho pesado de sincronizar clientes remotos com o servidor. (O SQL Server possui isso com o SQL CE até certo ponto, o Outlook faz isso).
Dessa forma, você pode fazer todas as alterações localmente em um banco de dados pequeno (ele mantém registros de data / hora lógicos etc.) para que você não precise se preocupar com relógios de PC etc.) e sempre que estiver on-line, sincronize-o com os principais servidor.
Eu não aceitaria uma solução REST quando o sistema não puder ficar online a maior parte do tempo.
fonte