12/08/2018, 14:41

Giới thiệu về delayed_job và cách sử dụng

Chắc hẳn khi bạn tham gia lập trình RoR, bạn đã nghe đến khái niệm "Background Job". "Background Job" là gì? Đó là một tiến trình xử lý bên ngoài luồng request/response thông thường và là một thành phần của bất kỳ web framework hiện đại nào. Đối với các request có thời gian response lâu hoặc yêu ...

Chắc hẳn khi bạn tham gia lập trình RoR, bạn đã nghe đến khái niệm "Background Job". "Background Job" là gì? Đó là một tiến trình xử lý bên ngoài luồng request/response thông thường và là một thành phần của bất kỳ web framework hiện đại nào. Đối với các request có thời gian response lâu hoặc yêu cầu thực hiện trong tương lai, để không mất trải nghiệm của khách hàng (khách hàng phải đợi request thực hiện xong) thì sử dụng background job là điều hoàn toàn hợp lý. Các tiến trình này sẽ chạy ngầm, và không hiển thị với người dùng cuối. Mình xin giới thiệu 1 gem là tiêu biểu cho background job của RoR đó là: Delayed_job.

1. Delayed_job là gì?

Delayed_job là một asynchronously background processing. Được sử dụng khi bạn muốn xử lý các tác vụ có thời gian thực thi lâu hoặc các tác vụ sẽ được chạy trong tương lai. Điều đó sẽ giúp giảm tải cho server và tăng hiệu năng cho website. Các tác vụ đó có thể là:

  • gửi thư
  • resize ảnh
  • download file
  • import file ....

2. Cơ chế hoạt động

  • Để cài đặt delayed_job, bạn sử dụng gem ‘delayed_job_active_record’
$ rails g delayed_job:active_record
$ rake db:migrate
  • Để start Worker của Delayed_job
$ rake jobs:work
  • Khi chạy rake db, delayed_job sẽ tạo ra 1 bảng với tên gọi là delayed_job. Các tác vụ chạy ngầm sẽ được lưu vào bảng này và sau đó delayed_job sẽ xử lý từng tác vụ. Mỗi tác vụ sau khi chạy hoàn thành thì record của tác vụ đó sẽ bị xóa khỏi bảng này. Nếu tác vụ chạy không thành công, nó sẽ được retry đến khi hết lần thử tối đa, nếu vẫn không thành công thì sẽ bị xóa vào 1 thời gian sau đó.
  • Các column chính trong bảng delayed_job:
    • priority: task có độ ưu tiên nhỏ hơn sẽ chạy trước
    • attempts: số lần retry của task
    • last_error: nguyên nhân gây lỗi của lần thử cuối cùng
    • run_at: thời điểm để thực thi task
    • queue: tên của queue
  • Bạn có thể tạo file delayed_job_config.rb trong thư mục config/initializers/ để cấu hình lại các cài đặt của delayed_job. Sau đây là 1 số cài đặt tiêu biểu:
    • destroy_failed_jobs: có xóa job khi thất bại hay không
    • sleep_delay: thời gian sleep của Worker khi không có tác vụ nào để thực thi
    • max_attempts: số lần thử tối đa của job
    • max_run_time: thời gian chạy tối đa của job
    • max_priority: độ ưu tiên tối đa của job

3. Sử dụng delayed_job

Để sử dụng delayed_job chúng ta có 3 cách:

  • delay
  • handle_asynchronously
  • enqueue

a. delay

chỉ cần gọi .delay.method(params) với bất kì object nào bạn muốn xử lý ở background. Ví dụ khi muốn gửi mail, bạn chỉ cần gọi:

NotificationMailer.delay.notify_account_activated(@user)

Lưu ý: khi gửi mail với delayed_job thì không cần hàm deliver().

b. handle_asynchronously

được sử dụng khi 1 hàm luôn được chạy nền. Để sử dụng, bạn chỉ việc đặt handle_asynchronously :method_name ngay dưới định nghĩa hàm ấy

c. enqueue

bạn có thể tạo ra một job tùy chỉnh bằng cách tạo một đối tượng Ruby riêng biệt mà chỉ cầ respond để thực hiện. Công việc đó có thể chạy bất cứ lúc nào bằng cách bắt Delayed Job xếp hành động đó vào hàng đợi.

4. Kết luận

Delayed_job là 1 gem rất tốt giúp bạn xử lý các tác vụ chạy ngầm đòi hỏi thời gian thực thi lâu hoặc chạy trong tương lai. Bài viết của mình chỉ là 1 bài giới thiệu tổng quan nhất. Hi vọng sẽ giúp các bạn có 1 cái nhìn sơ bộ về gem này. Cảm ơn các bạn đã theo dõi.

0