Sidekiq là một trong những Background Processing Libraries được nhiều người sử dụng nhất trong Ruby. So với các lão làng như Delayed Job, Resque hay Active Job vốn có sẵn kể từ Rails 4.2 thì Sidekiq được nhiều người tin dùng bởi tính lightweight (Do sử dụng Redis thay vì ActiveRecord và Performance, Memory Efficient cũng tốt hơn Resque). Tuy vậy, Sidekiq cũng khó sử dụng hơn so với Delayed Job và Active Job nên nếu bạn chưa quen với Sidekiq, bạn có thể sẽ mau nản.
Trước đây, khi nhận dự án UBrand về thì Team Develop trước đã dùng Delayed Job, nhưng sau khi go live thì mình thấy Delayed Job khá chậm, lại tốn nhiều resource của hệ thống nên đã tìm giải pháp khác thay thế, và do đó đã tìm đến Sidekiq.
Sidekiq có 3 phiên bản là Sidekiq OSS, Sidekiq Pro, Sidekiq Enterprise, bạn có thể tham khảo chi tiết tại trang chủ của Sidekiq tại http://sidekiq.org. Riêng với cá nhân mình thì thấy rằng phiên bản OpenSource của Sidekiq là khá đủ dùng, nếu cần thêm các chức năng Advanced mà Sidekiq OSS không có thì hoàn toàn có thể cài thêm một số gem khác phụ trợ (Ví dụ dùng Sidetiq cho Recurring Job).
Bài viết này nhằm ghi lại một số kinh nghiệm khi dùng Sidekiq cho dự án.
Sidekiq Web UI
Theo dõi và quản trị các Jobs/Worker trên Sidekiq bằng giao diện Web.
Link: Sidekiq Monitoring
Cài đặt Sidekiq Web UI cho dự án Rails:
- Thêm gem sinatra vào dự án của bạn:
gem 'sinatra', :require => nil
- Thêm vào routes.rb (Nếu Authenticate bằng Devise - Chỉ có quyền Admin mới được phép truy cập vào đường dẫn /sidekiq):
require 'sidekiq/web'
authenticate :user, lambda { |u| u.admin? } do
mount Sidekiq::Web => '/sidekiq'
end
Một số Gem hữu ích để bổ sung cho Sidekiq
Sidekiq Throttler
Sidekiq-throttler, một middleware cho sidekiq để thêm chức năng giới hạn số lượng job thực thi trên mỗi worker tại một thời điểm.
Link: https://github.com/gevans/sidekiq-throttler (đã lâu không cập nhật nhưng mình vẫn dùng tốt ở thSidetiqời điểm hiện tại - (Ruby 2.2, Rails 4.2 và Sidekiq 3.4)
Sidekiq Failures
- Bổ sung Tab Failures vào Sidekiq Web UI để bạn có thể track các failed job trực tiếp ngay trên giao diện.
Link: https://github.com/mhfs/sidekiq-failures
Sidekiq Statistic
- Bổ sung tab Statistic vào Sidekiq Web UI để coi các thống kê của các Worker theo thời gian thực.
Link: https://github.com/davydovanton/sidekiq-statistic
Sidetiq
Nếu bạn có một hay vài Job cần chạy recurring thì không thể bỏ qua Sidetiq
Link: https://github.com/tobiassvn/sidetiq
Một số lệnh Sidekiq ít gặp nhưng đôi lúc sẽ cần đến
- Clear các Jobs trong Sidekiq Queue / RetrySet / ScheduledSet: Cái này mình đã dùng trong tình huống Project của mình có một Bug khiến một loạt các Jobs “AutoLike” bị lỗi, mà Sidekiq gặp một Job bị failed sẽ cố gắng thử chạy lại Job đó nhiều lần. Để tiết kiệm tài nguyên hệ thống, mình đã buộc phải xóa hết các Jobs đang còn trong Queue, cũng như trong RetrySet và ScheduledSet (vì mình đã thiết lập chỉ cho phép chạy tối đa 25 jobs / phút nên các job còn lại sẽ được Sidekiq đưa vào Scheduled.)
require 'sidekiq/api'
Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
- Reset Sidekiq Counter: đôi lúc thấy con số job failed ngứa mắt quá nên reset nó về 0. (Bạn cũng có thể làm được việc này ngay trong Web UI bằng gem Sidekiq Failures)
Sidekiq.redis {|c| c.del('stat:failed') }
- Clear Counter theo ngày cụ thể:
Sidekiq.redis {|c| c.del('stat:processed:2015-07-02') }
Sidekiq.redis {|c| c.del('stat:failed:2015-07-02') }