Pessoal, gostaria de discutir um pouco a respeito de uma melhor forma de aplicar uma integração entre 2 sistemas que compartilham informações, mas que estão armazenadas em bancos de dados diferentes, por questões técnicas. Já trabalhei de diversas maneiras e já vi também de tudo um pouco neste tipo de integração e gostaria de discutir a respeito.
Não queria ouvir respostas do tipo… contrate um consultor!
Vamos imaginar o seguinte cenário:
Temos um cadastro de clientes, e este cadastro pode ser atualizado tanto por uma solução desktop, dentro de uma empresa, quanto pelos próprios clientes (solução web).
A empresa esta localizada em uma área rural e o link é de 64Kbits… Existem cerca de 10 funcionários trabalhando sob. este cadastro. O baixo link impossibilita um unico sistema Web, para ambos os acessos. Não há na região possibilidade de aumentar este link. Desta maneira temos 2 servidores de banco de dados, um dentro da empresa e outro na internet hospedado em um grande provedor e 2 aplicações, uma desktop que manipula o banco de dados local e outra que manipula o banco remoto.
Precisamos integrar estes dados, não exatamente em tempo real (por causa da limitação do link), mas com o menor delay possível.
Vou detalhar agora algumas soluções que já vi por ai e até pensei em fazer, para discussão e gostaria que o pessoal desse sua opnião a respeito e sugerisse a “melhor solução” ou a melhor forma de resolver este problema.
-
Integração entre banco de dados.
Os bancos SQL Server (ou outro) estarem configurados, para replicar as alterações entre eles. Acredito que esta seria a melhor solução, visto que estamos trabalhando na camada de banco de dados, e com uma solução nativa sem necessitar desenvolvimento. Entretanto vejo alguns problemas:
Geralmente há excesso de tráfego gerado pelas ferramentas, problemas com locks e “destruição” da banda do pequeno link disponível. Talvez essa seja a melhor solução quando se tem um bom link. -
Integração através de Web Services.
Sempre que alguma alteração for realizada em algum dos bancos, é acionado um Webservice para atualizar o banco remoto. O problema que vejo neste caso é que dependendo do congestionamento da banda naquele momento, a gravação poderá demorar e causar insatisfação do usuário. -
Criação de um robô
Este robô, baseado em algum timestamp de alteração dos dados, coleta uma série de dados de uma lado e sincroniza com o outro. O robô pode rodar dentro do próprio banco de dadados (Job/Procedure), como em um aplicativo a parte. O problema que vejo é como tratar situações que tiveram alteração dos 2 lados no mesmo intervalo de tempo (já que não se tem locks) e também o fato de trafegar muitos dados durante a execução do robô. A maior parte deste tipo de solução deixa o robô rodar de madrugada e acaba gerando um atrase de até um dia na atualização das informações. -
Utilizar servidores de fila e MDBs.
Uma solução que pensei ser possível mas não se seria uma boa, seria gravar as alterações (uma espécie de logs de transações), através de mensagens em um servidor de fila… desta forma implementaria MDBs para efetuar a sincronização dos registros através de Webservices. Poderia também ser escalavel dependendo do horário. Uma duvida seria como gerenciar a parte de modificações simultâneas, já que não existiriam locks! Talvez baseado em algum timestamp e histórico???
Gostaria de receber as opniões do pessoal e também sugestão de implementações.
Muito obrigado a todos