- vừa được xem lúc

Multiple Databases in Rails 6

0 0 97

Người đăng: Nguyen Nhu Thuy

Theo Viblo Asia

1. Tự động chuyển đổi connection giữa primary và replica database

Để sử dụng read-only database, bạn cần config middleware cho phần tự động chuyển đổi connection.

Middleware tự động chuyển đổi connection cho phép ứng dụng của bạn chuyển đổi giữa primary và reploca database dựa trên các HTTP verb của request.

Ví dụ: nếu ứng dụng của bạn nhận được yêu cầu POST, PUT, DELETE hoặc PATCH, ứng dụng sẽ tự động ghi vào primary database. Và, đối với các yêu cầu như GET hoặc HEAD, ứng dụng sẽ đọc replica database.

Để config middleware cho bộ chuyển đổi tự động; uncomment hoặc thêm dòng sau vào file config:

config.active_record.database_selector = { delay: 2.seconds }

Với các request GET hoặc HEAD, rails sẽ chỉ connect đến primary database nếu request nằm trong khoảng thời gian tính từ request ghi cuối cùng; theo mặc định, nó sẽ là 2 giây. Ví dú: giây thứ 10 bạn nhận đc 1 request POST (request ghi), thì trong 2 giây tiếp theo, tất cả request đọc sẽ tự động được kết nối tới primary database, thay vì replica database. Bạn có quyền tự do thay đổi option delay dựa theo infra structure.

2. Kết nối thủ công với primary và replica dabase

Để kết nối với primary hoặc replica database theo cách thủ công; rails cung cấp phương thức ActiveRecord :: Base.connected_to.

Đôi khi, ứng dụng của bạn cần kết nối với primary hoặc replica database không phân biệt loại request. Trong những trường hợp như vậy, bạn có thể sử dụng phương thức connect_to do ActiveRecord cung cấp.

ActiveRecord::Base.connected_to(role: :writing) do Person.first
end

3. Horizontal sharding

Horizontal sharding là việc bạn chia nhỏ database của mình để giảm số rows trên mỗi database server, nhưng duy trì cùng một schema trên các "sharding". Điều này thường được gọi là "multi-tenant" sharding.

API hỗ trợ horizontal sharding trong Rails tương tự như API hỗ trợ multiple database.

production: primary: database: my_primary_database adapter: mysql primary_replica: database: my_primary_database adapter: mysql replica: true primary_shard_one: database: my_primary_shard_one adapter: mysql primary_shard_one_replica: database: my_primary_shard_one adapter: mysql replica: true

Models được kết nối với API connect_to thông qua shard key:

class ApplicationRecord < ActiveRecord::Base self.abstract_class = true connects_to shards: { default: { writing: :primary, reading: :primary_replica }, shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica } }
end

Sau đó, các models có thể hoán đổi kết nối theo cách thủ công thông qua API connect_to. Nếu sử dụng sharding, cả roleshard phải được truyền:

ActiveRecord::Base.connected_to(role: :writing, shard: :default) do @id = Person.create! # Creates a record in shard default
end ActiveRecord::Base.connected_to(role: :writing, shard: :shard_one) do Person.find(@id) # Can't find record, doesn't exist because it was created # in the default shard
end

API horizontal sharding cũng hỗ trợ replica database. Bạn có thể hoán đổi roleshard bằng API connect_to.

ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do Person.first # Lookup record from read replica of shard one
end

REFS: https://guides.rubyonrails.org/active_record_multiple_databases.html https://hackernoon.com/how-to-manage-multiple-databases-in-rails-6-ye6x3ypv

Bình luận

Bài viết tương tự

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 3: Docker-compose)

1. Mở đầu. . .

0 0 127

- vừa được xem lúc

Tích hợp VNPAY vào Rails

Xin chào 500 ae năm mới nhé. Tiếp nối câu chuyện về Thanh toán online mà mình có chia sẽ ở 2 bài trước, mọi người chưa đọc thì có thể vào xem ở đây nhé.

1 1 95

- vừa được xem lúc

Tìm hiểu Adapter Pattern trong Rails

. Nếu là một web developer chắc hẳn chúng ta đã không ít lần đọc qua về các Design patterns hay cách áp dụng chúng để làm cho code trở nên hướng đối tượng hơn, dễ đọc, dễ hiểu, dễ maintain, dễ mở rộng, … Các design patterns được áp dụng khá nhiều trong các Rails projects như Service Object, Decorato

0 0 48

- vừa được xem lúc

Sử dụng Searchkick để tìm kiếm thông minh trên Rails và Elasticsearch

Bạn đã bao giờ tự hỏi, ứng dụng web của mình có thể mở rộng quy mô bằng cách học được các từ khóa mà người dùng tìm kiếm? Có giải pháp nào cung cấp công cụ tìm kiếm tự động nhanh chóng với chỉ 1 từ khóa bất kì? Thật may khi có Searchkick và Elasticsearch là các công cụ hỗ trợ công việc tìm kiếm trở

0 0 103

- vừa được xem lúc

Những sai lầm bạn có thể mắc phải khi code Rails

. Chào các bạn, chào các bạn. Đừng vội đóng tab nha.

0 0 47

- vừa được xem lúc

Một số lưu ý cải thiện performance khi làm việc với Rails

Khi làm việc với ruby on rails chắc hẳn chúng ta sẽ làm việc với active record rất nhiều. Tuy nhiên có nhiều điều có thể ta vẫn chưa thực sự hiểu, ví dụ như ActiveRecord execute SQL query như thế nào? Và cũng còn khá nhiều lập trình viên khác cũng không để ý tới điều này.

0 0 111