Um pouco de fundo
Uso a jóia Apartment para executar um aplicativo de multilocação por anos. Agora, recentemente, chegou a necessidade de dimensionar o banco de dados em hosts separados, o servidor db simplesmente não aguenta mais (as leituras e gravações estão ficando demais) - e sim, eu dimensionei o hardware ao máximo (dedicado hardware, 64 núcleos, 12 unidades Nvm-e no RAID 10, 384 GB de RAM etc.).
Eu estava pensando em fazer isso por inquilino (1 inquilino = 1 configuração / pool de conexão com o banco de dados), pois seria uma maneira "simples" e eficiente de obter até number-of-tenants
mais vezes mais capacidade sem fazer muitas alterações no código do aplicativo.
Agora, estou executando o rails 4.2 atm., Em breve atualizando para o 5.2. Eu posso ver que o Rails 6 adiciona suporte para definições de conexão por modelo, no entanto, isso não é realmente o que eu preciso, pois tenho um esquema de banco de dados completamente espelhado para cada um dos meus 20 inquilinos. Normalmente eu alterno "banco de dados" por solicitação (no middleware) ou por trabalho em segundo plano (sidekiq middleware), no entanto, isso atualmente é trivial e tratado pela jóia Apartment, pois apenas define o search_path
Postgresql e realmente não altera a conexão real. Ao mudar para uma estratégia de hospedagem por inquilino, precisarei mudar toda a conexão por solicitação.
Questões:
- Entendo que eu poderia fazer um trabalho
ActiveRecord::Base.establish_connection(config)
por solicitação / plano de fundo - no entanto, como também entendo, isso aciona um handshake de conexão de banco de dados totalmente novo a ser feito e um novo pool de banco de dados a ser gerado nos trilhos - certo? Eu acho que seria um suicídio de desempenho fazer esse tipo de sobrecarga em cada solicitação do meu aplicativo. - Portanto, eu estou querendo saber se alguém pode ver a opção com trilhos, por exemplo, pré-estabelecendo várias (total de 20) conexões / pools de banco de dados desde o início (por exemplo, na inicialização do aplicativo) e depois alternar entre esses pools por solicitação? Para que as conexões db já estejam feitas e prontas para serem usadas.
- Tudo isso é apenas uma péssima idéia, e devo procurar uma abordagem diferente? Por exemplo, 1 instância do aplicativo = uma conexão específica com um inquilino específico. Ou alguma outra coisa.
master
ramificação atual do Rails . A execução do Rails Egde seria uma opção ou back-prting desse recurso para sua versão atual do Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
significa que o pool será (re) usado, em vez de criar uma conexão totalmente nova toda vez?