Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Xử lý nền chính với Sidekiq trong Ruby on Rails

Sidekiq cho phép các nhà phát triển Ruby duy trì các ứng dụng web nhanh và phản hồi nhanh bằng cách chuyển các tác vụ tốn thời gian sang nền.

Với cốt lõi là đa luồng, Sidekiq có thể xử lý nhiều công việc cùng một lúc. Điều này khiến Sidekiq trở thành một phần quan trọng của các ứng dụng Ruby hoặc Rails xử lý tải nặng hoặc thực hiện các tác vụ như gửi email hoặc xử lý tệp. Nếu không xử lý nền, các tác vụ chạy dài sẽ chặn luồng chính của ứng dụng, dẫn đến thời gian phản hồi chậm và trải nghiệm người dùng kém.

Trong bài đăng này, chúng tôi sẽ tập trung vào cách sử dụng Sidekiq một cách hiệu quả để quản lý và xử lý các tác vụ nền.

Hãy bắt đầu!

Cơ bản về Sidekiq

Về bản chất, Sidekiq là một khung xử lý nền đầy đủ tính năng dành cho Ruby. Nó cho phép bạn chạy đồng thời các tác vụ nền, điều này rất quan trọng đối với các ứng dụng web phản hồi nhanh và đáng tin cậy. Cho dù gửi email, thay đổi kích thước hình ảnh hay xử lý tệp CSV, các tác vụ tốn thời gian đều có thể được thực hiện ngầm bằng Sidekiq.

Kiến trúc của Sidekiq chủ yếu dựa vào đa luồng và khái niệm "công nhân". Tuy nhiên, kể từ Sidekiq 6.3.0, Sidekiq::Worker mô-đun không còn được dùng nữa để thay thế bằng Sidekiq::Job vì thuật ngữ "công nhân" có thể gây nhầm lẫn:

Bạn đang nói về một quá trình? Một sợi dây? Một loại công việc? Tôi khuyến khích các nhà phát triển ngừng sử dụng thuật ngữ worker.

Redis, cơ sở dữ liệu trong bộ nhớ có tốc độ nhanh như chớp, đóng một vai trò thiết yếu ở đây, hoạt động như hệ thống hàng đợi lưu trữ các công việc nền này.

Lưu ý: Mặc dù Sidekiq dựa vào Redis để lưu trữ nhưng chúng tôi sẽ không đi sâu vào chi tiết về cấu hình và cách sử dụng Redis trong bài viết này.

Cài đặt và thiết lập Sidekiq cho Rails

Để bắt đầu, bạn cần chạy Ruby phiên bản 2.5 trở lên và máy chủ Redis phiên bản 4 trở lên.

Bây giờ bạn đã sẵn sàng cài đặt đá quý Sidekiq Ruby.

Bắt đầu bằng cách thêm Sidekiq vào Gemfile của ứng dụng của bạn:

 

Tiếp theo, cài đặt nó vào thư mục dự án của bạn:

 

Bây giờ Sidekiq đã được cài đặt, bạn sẽ cần định cấu hình nó. Trong ứng dụng Rails, bạn định cấu hình Sidekiq làm ActiveJob của mình bộ chuyển đổi.Mở config/application.rb và thêm dòng sau vào định nghĩa lớp ứng dụng:

 

Ví dụ:bạn có thể định cấu hình thêm Sidekiq bằng cách tạo trình khởi tạo Sidekiq để trỏ đến phiên bản Redis. Đây là tập lệnh đặc biệt trong Rails chạy khi ứng dụng của bạn khởi động.

Trong config/initializers , tạo một tệp có tên sidekiq.rb . Bên trong tệp này, bạn có thể chỉ định các cấu hình Sidekiq khác nhau. Ví dụ:

 

Cấu hình này yêu cầu Sidekiq kết nối với máy chủ Redis cục bộ. Tất nhiên, trong môi trường sản xuất, bạn sẽ thay thế URL cục bộ bằng URL của máy chủ Redis thực tế của mình (đây là nơi tuyệt vời cho biến môi trường).

Và thế là xong! Sau khi cài đặt và định cấu hình Sidekiq, giờ đây bạn đã sẵn sàng bắt đầu tạo và xử lý công việc trong nền ứng dụng Rails của mình.

Thiết lập công việc Sidekiq

Đây là cách bạn thiết lập và khởi tạo công việc Sidekiq cơ bản:

 

Để thực sự xếp hàng một công việc để chạy, bạn gọi perform_async phương thức trên lớp công việc, như thế này:

 

Dòng này thêm một công việc vào hàng đợi mặc định sẽ thực thi ngay khi có một công việc. Các đối số 'some_name' và 42 được truyền cho phương thức thực hiện SomeNameForAJob khi thực hiện.

Từ đây, máy khách Sidekiq đẩy công việc vào hàng đợi trong Redis và máy chủ Sidekiq sẽ kéo công việc đó ra khỏi hàng đợi khi nó sẵn sàng xử lý.

Tạo công việc Sidekiq đầu tiên của bạn

Trong Sidekiq, công việc được thể hiện bằng các lớp công việc và nhiệm vụ mà chúng cần thực hiện được xác định trong perform phương pháp. Hãy tạo một công việc Sidekiq cơ bản:

 

Trong đoạn mã này, chúng tôi đã tạo lớp HelloNameJob . Điều này có hai đối số:nametimes . Khi được thực hiện, nó sẽ in lời chào tới bàn điều khiển một số lần nhất định. Tất nhiên, đây là một ví dụ đơn giản. Trong ứng dụng thực tế, perform phương thức có thể chứa bất kỳ mã nào bạn muốn chạy ở chế độ nền.

Bây giờ hãy thực hiện công việc của bạn. Chỉ cần gọi perform_async phương thức trên lớp và chuyển vào bất kỳ đối số nào perform của bạn phương pháp mong đợi. Đây là cách chúng tôi có thể lên lịch cho HelloNameJob chúng tôi vừa tạo:

 

Điều này sẽ xếp hàng công việc in "Xin chào, Jeff!" năm lần.

Nếu bạn cần thực hiện một công việc tại một thời điểm cụ thể, bạn có thể sử dụngperform_in hoặc perform_at phương pháp. Ví dụ:

 

Trong những ví dụ này, 'Meredith' sẽ nhận được lời chào của cô ấy ba lần trong vòng năm phút, trong khi 'Jeff' sẽ phải đợi hai ngày để nhận được lời chào của anh ấy hai lần.

Cách sử dụng Sidekiq nâng cao

Sidekiq không bị hạn chế tải công việc xuống nền. Nó cũng cung cấp các tính năng nâng cao cho phép bạn định cấu hình công việc của mình, bao gồm thử lại công việc và ưu tiên công việc.

Thử lại công việc tự động

Một trong những tính năng mạnh mẽ nhất của Sidekiq là tự động thử lại công việc. Theo mặc định, nếu một công việc thất bại do một ngoại lệ chưa được xử lý, Sidekiq sẽ thử lại công việc đó với thời gian chờ theo cấp số nhân. Bạn có thể tùy chỉnh số lần thử lại bằng cách chỉ định sidekiq_options trong lớp của bạn như thế này:

 

Trong ví dụ này, nếu một công việc thất bại, Sidekiq sẽ thử lại mười lần trước khi từ bỏ.

Ưu tiên công việc

Ưu tiên công việc là một tính năng nâng cao khác mà Sidekiq cung cấp. Bạn có thể kiểm soát mức độ ưu tiên của công việc bằng cách gán chúng cho các hàng đợi khác nhau và đặt mức độ ưu tiên của từng hàng đợi. Đây là cách bạn có thể chỉ định hàng đợi khi xác định công việc:

 

Trong ví dụ này, công việc cho ThisJob sẽ được đặt trong hàng đợi quan trọng. Khi khởi động máy chủ Sidekiq, bạn có thể chỉ định thứ tự xử lý hàng đợi.

Đây chỉ là một vài ví dụ về cách tận dụng các tính năng nâng cao của Sidekiq để tinh chỉnh quá trình xử lý công việc nền của bạn. Với Sidekiq, bạn có các công cụ để đảm bảo rằng công việc của bạn được xử lý hiệu quả, đáng tin cậy và theo cách phù hợp nhất với nhu cầu ứng dụng của bạn.

Giám sát và mở rộng quy mô bằng Sidekiq

Sidekiq đi kèm với các tính năng tiêu chuẩn để theo dõi và mở rộng khả năng xử lý công việc của bạn. Trang tổng quan dựa trên web cung cấp cho bạn chế độ xem thời gian thực về hàng đợi công việc của bạn. Bạn có thể xem số lượng công việc đã xử lý và công việc không thành công, cũng như thông tin chi tiết về công việc hiện tại và công việc đã lên lịch.

Để sử dụng bảng điều khiển Sidekiq, hãy gắn nó vào tệp tuyến đường Rails của bạn. Trong config/routes.rb , thêm:

 

Sau khi thêm những dòng này, bạn có thể truy cập trang tổng quan bằng cách điều hướng đến'/sidekiq' trên máy chủ của mình.

