Un piccolo sfondo
Da anni utilizzo la gemma dell'appartamento per eseguire un'app multi-tenancy. Ora recentemente è arrivata la necessità di ridimensionare il database in host separati, il server db semplicemente non riesce più a tenere il passo (sia le letture che le scritture stanno diventando troppo) - e sì, ho ridimensionato l'hardware al massimo (dedicato hardware, 64 core, 12 unità Nvm-e nel raid 10, ram da 384 Gb ecc.).
Stavo pensando di fare questo per-tenant (1 tenant = 1 configurazione / pool di connessione al database) in quanto sarebbe stato un modo "semplice" ed efficiente per ottenere fino a number-of-tenants
volte più capacità senza fare un sacco di modifiche al codice dell'applicazione.
Ora, sto correndo su rotaie 4.2 atm., Presto aggiornando a 5.2. Vedo che rails 6 aggiunge il supporto per le definizioni di connessione per modello, tuttavia non è proprio quello di cui ho bisogno, in quanto ho uno schema di database completamente rispecchiato per ciascuno dei miei 20 tenant. In genere cambio "database" per richiesta (nel middleware) o per lavoro in background (middleware sidekiq), tuttavia questo è attualmente banale e gestito dalla gemma Apartment, in quanto imposta semplicemente search_path
Postgresql e non cambia realmente la connessione effettiva. Quando si passa a una strategia di hosting per tenant, sarà necessario cambiare l'intera connessione per richiesta.
Domande:
- Capisco che potrei fare un lavoro
ActiveRecord::Base.establish_connection(config)
per richiesta / in background - tuttavia, come ho anche capito, che fa scattare una stretta di mano di connessione al database completamente nuova e un nuovo pool db da generare in rotaie - giusto? Immagino che sarebbe un suicidio da prestazione fare quel tipo di spese generali su ogni singola richiesta alla mia domanda. - Mi chiedo quindi se qualcuno può vedere l'opzione con le rotaie, ad esempio, di pre-stabilire connessioni multiple / pool (20 in totale) di database dall'inizio (ad esempio all'avvio dell'applicazione), e quindi passare da un pool all'altro per richiesta? In modo che le connessioni db siano già fatte e pronte per essere utilizzate.
- Tutto questo è solo una cattiva idea povera e dovrei invece cercare un approccio diverso? Ad esempio 1 istanza dell'app = una connessione specifica a un tenant specifico. O qualcos'altro.
master
ramo Rails corrente . L'esecuzione di Rails Egde rappresenterebbe un'opzione o eseguirà il backstamping di quella funzione alla tua attuale versione di Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
significa che il pool verrà (ri) utilizzato, invece di creare una connessione completamente nuova ogni volta?