Tìm hiểu và cách sử dụng sidekiq và sidetiq
I. Các khái niệm 1. Sidekiq Sidekiq là một gem hỗ trỡ xử lý ngầm dưới background mạnh mẽ cho Ruby. Nó nhằm mục đích là đơn giản để tích hợp với bất kỳ ứng dụng Rails hiện đại và hiệu suất cao hơn nhiều so với các giải pháp hiện có khác. Link github 2. Sidetiq Sidetiq là một gem hỗ trợ cho ...
I. Các khái niệm
1. Sidekiq
Sidekiq là một gem hỗ trỡ xử lý ngầm dưới background mạnh mẽ cho Ruby. Nó nhằm mục đích là đơn giản để tích hợp với bất kỳ ứng dụng Rails hiện đại và hiệu suất cao hơn nhiều so với các giải pháp hiện có khác. Link github
2. Sidetiq
Sidetiq là một gem hỗ trợ cho gem Sidekiq, giúp người dùng có thể lập lịch 1 cách định kỳ tự động. Link github
II. Cách sử dụng
Trước tiên muốn sử dụng gem sidekiq ta cần có redis-server => Link hướng dẫn cài đặt redis
1. Cách cài đặt sidekiq
- Trong file Gemfile ta thêm như bên dưới rồi chạy bundle install
#Gemfile gem 'sidekiq' gem 'sinatra', require: false
Sau đó ta vào thư mục `routes.rb` rồi thêm như bên dưới
require 'sidekiq/web' # ... mount Sidekiq::Web, at: '/sidekiq'
Như vậy ta sẽ được như hình bên dưới khi ta vào link `http://localhost:3000/sidekiq` ![sidekiq.png](/uploads/171f168b-a44c-47ca-9e97-5aa5565359d6.png) Trang này là trang quản lý các jobs mà hệ thống đã khởi tạo
- Khi ta chạy được sidekiq rồi thì ta sẽ thực hành nó. Ở đây ta có model user với 2 thuộc tính name và point và được show ra như bên dưới: Khi ta muốn tăng point của user lên 10 điểm nữa, nhưng ta không muốn nó tăng ngay lập tức mà cho nó tăng vào thời điểm 20 giây sau khi bấm nút Increase point thì ta làm như sau:
- Tạo 1 file user_worker.rb trong thư mục app/workers với nội dung như sau:
#app/workers/user_worker.rb class UserWorker include Sidekiq::Worker def perform user_id, point user = User.find_by_id user_id return unless user destroy_jobs user_id, point user.increment! :point, point end def destroy_jobs user_id, point jobs = Sidekiq::ScheduledSet.new.select do |retri| retri.klass == self.class.name && retri.item["args"] == [user_id, point] end jobs.each(&:delete) end end
- Sau đó ở trong app/controllers/users_controller.rb ta viết như sau:
#app/controllers/users_controller.rb class UsersController < ApplicationController # ... def update @user = User.find_by params[:id] UserWorker.perform_at(Time.zone.now + 20.seconds, @user.id, 10) redirect_to user_path @user end end
- Như vậy là mỗi khi ta bấm nút Increase point sidekiq sẽ làm việc là tạo ra 1 jobs trong vòng 20 giây nữa thực hiện tăng số điểm lên 10 điểm (chúng ta có thể thấy hàm xử lý tăng điểmm ở app/workers/user_worker.rb)
- Còn hàm destroy_jobs trong app/workers/user_worker.rb có công việc là xóa đi các jobs đã thực hiện rồi, có nghĩa là khi vào đến hàm perform trong user_worker.rb rồi thì có nghĩa jobs đó đã được thực hiện => xóa nó đi sau khi thực hiện xong.
2. Cách cài đặt sidetiq
- Trong file Gemfile ta thêm như bên dưới rồi chạy bundle install
#Gemfile gem 'sidetiq'
- Ở trong file app/workers/user_worker.rb ta sẽ thêm như sau:
class UserWorker # ... include Sidetiq::Schedulable recurrence{minutely.second_of_minute((0..59).to_a.select{|v| v % 10 == 0})} def perform _user_id, _point User.all.each do |user| user.increment! :point, 10 if user.name == "Phuong" end end # ... end
Code như trên có nghĩa là: cứ mỗi 10 giây thì nó sẽ thực hiện update point cho những user nào mà có tên là Phuong.
=> Trên đây là những bước cơ bản để bạn có thể thao tác được 2 gem rất tuyệt vời này. Chúc bạn thành công