Sedikit latar belakang
Saya telah menggunakan permata Apartment untuk menjalankan aplikasi multi-sewa selama bertahun-tahun. Sekarang baru-baru ini kebutuhan untuk memperbesar basis data menjadi beberapa host telah tiba, server db tidak dapat mengikuti lagi (baik membaca dan menulis sudah terlalu banyak) - dan ya, saya meningkatkan perangkat keras ke max (didedikasikan perangkat keras, 64 core, 12 Nvm-e drive dalam serangan 10, ram 384Gb dll.).
Saya sedang mempertimbangkan untuk melakukan ini per-penyewa (1 penyewa = 1 konfigurasi koneksi database / kolam) karena itu akan menjadi cara "sederhana" dan efisien untuk mendapatkan hingga number-of-tenants
-lebih banyak kapasitas tanpa melakukan banyak perubahan kode aplikasi.
Sekarang, saya menjalankan rel 4.2 atm., Segera meningkatkan ke 5.2. Saya dapat melihat bahwa rails 6 menambahkan dukungan untuk definisi koneksi per-model, namun itu tidak benar-benar apa yang saya butuhkan, karena saya memiliki skema database yang sepenuhnya dicerminkan untuk masing-masing dari 20 penyewa saya. Biasanya saya mengganti "database" per permintaan (di middleware) atau per latar belakang pekerjaan (sidekiq middleware), namun ini saat ini sepele dan ditangani oleh permata Apartment, karena hanya mengatur search_path
di Postgresql dan tidak benar-benar mengubah koneksi yang sebenarnya. Saat beralih ke strategi hosting per-penyewa, saya harus mengganti seluruh koneksi per permintaan.
Pertanyaan:
- Saya mengerti bahwa saya bisa melakukan pekerjaan
ActiveRecord::Base.establish_connection(config)
per permintaan / latar belakang - namun, seperti yang saya juga mengerti, yang memicu jabat tangan koneksi database yang sama sekali baru untuk dibuat dan kolam db baru untuk muncul di rel - kan? Saya kira itu akan menjadi kinerja bunuh diri untuk membuat semacam overhead pada setiap permintaan tunggal untuk aplikasi saya. - Karena itu saya bertanya-tanya apakah ada yang bisa melihat opsi dengan rel misalnya pra-membangun beberapa (total 20) koneksi database / pool dari awal (misalnya pada saat boot aplikasi), dan kemudian hanya beralih di antara kolam-kolam per permintaan? Sehingga koneksi dia sudah dibuat dan siap digunakan.
- Apakah semua ini hanya ide yang buruk dan haruskah saya mencari pendekatan yang berbeda? Misalnya 1 instance aplikasi = satu koneksi spesifik ke satu tenant tertentu. Atau sesuatu yang lain.
master
cabang Rails saat ini . Apakah menjalankan Rails Egde menjadi opsi atau memproteksi fitur itu ke versi Rails Anda saat ini?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
berarti bahwa pool akan digunakan (kembali), alih-alih membuat koneksi baru setiap saat?