- vừa được xem lúc

Quản lý background job với Sidekiq trong Rails

0 0 2

Người đăng: Đặng Đình Luân

Theo Viblo Asia

Trong thế giới phát triển ứng dụng web, đặc biệt là với Rails, việc xử lý các tác vụ tốn thời gian như gửi email, xử lý ảnh, hoặc tích hợp với các dịch vụ bên thứ ba có thể làm chậm đáng kể trải nghiệm người dùng. Đây chính là lúc các background job trở thành vị cứu tinh, và Sidekiq là một trong những giải pháp phổ biến và mạnh mẽ nhất cho bài toán này.

Sidekiq là gì?

Sidekiq là một framework mã nguồn mở dành cho Ruby on Rails giúp bạn xử lý các tác vụ nền một cách hiệu quả. Nó sử dụng Redis làm bộ nhớ đệm (message broker) để lưu trữ các job trong hàng đợi (queue) và sau đó các worker của Sidekiq sẽ lấy các job này ra để xử lý độc lập với tiến trình chính của ứng dụng web

Tại sao nên dùng Sidekiq?

  • Cải thiện hiệu suất ứng dụng: Giải phóng tiến trình web khỏi các tác vụ nặng, giúp ứng dụng phản hồi nhanh hơn.
  • Trải nghiệm người dùng mượt mà: Người dùng không phải chờ đợi các tác vụ tốn thời gian hoàn thành.
  • Xử lý tác vụ không đồng bộ: Cho phép các tác vụ chạy ngầm mà không làm chặn luồng chính của ứng dụng.
  • Độ tin cậy cao: Sidekiq có cơ chế retry job khi gặp lỗi và xử lý job chết (dead job), đảm bảo các tác vụ được thực thi.
  • Dễ dàng tích hợp và sử dụng: Với cấu trúc đơn giản, Sidekiq rất dễ dàng để cài đặt và triển khai trong ứng dụng Rails.

Cài đặt và cấu hình Sidekiq

1. Thêm Gem

Đầu tiên, bạn cần thêm sidekiqredis-rails vào Gemfile của mình:

# Gemfile
gem 'sidekiq'
gem 'redis-rails'

Sau đó, chạy bundle install

2. Cấu hình Redis

Sidekiq cần một instance của Redis. Bạn có thể cài đặt Redis cục bộ hoặc sử dụng một dịch vụ Redis từ bên thứ ba.

Tạo file cấu hình config/initializers/sidekiq.rb (nếu chưa có):

# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config| config.redis = { url: ENV.fetch('REDIS_URL', 'redis://localhost:6379/1') }
end Sidekiq.configure_client do |config| config.redis = { url: ENV.fetch('REDIS_URL', 'redis://localhost:6379/1') }
end

Bạn nên sử dụng biến môi trường REDIS_URL để dễ dàng quản lý cấu hình Redis trong các môi trường khác nhau.

Tạo Background Job đầu tiên với Sidekiq

Sidekiq sử dụng các Worker để xử lý các job. Một worker là một lớp Ruby kế thừa từ ApplicationJob (hoặc Sidekiq::Worker trực tiếp).

1. Tạo Worker

Tạo một file worker, ví dụ app/workers/hard_worker.rb:

# app/workers/hard_worker.rb
class HardWorker include Sidekiq::Worker def perform(name, count) puts "Starting hard work for #{name} with count #{count}..." sleep(5) # Giả lập một tác vụ tốn thời gian puts "Hard work finished for #{name}!" end
end

Trong ví dụ này, perform là phương thức mà Sidekiq sẽ gọi khi xử lý job. Các đối số của phương thức này sẽ được truyền khi bạn enqueue job.

2. Enqueue Job (đưa job vào hàng đợi)

Có hai cách để đưa job vào hàng đợi:

  • Ngay lập tức:
HardWorker.perform_async("Alice", 10)

perform_async sẽ ngay lập tức đẩy job vào hàng đợi để Sidekiq xử lý.

  • Sau một khoảng thời gian nhất định:
HardWorker.perform_in(5.minutes, "Bob", 20)

perform_in sẽ đẩy job vào hàng đợi để Sidekiq xử lý sau 5 phút.

Chạy Sidekiq

Để Sidekiq bắt đầu xử lý các job trong hàng đợi, bạn cần khởi động tiến trình Sidekiq:

