+1

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 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](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ó model user với 2 thuộc tính namepoint và được show ra như bên dưới: user_show.png 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

III. Tài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí