Các quy trình nền trong Node.js


96

Một aproach tốt để xử lý các quy trình nền trong ứng dụng NodeJS là gì?

Tình huống : Sau khi người dùng đăng nội dung gì đó lên một ứng dụng, tôi muốn xử lý dữ liệu, yêu cầu thêm dữ liệu từ các tài nguyên bên ngoài, v.v. Tất cả điều này khá tốn thời gian, vì vậy tôi muốn nó ra khỏi vòng lặp req / res. Lý tưởng nhất là chỉ có một hàng đợi công việc mà bạn có thể nhanh chóng kết xuất một công việc và daemon hoặc trình chạy tác vụ sẽ luôn lấy công việc cũ nhất và xử lý nó.

Trong RoR, tôi sẽ làm điều đó với một cái gì đó như Delayed Job. Node tương đương với API này là gì?


4
Câu hỏi là một đề xuất phần mềm vì nó đã được viết ngay bây giờ, và cuối cùng sẽ đóng cửa. Nếu bạn thay thế câu cuối cùng bằng "NodeJS tương đương với API này là gì?" nó trở nên chủ đề hơn. Tôi muốn thấy điều này được trả lời hơn là đóng, vì tôi cần phải làm điều gì đó tương tự.
ssube

Cảm ơn, đã diễn đạt lại nó.
Ole Spaarmann

2
Những gợi ý hay dưới đây. Ngoài ra còn có ChildProcessAPI có thể hữu ích. nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann - Tôi muốn biết cuối cùng bạn đã chọn gì và nếu bạn có thể cung cấp một ví dụ rất đơn giản về cách bạn tích hợp quyết định của mình với NodeJS - cảm ơn!
MLissCetrus

@MLissCetrus Tôi đã chọn học Elixir và không sử dụng NodeJS nữa :)
Ole Spaarmann

Câu trả lời:


114

Nếu bạn muốn thứ gì đó nhẹ, chạy trong cùng một quy trình với máy chủ, tôi thực sự khuyên bạn nên Bull . Nó có một API đơn giản cho phép kiểm soát chi tiết các hàng đợi của bạn.

Nếu bạn đang tìm kiếm thứ gì đó chạy như một quy trình công nhân độc lập, có lẽ hãy xem Kue . Nó có thể chạy như một máy chủ RESTful API và thậm chí có một số ứng dụng front-end được viết cho nó.

Nếu bạn đã quen với Ruby's Resque, có một cách triển khai nút được gọi là Node-resque

Bull, Kue và Node-resque đều được hỗ trợ bởi Redis , vốn phổ biến trong số các hàng đợi của nhân viên Node.js. Cả 3 đều có thể làm những gì mà RoR's DelayedJob làm, đó là vấn đề về các tính năng cụ thể mà bạn muốn và tùy chọn API của bạn.


3
Đây là một câu trả lời rất hay, nhưng việc đề cập đến API ChildProcess và mô-đun luồng webworker có thể khiến nó trở nên tuyệt vời. ;)
ssube

@ssube Tôi không đồng ý với bạn. Trừ khi ý bạn là tạo một ngã ba nhìn vào hàng đợi để chạy một số lệnh thì bạn đã đúng. +1 từ tôi. Child_process là những gì tôi đang sử dụng và vấn đề của tôi là tôi có thể mở một bộ quy trình khổng lồ, nhưng nếu tôi có cách quản lý các tác vụ được chạy trong hàng đợi, thì tôi rất vui vì CP là một giải pháp tốt. Điều này có thể được thực hiện, nhưng vấn đề là không nên tự mình làm tất cả công việc mà là sử dụng lại mã đã được thử nghiệm trong trận chiến (trong trường hợp này là một cái gì đó như Kue thực hiện tất cả các phép thuật bạn cần và cho phép tích hợp api).
dewwwald

Bull có hoạt động với PM2 clustering không? Hay bạn cần tạo các cụm của riêng mình theo cách thủ công, như được hiển thị trong tài liệu của họ?
Shayan Nahrvar

30

Các công việc nền không liên quan trực tiếp đến công việc dịch vụ web của bạn, vì vậy chúng không nên nằm trong cùng một quy trình. Khi bạn mở rộng quy mô, việc sử dụng bộ nhớ của các công việc nền sẽ ảnh hưởng đến hiệu suất dịch vụ web. Nhưng bạn có thể đặt chúng vào cùng một kho mã nếu bạn muốn, bất cứ điều gì có ý nghĩa hơn.

Một lựa chọn tốt để nhắn tin giữa hai quá trình sẽ là redis , nếu thỉnh thoảng thả một tin nhắn là OK. Nếu bạn muốn "không để lại thông điệp nào", bạn sẽ cần một nhà môi giới nặng ký hơn như Rabbit . Quy trình dịch vụ web của bạn có thể xuất bản và quy trình công việc nền của bạn có thể đăng ký.

