Pergunta

Estou trabalhando em um sistema que espelha conjuntos de dados remotos usando iniciais e deltas.Quando uma inicial chega, ela exclui em massa qualquer coisa preexistente e insere em massa os novos dados.Quando um delta chega, o sistema faz muito trabalho para traduzi-lo em atualizações, inserções e exclusões.Iniciais e deltas são processados ​​em transações longas para manter a integridade dos dados.

Infelizmente, a solução atual não está sendo muito bem dimensionada.As transações são tão grandes e demoradas que nosso RDBMS fica atolado em vários problemas de contenção.Além disso, não há uma boa trilha de auditoria sobre como os deltas são aplicados, dificultando a solução de problemas que fazem com que as versões locais e remotas do conjunto de dados fiquem fora de sincronia.

Uma ideia é não executar as iniciais e deltas nas transações e, em vez disso, anexar um número de versão a cada registro indicando de qual delta ou inicial ele veio.Depois que um inicial ou delta for carregado com êxito, o aplicativo poderá ser alertado de que uma nova versão do conjunto de dados está disponível.

Isso apenas deixa a questão de como exatamente compor uma visualização de um conjunto de dados até uma determinada versão a partir da inicial e dos deltas.(O TimeMachine da Apple faz algo semelhante, usando links físicos no sistema de arquivos para criar uma "visão" de um determinado momento.)

Alguém tem experiência em resolver esse tipo de problema ou implementar essa solução específica?

Obrigado!

Foi útil?

Solução 2

Obrigado a quem tentou.

Para qualquer pessoa que acabe aqui, estou comparando uma solução que adiciona uma coluna "dataset_version_id" e "dataset_version_verb" a cada tabela em questão.Uma subconsulta correlacionada dentro de um procedimento armazenado é então usada para recuperar o dataset_version_id atual ao recuperar registros específicos.Se a versão mais recente do registro tiver dataset_version_verb de "delete", ele será filtrado dos resultados por uma cláusula WHERE.

Essa abordagem teve um impacto médio de desempenho de aproximadamente 80% até o momento, o que pode ser aceitável para nossos propósitos.

Outras dicas

tenha um gravador e vários bancos de dados de leitores.Você envia a gravação para um banco de dados e faz com que ela propague exatamente as mesmas alterações para todos os outros bancos de dados.Os bancos de dados do leitor serão eventualmente consistentes e o tempo de atualização será muito rápido.Já vi isso ser feito em ambientes que obtêm mais de 1 milhão de visualizações de páginas por dia.É muito escalável.Você pode até colocar um roteador de hardware na frente de todos os bancos de dados lidos para balanceá-los.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top