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

Sidekiq trick: Thực thi job trên 1 host cố định trong cluster

0 0 92

Người đăng: wild

Theo Viblo Asia

Sidekiq

Các bạn code ruby chắc hẳn không hề xa lại với sidekiq. Đây là một gem thường được dùng cho việc xử lý background jobs trong Rails. Về sidekiq, bạn có thể đọc thêm ở bài viết này: https://viblo.asia/p/gioi-thieu-ve-sidekiq-va-mot-so-co-che-hoat-dong-Qbq5QW2GZD8

Sidekiq gồm 3 phần chính là Sidekiq Client, Sidekiq Server và Redis.

  • Sidekiq client: đẩy job vào hàng đợi.
  • Redis: là data storage cho sidekiq, dùng để lưu trữ các job được đẩy xuống từ sidekiq client.
  • Sidekiq server: là một process độc lập, pull job từ queue trong Redis và xử lý.

Tình huống

Giả sử bạn có nhiều Sidekiq server (host), tất cả các host này đều sử dụng chung 1 redis server để lưu trữ các job.

Thông thường, 1 job sau khi đẩy vào hàng đợi sẽ được random 1 trong các Sidekiq Server pull về và thực thi.

Tuy nhiên, vì một lí do đặc biệt, bạn muốn 1 job nào đó chỉ được thực thi trên 1 Host cố định. Vậy phải làm thế nào?

Giải pháp

Ý tưởng là chúng ta có thể sử dụng 1 queue chỉ tồn tại trên Host mình muốn.

Vậy làm thế nào để tạo ra 1 queue như trên ?

Sửa file config/sidekiq.yml

Đầu tiên chúng ta sẽ yêu cầu các Sidekiq Server khi được khởi tạo sẽ listen 1 queue có tên là hostname của Sidekiq Server đó.

:verbose: false
:concurrency: 25
:queues: - default - <%= `hostname`.strip %>

Trong đó hostname là linux command trả về tên của Server. Với mỗi host, kết quả trả về sẽ khác nhau. Nhờ đó chúng ta đã tạo ra 1 dynamic queue.

Chỉ định queue cho Worker

Giả sử server muốn chạy job này có tên là AHIHI

class SpecificWorker include Sidekiq::Worker sidekiq_options queue: "AHIHI" def perform(filename) # process image end
end

Bây giờ khi 1 job SpecificWorker được đẩy vào queue, nó sẽ được lưu vào hàng đợi có tên là "AHIHI". Và nó sẽ chỉ được thực thi trên server bạn muốn.

hoặc trong tình huống Sidekiq client và Sidekiq Server cùng đặt trên 1 host. Bạn muốn Sidekiq Server nào thực thi Job được tạo bởi Sidekiq Client trên host đấy thì có thể là

sidekiq_options queue: `hostname`.strip

It worked like a charm!

Bình luận

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

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

Tôi cá là bạn không biết những điều này - Ruby on rails ( Phần 2)

Các bạn có thể theo dõi phần 1 ở đây :. https://viblo.asia/p/toi-ca-la-ban-khong-biet-nhung-dieu-nay-ruby-on-rails-phan-1-WAyK8DDeKxX. 5.

0 0 222

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

Rails Memoization

Memoization is a process that can be used to speed up rails methods. It caches the results of methods that do time-consuming work, work that only needs to be done once. Here is an example. Example.

0 0 48

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

Tại sao Rails lại dùng cả Webpack lẫn Sprocket?

Khi Rails 6 được ra mắt, có thể bạn đã từng tự hỏi. WTF, sao Webpack đã được add vào rồi, mà Sprocket vẫn tồn tại thế kia . Chẳng phải Webpack và Sprocket được dùng để giải quyết chung một công việc hay sao. Hoặc cả đây:.

0 0 59

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

Bạn nên sử dụng Elasticsearch trong ứng dụng Ruby On Rails như thế nào?

Elasticsearch là một công cụ phân tích và mã nguồn mở mạnh mẽ và linh hoạt, phân tán, theo thời gian thực. Đó là tiêu chuẩn vàng trong công nghệ tìm kiếm.

0 0 80

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

Form object pattern trong rails

1.Mở đầu.

0 0 111

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

Sử dụng Twilio để gửi SMS trong ứng dụng Ruby on Rails

Ngoài cách xác nhận tài khoản hay gửi thông báo bằng email thì hôm nay mình sẽ hướng dẫn các bạn 1 cách nữa là thông qua SMS/Voice. Công cụ sử dụng sẽ là gem Twilio. Installation. Để cài đặt bằng Bundler, hãy lấy phiên bản mới nhất:.

0 0 67