Integração entre sistemas / Bancos de dados  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
jmmenezes
Virtual Machine Man

Membro desde: 16/01/2012 12:46:41
Mensagens: 579
Offline

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.

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

2) 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.

3) 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.

4) 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

fabiocsilva
JavaEvangelist
[Avatar]

Membro desde: 19/07/2006 18:53:36
Mensagens: 324
Offline

Primeiro tem que analisar as restrições mais óbvias:

1) Esse cadastro realmente precisa ser local e web? Normalmente um dos lados é um "plus" no projeto, não sendo indispensável;
2) Caso precise dos dois lados, qual é o prioritário? O cadastro mais importante ou de maior volume viria de onde? Quem seria o master/slave?
3) Será que você não consegue uma internet 3G, via satélite ou outra abordagem para conectar a região rural na web?
4) Como você lidaria com inconsistências/colisões?Por exemplo, um cliente tem um endereço local, mas na web o endereço foi editado ou não existe mais. Esse tipo de situação pode ser atenuada via design, modelando o banco com pouco ou nenhum dado interrelacionado.

Acho que com isso dá pra analisar melhor o problema.


"The only place where success comes before work is in the dictionary."
_____________________
Sun Certified Java Programmer
Sun Certified Business Component Developer
jmmenezes
Virtual Machine Man

Membro desde: 16/01/2012 12:46:41
Mensagens: 579
Offline

Vamos lá...
O caso não é real, mas já passei por situações parecidas e o objetivo principal seria discutir uma melhor solução.
Mas vamos pensar então no caso mais real próximo a este cenário (cenário problemático com link), onde a solução adotada foi fazer uma integração por robô durante a madrugada (e realmente tenho duvidas até que ponto foi a melhor solução, pois não fui eu quem adotou a mesma).


1) Esse cadastro realmente precisa ser local e web? Normalmente um dos lados é um "plus" no projeto, não sendo indispensável;

Se fosse possivel ser somente Web, mas o link inviabiliza o acesso de varios operadores no sistema Web, portanto precisa estar dos 2 lados.


2) Caso precise dos dois lados, qual é o prioritário? O cadastro mais importante ou de maior volume viria de onde? Quem seria o master/slave?

Ambos terão cargas parecidas, porém o cadastro da empresa é prioritário. Ele seria o master e o cadastro web seria o slave.


3) Será que você não consegue uma internet 3G, via satélite ou outra abordagem para conectar a região rural na web?

Nesse caso, infelizmente não teve possibilidade de nenhuma outra conexão. E gostaria de saber também hoje sem possibilidade de conexão maior, qual a melhor opção.


4) Como você lidaria com inconsistências/colisões?Por exemplo, um cliente tem um endereço local, mas na web o endereço foi editado ou não existe mais. Esse tipo de situação pode ser atenuada via design, modelando o banco com pouco ou nenhum dado interrelacionado.

Também gostaria de discutir sobre a melhor maneira de fazer isso. Sempre que utilizei coisas parecidas, a alteração foi baseada em timestamp. Na solução usada, também foi baseada em timestamp. Ele acabava processando também todos os relacionamentos.

Obrigado.

This message was edited 1 time. Last update was at 17/05/2012 15:53:47

fabiocsilva
JavaEvangelist
[Avatar]

Membro desde: 19/07/2006 18:53:36
Mensagens: 324
Offline

Há inúmeras opções para fazer isso. Uma delas é colocar o banco master no lado web e manter todos os cadastros lá. O aplicativo local poderia enviar requisições de cadastro para web, que processaria a requisição e retornaria o resultado. A cada sucesso os dois lados registram um número de equivalência. O aplicativo local seria sincronizado uma vez por dia, de madrugada, e qualquer listagem seria offline. Caso não haja conectividade, o aplicativo local pode realizar cadastros também, mas a sincronização deveria resolver as inconsistências baseado no número de equivalência. O que não fosse resolvido você teria que checar manualmente. E a deleção seria lógica. Estou supondo que não há uma boa infra-estrutura para colocar um servidor na área rural...

This message was edited 1 time. Last update was at 18/05/2012 10:50:58


"The only place where success comes before work is in the dictionary."
_____________________
Sun Certified Java Programmer
Sun Certified Business Component Developer
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team