Giám sát Sidekiq bằng AppSignal

Để giám sát toàn diện hơn, Sidekiq tích hợp tốt với các công cụ giám sát hiệu suất ứng dụng như AppSignal. Trang tổng quan Sidekiq của AppSignal cung cấp thông tin chi tiết về các công việc Sidekiq của bạn, bao gồm các công việc thất bại và đã thử lại, thời lượng công việc và mức sử dụng bộ nhớ Redis.

Xử lý nền chính với Sidekiq trong Ruby on Rails

Loại thông tin này rất có giá trị trong việc xác định các điểm nghẽn khi bạn mở rộng quy mô ứng dụng của mình. Ngoài ra, cảnh báo của AppSignal giúp bạn luôn nắm rõ các điểm bất thường như độ dài hàng đợi, để bạn biết khi nào hàng đợi của mình tăng lên.

Xử lý nền chính với Sidekiq trong Ruby on Rails

Việc tích hợp AppSignal vào Sidekiqsetup với Rails của bạn rất đơn giản. Đá quý Ruby của AppSignal chèn vào phần mềm trung gian của máy chủ Sidekiq mà không cần bất kỳ cấu hình bổ sung nào. Điều này cũng hoạt động với ActiveJob!

Bạn thậm chí có thể sử dụng AppSignal cho ứng dụng Sidekiq không chạy trên Rails bằng cách sử dụng các thiết lập này được đề cập trong tài liệu.

Trường hợp sử dụng Sidekiq

Hai trong số các trường hợp sử dụng phổ biến nhất của Sidekiq là gửi email không đồng bộ và tạo báo cáo theo lịch trình. Chúng ta hãy xem xét kỹ hơn một trong những ví dụ này.

Email, đặc biệt là những email có tệp đính kèm lớn hoặc nhiều người nhận, có thể mất một khoảng thời gian đáng kể để gửi. Bằng cách xử lý việc gửi email trong công việc nền, ứng dụng của bạn có thể tiếp tục phản hồi các yêu cầu của người dùng trong khi email đang được xử lý.

Đây là một ví dụ đơn giản về công việc Sidekiq để gửi email trong ứng dụng Rails:

 

Trong ví dụ này, ResetPasswordJob sử dụng UserMailer classđể gửi email đặt lại mật khẩu cho người dùng. Để xếp hàng email cần gửi, bạn gọi ResetPasswordJob.perform_async(user_id) từ một nơi khác trong ứng dụng của bạn.

Tuy nhiên, trong một ứng dụng Rails điển hình, bạn thường không cần tạo một công việc Sidekiq riêng để gửi email. Rails cung cấp khung Action Mailer, được sử dụng để gửi email và tích hợp độc đáo với Active Job để xử lý nền.

Dưới đây là ví dụ về cách bạn có thể sử dụng Active Job và Action Mailer để gửi email đặt lại mật khẩu:

 

Trong ví dụ này, gọi deliver_later trên người gửi thư sẽ tự động xếp email vào hàng đợi để gửi dưới dạng công việc nền. Phía sau, Active Job sử dụng Sidekiq để quản lý những công việc này.

Nhưng nếu bạn muốn kiểm soát nhiều hơn công việc của mình — ví dụ:bạn muốn tùy chỉnh hành vi thử lại hoặc mức độ ưu tiên của hàng đợi — hoặc nếu bạn đang xử lý các tác vụ không tích hợp với ActiveJob dễ dàng như Action Mailer, thì bạn nên tạo các Sidekiqjob riêng biệt.

Tính linh hoạt này cùng với hiệu suất và tính dễ sử dụng của Sidekiq khiến nó trở thành một công cụ có giá trị để xử lý các tác vụ nền khác nhau trong ứng dụng Rails.

Kết thúc

Trong bài đăng này, chúng tôi đã giới thiệu về Sidekiq, khám phá những điều cơ bản của nó, đi sâu vào cài đặt và thiết lập cũng như tạo và thực hiện các công việc hữu ích.

Chúng tôi cũng đề cập đến các tính năng nâng cao hơn của Sidekiq, xem xét các trường hợp sử dụng trong thế giới thực và thảo luận về vai trò quan trọng của nó trong việc cải thiện hiệu suất và khả năng mở rộng của các ứng dụng Ruby.

Được trang bị kiến thức từ phần giới thiệu này, giờ đây bạn đã được trang bị để bắt đầu sử dụng Sidekiq hiệu quả hơn trong ứng dụng Rails của riêng mình.

Chúc bạn viết mã vui vẻ!

Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!