Sử dụng nhiều sidekiq trên cùng một ứng dụng Rails

Tram Ho

Các luồng xử lý của sidekiq được giả định kết nối với 1 redis duy nhất. Bởi vậy khi kết nối ứng dụng đến nhiều redis, số lượng sidekiq cần tương ứng với số lượng redis.
Bài viết này hướng dẫn cài đặt nhiều sidekiq trên cùng một ứng dụng rails một cách ngắn gọn nhất

config/initializers/sidekiq.rb

Đầu tiên bạn cần hiểu Sidekiq server và sidekiq client là gì?

  • client: là nơi gửi các jobs lên và đưa vào hàng đợi (enqueue) (còn gọi là ứng dụng Rails)
  • server: là nơi các jobs được lấy ra (dequeue) để xử lý (Sidekiq process)

Sidekiq config luôn bao gồm cả Sidekiq server và Sidekiq client.
Thường thì các sidekiq_server được đặt trên các instance khác nhau, nên cần đặt đúng giá trị của REDIS_SERVERNAME tại các instance này
ví dụ:

  • sidekiq_1:

  • sidekiq_2:

  • rails:

config/sidekiq.yml

Đây là nơi định nghĩa danh sách các queue được sử dụng trong sidekiq. Với mỗi sidekiq process cần định nghĩa 1 file sidekiq.yml riêng.
ví dụ: sidekiq.ymlsidekiq_1.yml

Định nghĩa worker cho sidekiq_1

Ứng dụng rails sẽ gọi đến method của worker này để gửi jobs đến sidekiq.

Định nghĩa worker cho sidekiq_2

Đến đây có thể một số bạn sẽ thắc mắc tại sao ở bước 1 ta định nghĩa 2 biến trong rails instance nhưng sidekiq_client lại chỉ sử dụng 1 giá trị.
Lý do là ta có thể chọn 1 sidekiq làm mặc định cho ứng dụng rails. Thường thì sẽ chọn sidekiq nào có nhiều loại queue hơn, và ở sidekiq_options ta chỉ cần gọi tên queue ra.
Đối với sidekiq_2, ta cần định nghĩa rằng worker này sử dụng sidekiq nào thông qua class ConnectionPool.

Kết luận

Như vậy, ta đã có thể cấu hình cho ứng dụng rails xử dụng nhiều sidekiq process!
Cảm ơn mọi người đã ghé qua bài viết! Rất mong nhận được sự góp ý từ mọi người.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo