Práticas recomendadas / padrões para sincronização de dados bidirecional

52

Muitas vezes, no meu trabalho, surge a idéia de sincronização de dados bidirecional entre sistemas de banco de dados. O exemplo clássico é de dois sistemas de CRM ligeiramente diferentes (por exemplo, Raiser's Edge e Salesforce) e a necessidade de ter uma sincronização bidirecional de dados de contato entre eles.

Considerações sobre a API de lado, supondo que você tenha uma chave compartilhada para sincronizar e pensando puramente no algoritmo / padrão a ser empregado, essa é uma tarefa que geralmente é subestimada por não-técnicos.

Por exemplo, você precisa prestar atenção:

  • Você pode detectar facilmente quais registros foram alterados nos dois sistemas (ou precisará comparar todos os registros entre os sistemas para detectar alterações)
  • Se você estiver realizando uma sincronização uma vez a cada N horas, como lidar com conflitos em que o mesmo registro é alterado mais ou menos ao mesmo tempo nos dois sistemas
  • Se você estiver fazendo uma sincronização em tempo real (ou seja, uma atualização em um sistema aciona imediatamente uma atualização no outro sistema), como lidar com divergências ao longo do tempo devido a bugs ou falhas no sistema

Pessoalmente, posso pensar em maneiras de resolver tudo isso, mas estou me perguntando se existem padrões, literatura ou práticas recomendadas bem conhecidas que eu poderia me referir.

codeulike
fonte
o que você descreve soa bem próximo ao sistema de banco de dados federado - isso está correto?
Gnat
@gnat: Obrigado pelo link, algumas das preocupações são semelhantes (por exemplo, lidar com a heterogeneidade), mas estou falando em sincronizar um subconjunto de dados de dois bancos de dados autônomos, enquanto isso parece ser mais sobre a criação de uma visão totalmente integrada de tudo em vários dbs.
codeulike
11
7 anos depois, 50 votos positivos, mas apenas 1 resposta decente. Deve haver alguns padrões de sincronização ou práticas recomendadas por aí?
codeulike 14/02

Respostas:

8

Sim, um problema difícil, facilmente subestimado. E poderia dar muito trabalho. Se você usa as tecnologias da Microsoft, consulte o Microsoft Sync Framework aqui e aqui .

codingoutloud
fonte
11
Obrigado, isso é interessante. Eu tinha ouvido falar da Sra. Sync Framework, mas não tinha percebido que era tão generalizado. Basicamente, é um padrão para lidar com problemas de sincronização em geral.
codeulike
2
O Microsoft Sync Framework foi substituído pelo Microsoft Sync Framework Toolkit.
Tomas Kubes
Estou frustrado com os documentos, o que não é claro, especialmente para provedores de dados ADO.NET que não são do SQL Server, que é o meu caso. Além disso, meu local de trabalho está procurando algo que não exija adicionar tabelas de infraestrutura / fazer alterações no ambiente de produção. Então, eu estou prestes a descartar este.
Veverke #
0

Existem muitas teorias sobre a sincronização de banco de dados do site remoto. Primeiro comece com INSERT. lidar com este é fácil - pois você pode criar um ID exclusivo para cada site (por exemplo, uma inicial do nome do site + ID (número): site_a_177 vs. site_b_53)

Portanto, a inserção não deve criar conflitos. o problema é a atualização. Não acredito que exista um método 100% à prova de falhas, mas você pode iniciar uma atualização "bloqueando" o registro no banco de dados remoto e somente depois de obter o identificador - continue com a atualização e termine sincronizando a atualização e só então solte a trava.

alfasin
fonte
11
Obrigado, acho que você está falando sobre dbs distribuídos com o mesmo esquema e lidando com transações distribuídas. Estou pensando mais em cenários em que os dois bancos de dados são completamente autônomos (por exemplo, eles atribuem IDs únicos de maneiras completamente diferentes e os esquemas diferem), mas você deseja sincronizar um subconjunto dos dados neles.
codeulike
Parece que não deve haver conflitos. Nesse caso, deve ser muito simples - salve o "último ID do registro" que foi sincronizado para cada tabela e continue a partir daí.
Alfasin