Xử lý Background Job trong Ruby bằng Resque
Hiện nay có nhiều công nghệ được sử dụng trong rails để giảm tải và cải thiện performace của server như: Delayed Job, Resque hay Sideiq. Về mặt cơ bản thì đó là các tiến trình chạy ngầm, tuy nhiên mỗi công nghệ đều có một cách thức hoạt động riêng. Hôm nay tôi sẽ giới thiệu về một công nghệ có ...
Hiện nay có nhiều công nghệ được sử dụng trong rails để giảm tải và cải thiện performace của server như: Delayed Job, Resque hay Sideiq. Về mặt cơ bản thì đó là các tiến trình chạy ngầm, tuy nhiên mỗi công nghệ đều có một cách thức hoạt động riêng. Hôm nay tôi sẽ giới thiệu về một công nghệ có nhiều ưu điểm được mọi người sử dụng đó là Resque. Dưới đây là nội dung sẽ được trình bày trong bài viết này:
- Giới thiệu về cách thức xử lí của tiến trình chạy ngầm (background processing).
- Giới thiệu và cách thức cài đặt Resque.
Khi chúng ta xây dựng một ứng dụng rails với nhiều chức năng và đa người dùng thì yêu cầu đặt ra là cần các xử lí ngoài những request-respond tương tác trực tiếp với người dùng. Ví dụ: nếu bạn cần gửi mail cho một số lượng hữu hạn người dùng để báo cho họ biết về chương trình khuyến mãi, tải khoản dùng thử… thì bạn không thể cài đặt trong Controller vì nó không phải là một request cụ thể cho một số lượng người dùng xác định. Khi đó chúng ta cần một chức năng xử lí logic tách biệt hoàn toàn so với kiểu HTTP request.
Một ví dụ khác là trong các ứng dụng và chức năng cần xử lí mất nhiều thời gian (thông thường là lớn hơn 400ms) mà không muốn người dùng phải chờ đợi như: upload file lớn, upload video có thể phải mất 10 phút, rõ ràng là không có chuyện chúng ta giữ HTTP request với user trong khoảng thời gian đó, thay vào đó là chúng ta phải chạy ngầm và thông báo cho người dùng đại loại như “tiến trình đang được xử lí…”. Chúng ta hãy cùng đi sâu để xem xét cách thức xử lí của ngầm (background processing) để hiểu và kiểm soát được trong quá trình debug.
Các hệ điều hành hiện đại cho phép xử lí song song rất nhiều tiến trình trên một máy tính( thiết bị phần cứng), các tiến trình này sẽ được lập lịch bởi hệ điều hành (scheduler). Việc chuyển dữ liệu qua lại giữa các tiến trình đang chạy là rất nhanh trong một lát cắt thời gian khiến cho cảm giác là tiến trình luôn được xử lí tuần tự. Chúng ta có thể tạo ra các tiến trình để hệ điều hành thực thi, tuy nhiên với số lượng tiến trình lớn ( khoảng 100.000 process) thì có vẻ như việc cung cấp tài nguyên đủ để chạy là không thể, thay vào đó chúng ta sẽ sử dụng các hàng đợi để chạy ngầm. Mỗi hàng đợi là một cấu trúc dữ liệu đã được định nghĩa cho phép chúng có thể sắp xếp các tiến trình theo thứ tự trước khi chúng được xử lí. Cấu trúc đó là FIFO (first-in-first-out) theo nguyên lí tiến trình nào vào trước thì sẽ được xử lí trước, vào sau thì sẽ xử lí sau. Đây chính là những định nghĩa cơ bản mà sau này chúng ta sẽ để cập như jobs, queues, workers.
- Bản chất Resque sẽ tạo ra các jobs được xử lí bởi các workers chạy trên redis-server vì vậy trước tiên bạn phải cài redis-server
sudo apt-get install redis-server
- Sau khi đã cài đặt redis thành công thực hiện add Resque trong Gemfile
gem 'resque'
Đừng quên chạy `bundle install`.
- Cài đặt rake tasks để workers có thể chạy với ứng dụng Rails: tạo file resque.rake trong thư mục lib/tasks
require "resque/tasks" namespace :resque do task setup: :environment do end end
- Cuối cùng là tạo thư mục app/workers chứa các worker’s tasks (file source code sẽ chứa trong này).
- Tạo file app/workers/create_file_worker.rb với nội dung:
require "fileutils" class CreateFileWorker # tên của queue @queue = :create_file def self.perform FileUtils.touch("file.txt") end end
- Trong IndexController thêm:
class IndexController < ApplicationController def index Resque.enqueue(PrintWorker) end end
- Chạy redis server: rails s
- Chạy lệnh để tạo workers và thực hiện tasks:
rake resque:work QUEUE=print
- Kiểm tra xuất hiện file file.txt trong thư mục /home