bundle exec sidekiq

Bạn sẽ thấy Sidekiq bắt đầu lắng nghe các hàng đợi và xử lý các job khi chúng được thêm vào.

Sidekiq Web UI

Sidekiq cung cấp một giao diện web (Web UI) mạnh mẽ giúp bạn theo dõi các job, hàng đợi, các job đang chạy, job đã chết (dead jobs), và nhiều thông tin khác.

Để tích hợp Sidekiq Web UI vào ứng dụng Rails của bạn, thêm vào config/routes.rb:

# config/routes.rb
require 'sidekiq/web' Rails.application.routes.draw do mount Sidekiq::Web => '/sidekiq' # Đặt '/sidekiq' là đường dẫn để truy cập UI
end

Sau khi khởi động server Rails, bạn có thể truy cập http://localhost:3000/sidekiq để xem Sidekiq Web UI.

Lưu ý: Trong môi trường production, bạn nên bảo vệ đường dẫn /sidekiq bằng xác thực để tránh truy cập trái phép.

Các tính năng nâng cao của Sidekiq

  • Queues: Sidekiq cho phép bạn định nghĩa nhiều hàng đợi với mức độ ưu tiên khác nhau, giúp bạn quản lý các loại job khác nhau.
  • Retry Mechanism: Khi một job thất bại, Sidekiq sẽ tự động thử lại theo một chiến lược nhất định.
  • Dead Job Queue: Các job thất bại nhiều lần sẽ được chuyển vào hàng đợi "Dead", cho phép bạn kiểm tra và xử lý thủ công.
  • Batching: Xử lý một nhóm các job như một đơn vị duy nhất.
  • Scheduler: Lên lịch các job chạy định kỳ (cần thêm gem sidekiq-cron).

Kết luận

Sidekiq là một công cụ không thể thiếu đối với các ứng dụng Rails cần xử lý các tác vụ nền hiệu quả. Với khả năng mở rộng, độ tin cậy cao và giao diện người dùng trực quan, Sidekiq giúp bạn xây dựng các ứng dụng nhanh hơn, phản hồi tốt hơn và mang lại trải nghiệm tốt hơn cho người dùng.

Bạn đã từng sử dụng Sidekiq trong dự án của mình chưa? Chia sẻ kinh nghiệm của bạn ở phần bình luận nhé!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 3: Docker-compose)

1. Mở đầu. . .

0 0 136

- vừa được xem lúc

Tích hợp VNPAY vào Rails

Xin chào 500 ae năm mới nhé. Tiếp nối câu chuyện về Thanh toán online mà mình có chia sẽ ở 2 bài trước, mọi người chưa đọc thì có thể vào xem ở đây nhé.

1 1 102

- vừa được xem lúc

Tìm hiểu Adapter Pattern trong Rails

. Nếu là một web developer chắc hẳn chúng ta đã không ít lần đọc qua về các Design patterns hay cách áp dụng chúng để làm cho code trở nên hướng đối tượng hơn, dễ đọc, dễ hiểu, dễ maintain, dễ mở rộng, … Các design patterns được áp dụng khá nhiều trong các Rails projects như Service Object, Decorato

0 0 52

- vừa được xem lúc

Sử dụng Searchkick để tìm kiếm thông minh trên Rails và Elasticsearch

Bạn đã bao giờ tự hỏi, ứng dụng web của mình có thể mở rộng quy mô bằng cách học được các từ khóa mà người dùng tìm kiếm? Có giải pháp nào cung cấp công cụ tìm kiếm tự động nhanh chóng với chỉ 1 từ khóa bất kì? Thật may khi có Searchkick và Elasticsearch là các công cụ hỗ trợ công việc tìm kiếm trở

0 0 110

- vừa được xem lúc

Những sai lầm bạn có thể mắc phải khi code Rails

. Chào các bạn, chào các bạn. Đừng vội đóng tab nha.

0 0 53

- vừa được xem lúc

Một số lưu ý cải thiện performance khi làm việc với Rails

Khi làm việc với ruby on rails chắc hẳn chúng ta sẽ làm việc với active record rất nhiều. Tuy nhiên có nhiều điều có thể ta vẫn chưa thực sự hiểu, ví dụ như ActiveRecord execute SQL query như thế nào? Và cũng còn khá nhiều lập trình viên khác cũng không để ý tới điều này.

0 0 116