Một chút nền tảng
Tôi đã sử dụng đá quý Căn hộ để chạy một ứng dụng nhiều người thuê trong nhiều năm. Gần đây, nhu cầu mở rộng cơ sở dữ liệu thành các máy chủ riêng biệt đã xuất hiện, máy chủ db đơn giản là không thể theo kịp nữa (cả đọc và viết đang trở nên quá nhiều) - và vâng, tôi đã tăng tỷ lệ phần cứng lên mức tối đa (dành riêng phần cứng, 64 lõi, ổ đĩa 12 Nvm-e trong cuộc đột kích 10, 384Gb ram, v.v.).
Tôi đã xem xét thực hiện công việc cho mỗi người thuê này (1 người thuê = 1 cấu hình / nhóm kết nối cơ sở dữ liệu) vì đó sẽ là một cách "đơn giản" và hiệu quả để tăng number-of-tenants
thêm dung lượng mà không phải thực hiện nhiều thay đổi mã ứng dụng.
Bây giờ, tôi đang chạy rails 4.2 atm., Sớm nâng cấp lên 5.2. Tôi có thể thấy rằng rails 6 bổ sung hỗ trợ cho các định nghĩa kết nối theo mô hình, tuy nhiên đó không thực sự là điều tôi cần, vì tôi có một lược đồ cơ sở dữ liệu được nhân đôi hoàn toàn cho mỗi trong số 20 người thuê của tôi. Thông thường tôi chuyển đổi "cơ sở dữ liệu" theo yêu cầu (trong phần mềm trung gian) hoặc trên mỗi công việc nền (phần mềm trung gian bên cạnh), tuy nhiên điều này hiện không quan trọng và xử lý ny đá quý Căn hộ, vì nó chỉ đặt search_path
trong Postgresql và không thực sự thay đổi kết nối thực tế. Khi chuyển sang chiến lược lưu trữ cho mỗi người thuê, tôi sẽ cần chuyển toàn bộ kết nối cho mỗi yêu cầu.
Câu hỏi:
- Tôi hiểu rằng tôi có thể thực hiện một
ActiveRecord::Base.establish_connection(config)
yêu cầu / công việc nền - tuy nhiên, như tôi cũng hiểu, điều đó kích hoạt một bắt tay kết nối cơ sở dữ liệu hoàn toàn mới được thực hiện và một nhóm db mới sinh ra trong đường ray - phải không? Tôi đoán đó sẽ là một vụ tự sát hiệu suất để thực hiện loại chi phí đó cho mỗi yêu cầu đối với ứng dụng của tôi. - Do đó, tôi tự hỏi liệu có ai có thể thấy tùy chọn với các đường ray ví dụ như thiết lập trước nhiều (tổng số 20) kết nối / nhóm cơ sở dữ liệu ngay từ đầu (ví dụ: khi khởi động ứng dụng), và sau đó chỉ chuyển đổi giữa các nhóm đó theo yêu cầu không? Vì vậy, các kết nối db của anh ấy đã được thực hiện và sẵn sàng để được sử dụng.
- Có phải tất cả chỉ là một ý tưởng nghèo nàn, và thay vào đó tôi nên tìm kiếm một cách tiếp cận khác? Ví dụ: 1 ứng dụng = một kết nối cụ thể đến một người thuê cụ thể. Hoặc một cái gì đó khác.
master
nhánh Rails hiện tại . Chạy Rails Egde sẽ là một tùy chọn hoặc sao lưu tính năng đó cho phiên bản Rails hiện tại của bạn?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
có nghĩa là pool sẽ được (re-) sử dụng, thay vì tạo ra một kết nối hoàn toàn mới mọi lúc?