Rails 6 ActiveRecord supports Multi DB connection switching.
Bài đăng này đã không được cập nhật trong 5 năm
Giới thiệu
Như các bạn đã biết Rails 6 ActiveRecord hộ trợ Multiple database connection switching. Hơn nữa, chúng ta có thể sử nhiều database khác nhau nhằm cho mục đích reading/wirting trên các database master và database slave nhằm cải thiện 1 phần performance của hệ thống.
Trước khi có Rails 6, các dev thường sử dụng các gem như SeconDBase hay MultiVese để connect tới nhiều databases khác nhau. Mỗi cái lại có nhưng ưu nhược điểm riêng để kết nối tới DB
Và Rails 6 đã bỏ các gem liên quan để kết nối tới DBs. Thay vào đó sẽ 2 APIs được thêm cho ActiveRecord.
1. Multi DB hỗ trợ reading/wirting.
Có một method mới là connects_to
đã được thêm vào để nhằm mục đich kết tới nhiều DB nhằm mục đích reading/writing
connects_to database: { reading: :read_replica_db, writing: :write_replica_db }
Cái này được hiểu là:
- ActiveRecord sẽ sử dụng
read_replica_db
được config trong filedatabase.yml
nhằm mục đích trỏ những queries(SELECT,..) đọc data từ db relication nhằm giảm tại cho db master (1 db chỉ đọc và 1 db chỉ ghi). - ActiveRecord sẽ sử dụng
read_replica_db
được config trong filedatabase.yml
nhằm mục đích trỏ những queries(INSERT,UPDATE..) write data từ db relication nhằm giảm tại cho db master (1 db chỉ đọc và 1 db chỉ ghi).
Và được đây ta có 1 model Product thì method trên sẽ được thực thi như sau:
class Product < ApplicationRecord
self.abstract_class = true
connects_to database: { writing: :products_primary, reading: :products_read }
end
Vậy với như trên thì model Product sẽ.
- Reading data từ db products_read.
- Writing data vào db products_primary.
2.Switch roles or database connections
Môt block method connect_to
đã được thêm vào để hỗ trợ việc switch qua lại với các DBs. Đây là một cái khá là hay if như chúng ta nhất định muốn lấy data từ một DB khác hoặc nếu chúng ta muốn connect để đọc data từ db relica phục vụ các queries nặng.
connected_to by role
Đây là một block method có thể sử dụng như sau:
ActiveRecord::Base.connected_to(role: :reading) do
Product.first # Tìm product từ replica đã kết nối tới ApplicationRecord
end
Nó sẽ tạo 1 kết nối read tới DB (Với role là : :reading
)
Ngòai method connect_to
còn có một dạng khác như sau:
ActiveRecord::Base.connected_to(database: :slow_replica) do
Product.first
end
Nhằm mục đích thực hiện query tới 1 database chị định.
3. References:
https://rubyinrails.com/2019/03/25/rails-6-activerecord-multi-db-connection-switching/
All rights reserved