Tìm hiểu và cách sử dụng sidekiq và sidetiq
Bài đăng này đã không được cập nhật trong 3 năm
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ạybundle 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](https://images.viblo.asia/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ó modeluser
với 2 thuộc tínhname
vàpoint
và được show ra như bên dưới: Khi ta muốn tăngpoint
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útIncrease point
thì ta làm như sau: - Tạo 1 file
user_worker.rb
trong thư mụcapp/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
trongapp/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àmperform
tronguser_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ạybundle 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
III. Tài liệu tham khảo
All rights reserved