Giới thiệu Resque
Resque là một thư viện Redis-backed được cộng đồng Ruby phát triển, hỗ trợ cho việc quản lý các jobs trong Rails, sắp xếp, tổ chức những jobs này vào hàng đợi (queue) và xử lí chúng lần lượt. Resque là một opensource. Mã nguồn được chia sẻ trên Github tại địa chỉ: https://github.com/resque/resque
Vì sao phải sử dụng hàng đợi (Queue)? Trong các dự án lớn, số lượng tác vụ (jobs) thực hiện là vô cùng, vô tận. Bạn khó có thể đoán chính xác được chúng có bao nhiêu và nếu xử lý đồng thời thì tài nguyên máy chủ cần sử dụng để xử lý là rất lớn. Trong khi đó, cấu hình server thường có giới hạn. Và điều không may mắn nếu phải xứ lý đồng thời các tác vụ thì sẽ dẫn đến server bị treo, ứng dựng sẽ ngừng phục vụ. Vì vậy, chúng ta sử dụng cơ chế hàng đợi để xử lý lần lượt các tác vụ.
Tích hợp Resque vào Rails
Tiền đề bài viết
- Ruby on Rails 5.2 (Phiên bản mới nhất ở thời điểm bài viết này)
- Đã được cài đặt Redis làm Backend xử lý Jobs. Nếu chưa cài đặt các bạn vui lòng tham khảo bài viết trước của mình: Sử dụng Redis để lưu trữ session, cookie
1. Bổ sung thư viện Redis, và Resque vào Gemfile
Sửa file Gemfile của bạn, bổ sung nội dung bên dưới.
# Redis store gem 'redis', '< 4' gem 'redis-rails' gem 'redis-store', '~> 1.4.0' # Resque Redis gem 'resque', require: 'resque/server'
Sau đó các bạn chạy lệnh sau để build gem
bundle update
Để kiểm tra lại gem đã cài đặt thành công chưa sử dụng command: bundle info resque
2. Cấu hình Resque Task
Sửa file Rakefile và thêm nội dung sau:
require 'resque/tasks' task 'resque:setup' => :environment
Sửa file config/application.rb
module Eventlog class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.2 # Be sure to have the adapter's gem in your Gemfile # and follow the adapter's specific installation # and deployment instructions. config.active_job.queue_adapter = :resque end end
Sửa file app/jobs/application_jobs.rb
# frozen_string_literal: true class ApplicationJob < ActiveJob::Base before_perform do |job| ActiveRecord::Base.clear_active_connections! end end
3. Tạo mới một job sử dụng hàng đợi
Từ thư mục của project, sử dụng command bên dưới để tạo job
bin/rails generate job newsletter_subscriber --queue default
Sau khi chạy command, rails sẽ tạo ra file app/jobs/newsletter_subscriber_job.rb chưa nội dung xử lý Job
class NewsletterSubscriberJob < ApplicationJob queue_as :default def perform(*args) # Do something later (Xử lý job ở đây) puts args end end
Để thêm 1 queue vào hàng đợi chèn đoạn code sau vào chương trình của bạn
NewsletterSubscriberJob.perform_later 'This is my job'
4. Xử lý hàng đợi ở Resque
Chạy command sau để thực thi hàng đợi
QUEUE=* rake resque:work
Nguồn: vinasupport.com