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

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

0 0 20

Người đăng: Lê Thanh Bình

Theo Viblo Asia

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

Sidekiq.configure_server do |config| config.redis = { url: "redis://#{ENV.fetch('REDIS_SERVERNAME')}:6379/0", namespace: ENV['REDIS_NAMESPACE'] }
end Sidekiq.configure_client do |config| config.redis = { url: "redis://#{ENV.fetch('REDIS_SERVERNAME_1')}:6379/0", namespace: ENV['REDIS_NAMESPACE_1'] }
end

Đầ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:
export REDIS_SERVERNAME=redis_1_server_name
export REDIS_NAMESPACE=redis_1_name_space
  • sidekiq_2:
export REDIS_SERVERNAME=redis_2_server_name
export REDIS_NAMESPACE=redis_2_name_space
  • rails:
export REDIS_SERVERNAME_1=redis_1_server_name
export REDIS_SERVERNAME_2=redis_2_server_name
export REDIS_NAMESPACE_1=redis_1_name_space
export REDIS_NAMESPACE_2=redis_2_name_space

config/sidekiq.yml

Đây là nơi định nghĩa danh sách các queue được xử 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

:verbose: false
:concurrency: 10
:timeout: 10
:queues: - sidekiq_queue_1 - sidekiq_queue_2 - sidekiq_queue_3
development: :verbose: true
staging: :concurrency: 5
production: :concurrency: 5

Đị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.

class Worker1 include Sidekiq::Worker sidekiq_options queue: :sidekiq_1_queue_1, retry: 5 def perform(*args) # các xử lý của sidekiq process được định nghĩa tại đây end

Đị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.

class Worker2 include Sidekiq::Worker sidekiq_options pool: ConnectionPool.new { redis_2 = Redis.new(url: "redis://#{ENV.fetch('REDIS_SERVERNAME_2')}:6379/0") Redis::Namespace.new(ENV['REDIS_NAMESPACE_2'], redis: redis_2) },queue: :sidekiq_2_queue_1, retry: 5 def perform(*args) # các xử lý của sidekiq process được định nghĩa tại đây end

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.

Bình luận

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

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

Caching đại pháp 2: Cache thế nào cho hợp lý?

Caching rất dễ. Mình không nói đùa đâu, caching rất là dễ. Ai cũng có thể làm được chỉ sau 10 phút đọc tutorial. Nó cũng giống như việc đứa trẻ lên 3 đã có thể cầm bút để vẽ vậy.

0 0 114

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

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 67

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

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 97

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

Nguyên tắc hoạt động của redis server

Sự ra đời của Redis. . Câu chuyện bắt đầu khi tác giả của Redis, Salvatore Sanfilippo. (nickname: antirez), cố gắng làm những công việc gần như là không.

0 0 81

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

Viết ứng dụng chat realtime với Laravel, VueJS, Redis và Socket.IO, Laravel Echo

Xin chào tất cả các bạn, đây là một trong những bài post đầu tiên của mình. Sau bao năm toàn đi đọc các blog tích luỹ được chút kiến thức của các cao nhân trên mạng.

0 0 905

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

Tìm hiểu tổng quan về Redis

1. Lời mở đầu.

0 0 352