+1

Phân biệt giữa gem Whenever và Active Job trong Rails

Mayfest2023

Lời mở đầu

Trong việc phát triển ứng dụng web bằng Rails, việc lập lịch các tác vụ (scheduling tasks) và xử lý các công việc bất đồng bộ (asynchronous jobs) là hai yếu tố quan trọng. Rails cung cấp hai giải pháp phổ biến để thực hiện hai chức năng này: gem wheneveractive job. Trên thực tế, hai thư viện này có mục đích và phạm vi sử dụng khác nhau. Trong bài viết này, chúng ta sẽ tìm hiểu sự khác biệt giữa gem Whenever và Active Job trong Rails.

1. Whenever

Whenever là một gem cho phép bạn định nghĩa và lập lịch các tác vụ cron job trên máy chủ. Điểm mạnh của Whenever là nó sử dụng cú pháp Ruby đơn giản để định nghĩa các công việc và lập lịch chúng. Điều này giúp bạn dễ dàng hiểu và quản lý lịch trình của các công việc.

Để sử dụng Whenever, bạn cần thêm gem này vào Gemfile của ứng dụng Rails của mình. Sau đó, bạn có thể tạo một tệp cấu hình Whenever để định nghĩa các công việc và lịch trình cho chúng. Các công việc có thể được chạy theo các chu kỳ thời gian cố định hoặc theo lịch trình tùy chỉnh.

Tuy nhiên, cần lưu ý rằng Whenever chỉ làm việc với các công việc cron bên ngoài ứng dụng Rails của bạn. Điều này có nghĩa là công việc sẽ chạy trong một môi trường riêng biệt và không có truy cập vào các phần của ứng dụng Rails như models, controllers, hoặc views.

Whenever sử dụng file schedule.rb để định nghĩa các tác vụ được lên lịch. Ví dụ, bạn có thể sử dụng gem whenever để lên lịch gửi email hàng ngày vào lúc 8 giờ sáng:

every 1.day, at: '8:00 am' do
  runner 'UserMailer.daily_summary.deliver_now'
end

Hay lên lịch chạy một tác vụ sau mỗi giờ:

every 1.hour do
  rake 'data:process'
end

Khi file schedule.rb được cập nhật, bạn cần chạy lệnh whenever --update-crontab để cập nhật lịch cho hệ thống.

Một số điểm nổi bật:

Cú pháp đơn giản: whenever cung cấp một cú pháp đơn giản và dễ hiểu để lên lịch chạy các tác vụ.

Dễ dàng cấu hình: whenever cho phép bạn cấu hình các tác vụ định kỳ theo ý muốn. Bạn có thể định lịch chúng hàng giờ, hàng ngày, hàng tuần hoặc theo bất kỳ lịch trình nào khác mà bạn muốn.

Quản lý tập trung: Với whenever, bạn có thể quản lý tất cả các tác vụ định kỳ trong một vị trí duy nhất. Điều này giúp giảm thiểu sự phân tán và tăng khả năng bảo trì của hệ thống.

2. Active Job

Active Job là một phần của Rails cho phép thực hiện các tác vụ bất đồng bộ, nó giúp trừu tượng hóa việc thực hiện các công việc và cho phép bạn sử dụng các backend khác nhau như Delayed Job, Resque, hay Sidekiq.

Với Active Job, bạn có thể tạo ra các công việc và gửi chúng vào hàng đợi để được thực thi. Các công việc này có thể chạy ngay lập tức hoặc theo lịch trình mà bạn xác định. Một ưu điểm lớn của Active Job là nó có thể sử dụng các thành phần khác trong ứng dụng Rails như models, services, và helpers, giúp bạn dễ dàng xử lý các tác vụ.

Để thực hiện một tác vụ bất đồng bộ, bạn chỉ cần tạo một lớp kế thừa từ lớp ApplicationJob và định nghĩa phương thức perform. Ví dụ:

class MyJob < ApplicationJob
  queue_as :default
 
  def perform(*args)
    # Do something later
  end
end

Sau đó, bạn có thể khởi tạo đối tượng MyJob và gửi nó đến hàng đợi để chạy bất đồng bộ:

MyJob.perform_later(arg1, arg2)

Một số điểm nổi bật:

Đa ngôn ngữ và đa nguồn gốc: Bạn có thể sử dụng active job với bất kỳ công nghệ xử lý nào mà Rails hỗ trợ, chẳng hạn như Sidekiq, Delayed Job hoặc Resque.

Quản lý tác vụ bất đồng bộ: Bạn có thể tạo và lên lịch các công việc bất đồng bộ một cách linh hoạt, cho phép xử lý các tác vụ mà không làm tắc nghẽn luồng chính.

Tích hợp với hàng đợi: Active Job tích hợp tốt với các hệ thống hàng đợi, cho phép bạn chuyển các tác vụ vào hàng đợi để xử lý sau này. Điều này giúp giảm thời gian phản hồi của ứng dụng và tăng khả năng mở rộng.

Đa kênh thông báo: Active Job cung cấp tính năng thông báo đa kênh, cho phép bạn gửi thông báo đến nhiều nguồn đích khác nhau từ các tác vụ bất đồng bộ. Bạn có thể gửi email, tin nhắn, thông báo push hoặc các phương tiện truyền thông khác thông qua active job.

Quản lý lỗi và tái thực thi: Active Job hỗ trợ quản lý lỗi và tái thực thi các tác vụ bất đồng bộ. Nếu một công việc thất bại, bạn có thể xử lý lỗi theo cách phù hợp, ví dụ như gửi email thông báo lỗi hoặc tái thực thi công việc một số lần.

Tổng kết

Tóm lại, gem wheneveractive job đều là các công cụ hỗ trợ quan trọng trong Rails để xử lý các tác vụ định kỳ và bất đồng bộ.

Gem whenever giúp lên lịch lịch và quản lý các tác vụ định kỳ trong ứng dụng. Nó cung cấp cú pháp đơn giản và tích hợp với cron job, cho phép bạn quản lý các tác vụ theo lịch trình cụ thể. Whenever giúp tăng tính linh hoạt và giảm sự phân tán trong việc quản lý các tác vụ định kỳ.

Còn active job giúp xử lý các tác vụ bất đồng bộ trong Rails. Nó đơn giản hóa việc tạo và quản lý các công việc bất đồng bộ trong ứng dụng. Active job tích hợp tốt với hàng đợi và cung cấp khả năng quản lý tác vụ, đa kênh thông báo, quản lý lỗi và tái thực thi.

Tùy thuộc vào yêu cầu của dự án, bạn có thể lựa chọn sử dụng gem whenever khi cần lên lịch cho các tác vụ định kỳ theo thời gian cụ thể. Trong khi đó, active job là sự lựa chọn tốt khi xử lý các tác vụ bất đồng bộ và tương tác với hàng đợi. Việc dùng chung hai thư viện này sẽ giúp bạn xây dựng ứng dụng Rails mạnh mẽ và linh hoạt, có khả năng xử lý cả tác vụ định kỳ và tác vụ bất đồng bộ một cách hiệu quả.

Trên đây là sự khác biệt giữa gem wheneverActive Job được mình tổng hợp từ nhiều nguồn khác nhau. Cảm ơn các bạn đã theo dõi!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí