Ein kleiner Hintergrund
Ich verwende das Apartment-Juwel seit Jahren, um eine Mandantenfähigkeits-App auszuführen. Vor kurzem ist die Notwendigkeit angekommen, die Datenbank auf separate Hosts zu skalieren. Der Datenbankserver kann einfach nicht mehr mithalten (sowohl Lese- als auch Schreibvorgänge werden zu viel) - und ja, ich habe die Hardware maximal skaliert (dediziert) Hardware, 64 Kerne, 12 Nvm-e-Laufwerke in RAID 10, 384 GB RAM usw.).
Ich habe überlegt, dies pro Mandant (1 Mandant = 1 Datenbankverbindungskonfiguration / number-of-tenants
-pool) durchzuführen , da dies eine "einfache" und effiziente Möglichkeit wäre, bis zu- mal mehr Kapazität zu erreichen, ohne viele Änderungen am Anwendungscode vorzunehmen.
Jetzt laufe ich Schienen mit 4,2 atm und rüste bald auf 5,2 auf. Ich kann sehen, dass Rails 6 die Unterstützung für Verbindungsdefinitionen pro Modell hinzufügt, aber das ist nicht wirklich das, was ich brauche, da ich für jeden meiner 20 Mandanten ein vollständig gespiegeltes Datenbankschema habe. Normalerweise wechsle ich "Datenbank" pro Anfrage (in Middleware) oder pro Hintergrundjob (Sidekiq Middleware). Dies ist jedoch derzeit trivial und wird vom Apartment-Juwel behandelt, da es nur die search_path
in Postgresql festlegt und die tatsächliche Verbindung nicht wirklich ändert. Wenn ich zu einer Mandanten-Hosting-Strategie wechsle, muss ich die gesamte Verbindung pro Anfrage wechseln.
Fragen:
- Ich verstehe, dass ich einen
ActiveRecord::Base.establish_connection(config)
Job pro Anfrage / Hintergrund ausführen könnte - aber wie ich auch verstehe, löst dies einen völlig neuen Handshake für die Datenbankverbindung und einen neuen Datenbankpool aus, der in Rails erzeugt wird - richtig? Ich denke, das wäre ein Leistungsselbstmord, um diese Art von Overhead bei jeder einzelnen Anfrage an meine Bewerbung zu verursachen. - Ich frage mich daher, ob jemand die Option mit Schienen sehen kann, z. B. mehrere (insgesamt 20) Datenbankverbindungen / -pools von Anfang an (z. B. beim Booten der Anwendung) vorab einzurichten und dann einfach pro Anforderung zwischen diesen Pools zu wechseln. Damit sind die DB-Verbindungen bereits hergestellt und einsatzbereit.
- Ist das alles nur eine schlechte Idee, und sollte ich stattdessen nach einem anderen Ansatz suchen? ZB 1 App-Instanz = eine bestimmte Verbindung zu einem bestimmten Mandanten. Oder etwas anderes.
master
Zweig benötigen . Wäre es eine Option, Rails Egde auszuführen oder diese Funktion auf Ihre aktuelle Rails-Version zurückzusetzen?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
bedeutet, dass der Pool (wieder) verwendet wird, anstatt jedes Mal eine ganz neue Verbindung herzustellen?