Temos um aplicativo que possui uma mistura de migrações de banco de dados rápidas (<1 segundo) e lentas (> 30 segundos). No momento, estamos executando migrações de banco de dados como parte do IC, mas nossa ferramenta de CI precisa conhecer todas as cadeias de conexão com o banco de dados do nosso aplicativo (em vários ambientes), o que não é o ideal. Queremos mudar esse processo para que o aplicativo execute suas próprias migrações de banco de dados quando for inicializado.
Aqui está a situação:
Temos várias instâncias desse aplicativo - cerca de 5 em produção. Vamos ligar para eles node1, ..., node5
. Cada aplicativo se conecta a uma única instância do SQL Server e não estamos usando implantações contínuas (todos os aplicativos são implantados simultaneamente, tanto quanto eu sei)
Problema: digamos que temos uma migração de longa duração. Nesse caso, node1
inicia e começa a executar a migração. Agora, node4
inicia e a migração de longa execução ainda não terminou, node4
também começa a executar a migração -> possível corrupção de dados? Como você evitaria esse problema ou o problema é importante o suficiente para se preocupar?
Eu estava pensando em resolver esse problema com um bloqueio distribuído (usando etcd
algo assim). Basicamente, todos os aplicativos tentam adquirir o bloqueio, apenas um deles o obtém e executa as migrações, e então desbloqueia. Quando o restante dos aplicativos é iniciado e entra na seção crítica, todas as migrações já foram executadas, portanto o script de migração é encerrado.
No entanto, meu instinto está dizendo "isso é um exagero, deve haver uma solução mais simples", então imaginei que pediria aqui para ver se mais alguém tem alguma idéia melhor.