Không nhất thiết hai quy trình phải được đồng lưu trữ, chúng có thể nằm trên các máy ảo riêng biệt, vùng chứa Docker, bất cứ thứ gì bạn sử dụng. Điều này cho phép bạn mở rộng quy mô mà không gặp nhiều khó khăn.


3
Thực sự câu trả lời duy nhất đã đề cập đến Thỏ? Đây là câu trả lời của doanh nghiệp. +1
Augie Gardner

11

Nếu bạn đang sử dụng MongoDB, tôi khuyên bạn nên sử dụng Chương trình nghị sự . Bằng cách đó, các phiên bản Redis riêng biệt không chạy và các tính năng như lập lịch, xếp hàng và giao diện người dùng Web đều có mặt. Giao diện người dùng chương trình nghị sự là tùy chọn và tất nhiên có thể chạy riêng.

Cũng sẽ khuyên bạn nên thiết lập sự trừu tượng được kết hợp lỏng lẻo giữa logic ứng dụng của bạn và hệ thống xếp hàng / lập lịch để toàn bộ hệ thống xử lý nền có thể được hoán đổi nếu cần. Nói cách khác, hãy giữ càng nhiều logic ứng dụng / xử lý càng xa các định nghĩa công việc trong Chương trình nghị sự của bạn để giữ cho chúng nhẹ nhàng.


3

Tôi muốn đề xuất sử dụng Redis để lên lịch công việc. Nó có nhiều cấu trúc dữ liệu khác nhau, bạn luôn có thể chọn một cấu trúc phù hợp hơn với trường hợp sử dụng của mình.

Bạn đã đề cập đến RoR và DJ, vì vậy tôi cho rằng bạn đã quen thuộc với sidekiq. Bạn có thể sử dụng node-sidekiq để lập lịch công việc nếu muốn, nhưng imo không tối ưu của nó, vì mục đích chính của nó là tích hợp nodejs với RoR.

Đối với công việc daemonising, tôi khuyên bạn nên sử dụng PM2 . Nó được sử dụng rộng rãi và được bảo trì tích cực. Nó giải quyết rất nhiều vấn đề (ví dụ: triển khai, giám sát, phân cụm) vì vậy hãy đảm bảo rằng nó sẽ không phải là một thứ quá mức cần thiết cho bạn.


1

Tôi đã thử xếp hàng ong & và cuối cùng đã chọn bò đực. Đầu tiên tôi chọn bee-queue b / c nó khá đơn giản, các ví dụ của họ rất dễ hiểu, trong khi các ví dụ của bull hơi phức tạp. Bee's wiki Nguồn gốc của Bee Queue cũng gây được tiếng vang với tôi. Nhưng vấn đề với bee là <1> thời gian giải quyết vấn đề của họ khá chậm, bản cập nhật mới nhất của họ là 10 tháng trước. <2> Tôi không thể tìm thấy cách dễ dàng để tạm dừng / hủy bỏ công việc.

Bull, mặt khác, thường xuyên cập nhật mã của họ, phản ứng với các vấn đề. Đánh giá hàng đợi việc làm của Node.js cho biết điểm yếu của bull là "thời gian giải quyết vấn đề chậm", nhưng kinh nghiệm của tôi thì ngược lại!

Nhưng dù sao thì api của chúng cũng tương tự nhau nên việc chuyển từ cái này sang cái khác khá dễ dàng.


-6

Tôi khuyên bạn nên sử dụng một khung Node.js thích hợp để tạo ứng dụng cho bạn.

Tôi nghĩ rằng mạnh mẽ và dễ sử dụng nhất là Sails.js .

Đó là một khung công tác MVC nên nếu bạn đã quen phát triển trong ROR, bạn sẽ thấy nó rất dễ dàng!

Nếu bạn sử dụng nó, nó đã có một trình quản lý công việc mạnh mẽ (theo thuật ngữ javascript).

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

Nếu bạn cần thêm thông tin, đừng ngần ngại liên hệ với tôi!


5
Tôi đang tìm kiếm một trình quản lý quy trình nền cho Node. Theo định nghĩa, điều này phải tách biệt khỏi ứng dụng web của bạn. Và sẽ không thành vấn đề nếu bạn sử dụng Sails, Express, Hapi hoặc bất cứ thứ gì bạn thích.
Ole Spaarmann

Ok bạn có thể thử Bull hoặc WebWorker-Chủ đề ... chúc may mắn whit Node.js :)
Zio Mak Sò

Có vẻ như sails.js khá lớn và làm được nhiều thứ hơn cronJobs. Tôi đã tìm thấy node-cron ( github.com/kelektiv/node-cron ) mà tôi đặt cược là những gì sails.js sử dụng.
pbatey 21/10/16
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.