+4

Rails 6 ActiveRecord: connection switching to support multiple databases

ActiveRecord trong Rails 6 giờ đây đã hỗ trợ thay đổi các connection (connection switching), điều này có nghĩa là chúng ta có thể sử dụng multiple database. Và hơn thế nữa là dùng nhiều database connections khác nhau cho việc đọc/ghi các bản sao của dữ liệu giúp tăng hiệu năng cho app.

Trước đây thì sao? Trước Rails 6, có một số gem như SecondBase hay MultiVerse cũng cho phép kết nối các models vào nhiều database khác nhau. Mỗi gem đều có những ưu nhược điểm riêng, nên nhiều người cũng sử dụng các phương thức riêng của mình để kết nối nhiều DB trong Rails.

Rails 6 sẽ giúp loại bỏ sự phụ thuộc vào gem để làm được điều này. Những thay đổi đó bao gồm 2 APIs cho ActiveRecord.

1. Multi DB support for reading/writing

Một method mới toanh, connects_to được giới thiệu để kết nối vào nhiều DB cho qúa trình đọc/ghi.

connects_to database: { reading: :read_replica_db, writing: :write_replica_db }

Nghĩa là sao?

  • ActiveRecord sẽ sử dụng read_replica_db được cấu hình trong file database.yml để thực hiện các queries đọc từ model.
  • Và sử dụng write_replica_db cũng được cấu hình trong file database.yml để thực hiện các câu query ghi từ model.

Ví dụ chúng ta có một model tên Product như dưới đây:

class Product < ApplicationRecord
  self.abstract_class = true
  
  connects_to database: { writing: :products_primary, reading: :products_read }
end
  • Cấu hình này sẽ sử dụng database được khai báo trong products_primary để thực hiện các truy vấn liên quan đến việc ghi trong bảng products.
  • Và sử dụng sử dụng database được khai báo trong products_read để thực hiện các truy vấn liên quan đến việc đọc trong bảng products.

2. Switch roles or database connections

Rails 6 cung cấp thêm một block method connected_to hỗ trược việc chuyển (switch) giữa các database connections. Phương thức này đặc biệt hữu dụng khi bạn muốn lấy một data nhất định từ một DB khác hoặc nếu bạn muốn kết nối để đọc các bản sao cho các câu truy vấn nặng...

connected_to by role

Block method này có thể dùng như sau:

ActiveRecord::Base.connected_to(role: :reading) do
  Product.first # finds product from replica connected to ApplicationRecord
end

Nó sẽ tạo ra một database connection với role là :reading.

connected_to by database

Block method này có thể được dùng như sau:

ActiveRecord::Base.connected_to(database: :slow_replica) do
  Product.first
end

Nó sẽ sử dụng database được chỉnh định ở file database.yml với tên là slow_replica và thực hiện truy vấn với query được đưa ra bên trong block bằng ActiveRecord.


Tham khảo:


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí