Giới thiệu Resque
Resque là một thư viện được phát triển bởi cộng đồng Ruby, sử dụng Redis để quản lý các tác vụ (jobs) trong ứng dụng Rails. Nó cho phép chúng ta xếp hàng các tác vụ và xử lý chúng một cách tuần tự. Resque là một dự án mã nguồn mở, và mã nguồn của nó có sẵn trên Github theo đường dẫn: https://github.com/resque/resque
Việc sử dụng hàng đợi (Queue) trong Resque có lý do của nó. Trong các dự án lớn, số lượng tác vụ cần thực hiện có thể rất lớn và không dễ dàng dự đoán được. Nếu chúng ta cố gắng xử lý tất cả chúng đồng thời, chúng ta sẽ cần sử dụng một lượng lớn tài nguyên máy chủ. Tuy nhiên, tài nguyên máy chủ thường có giới hạn.
Nếu chúng ta cố gắng xử lý tất cả các tác vụ mà không sử dụng hàng đợi, có thể gây ra tình trạng treo server và ứng dụng có thể ngừng hoạt động. Vì vậy, chúng ta sử dụng cơ chế hàng đợi để xử lý từng tác vụ một, đảm bảo rằng hệ thống hoạt động ổn định và không gặp sự cố nghiêm trọng.
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.
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