Background jobs và ứng dụng Resque trong rails 3.2

Giới thiệu

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:

1. Giới thiệu về cách thức xử lí của tiến trình chạy ngầm (background processing).
2. Giới thiệu và cách thức cài đặt Resque.
3. Ví dụ demo.

Nội dung

I. Giới thiệu về cách thức xử lí của tiến trình chạy ngầm (background processing)

resque_workflow

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”.

II. Cài đặt Resque

2.1. Giới thiệu về resque

Resque là một thư viện Redis-backed hỗ trợ cho việc tạo background jobs, sắp xếp những jobs này vào các queues và xử lí chúng. Resque có thể được gọi là một opensource khi có cả 1 một cộng đồng Ruby phát triển và cải tiến (tham khảo: https://github.com/resque/resque). Điểm khác biệt của Resque là chúng không sử dụng ActiveRecord (xử lí chậm) và tách biệt hoàn toàn với cấu trúc của ứng dụng của bạn, phát triển theo 1 hướng mềm dẻo hơn.

2.2. Cài đặt Resque trên unbuntu

– 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'

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’

task "resque:setup" => :environment #cho phép Workers có thể truy cập tới models.

– 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).

III. Ví dụ demo

– Tạo file app/workers/create_file_worker.rb với nội dung:

require 'fileutils'
class CreateFileWorker
@queue = :create_file # tên của queue

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:

redis-server

- 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

Add a Comment

Scroll Up