Conexão em múltiplos bancos de dados simultâneamente
Problema
Foi detectado que para a realização da tarefa #58 (closed), é necessário se conectar em diversos bancos de dados simultâneamente. Foi detectada que essa não seria uma atualização trivial de ser realizada e terá grandes impactos em diversas partes do código, por essa razão uma tarefa separada foi criada.
Por enquanto o objetivo da tarefa é permitir a conexão a vários bancos que compartilham o mesmo esquema. No futuro pretende-se utilizar esquemas diferentes para cada um dos bancos, entretanto essa alteração seria muito grande e será delegada a uma outra tarefa futura.
Atualmente, conectar-se em múltiplos bancos de dados possui dois benefícios imediatos.
- Realização de testes simultâneos em SGBDs diferentes (garantindo corretude em todos os SGBD's)
- Distribuição de carga entre bases de dados (Que podem ser de SGBD's diferentes)
Além disso a inserção pode ser disparada para todos os adaptadores, mantendo a consistência da base. Ainda não é necessário decidir para qual base uma determinada inserção é enviada.
Alterações necessárias
-
Modificar as variáveis de ambiente para conexão com o banco. - Uma nova variável deve ser criada: BLENDB_N_DATABASES que indica o número de bancos de dados simultâneos sendo utilizados. Ela deve ter como valor default 1
- As variáveis BLENDB_DB_* devem ser modificadas para BLENDB_DBN_ onde DBN será substituido por DB0 para o primeiro banco, DB1 para o segundo e assim sucessivamente
- A variável BLENDB_ADAPTER deve ser trocada para BLENDB_DBN_ADAPTER, já que cada banco pode ter o seu próprio adaptador
- Uma nova váriavel deve ser criada BLENDB_SCHEMA que contém o caminho para o esquema do banco de dados (relativo a raiz do projeto ou absoluto)
-
Alterações na leitura da configuração - No ConfigParser trocar a criação da conexão de um objeto Connection para uma lista de conexões, uma para cada base.
- Realizar a leitura do arquivo de esquema a partir da váriavel de ambiente BLENDB_SCHEMA
-
Alterações na inicialização (main.ts) - Remover a leitura hardcoded do arquivo de definição de esquema (Atualmente config.yaml ou test.yaml).
- Modificação da middleware de adapatdores para receber uma lista e não apenas uma conexão.
-
Modificação das midlewares de adaptador - Unificar as middlewares de cada adaptador em uma única middleware que devolve uma lista de adaptadores e atribui a uma váriavel req.adapters
-
Alterações nos controladores da API de leitura/escrita - Criação de uma politica de leitura, sugestão: round robin, ou seja, cada nova requisição é enviada para o banco que foi o último a atender uma requisição
- Criação de uma politica de escrita, realizar a escrita em todos os bancos
- Caso 2 bancos na realidade forem o mesmo banco, a inserção será duplicada (inserções com data devem resolver)