2015-06-23 14 views
48

Aproach tốt để xử lý các quy trình nền trong ứng dụng NodeJS là gì?Các quy trình nền trong Node.js

Kịch bản: Sau khi người dùng đăng nội dung nào đó lên ứng dụng, tôi muốn thêm dữ liệu, yêu cầu dữ liệu bổ sung từ tài nguyên bên ngoài, v.v. vòng lặp. Lý tưởng sẽ là chỉ có một hàng đợi công việc mà bạn có thể nhanh chóng đổ một công việc vào và một daemon hoặc nhiệm vụ Á hậu sẽ luôn luôn mất một trong những lâu đời nhất và xử lý nó.

Trong ROR, tôi đã thực hiện nó với một công việc như Công việc bị trì hoãn. Tương đương Node của API này là gì?

+3

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

+0

Cảm ơn, đã lặp lại nó. –

+2

Đề xuất tốt bên dưới. Ngoài ra còn có API 'ChildProcess' có thể hữu ích. https://nodejs.org/api/child_process.html – lispHK01

Trả lời

67

Nếu bạn muốn thứ gì đó nhẹ, chạy trong cùng quy trình với máy chủ, tôi khuyên bạn nên Bull. Nó có một API đơn giản cho phép kiểm soát hạt mịn trên 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ó thể xem xét 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 thuộc với Resque Ruby, có một thực hiện nút gọi Node-resque

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

+1

Đây là câu trả lời rất hay, nhưng đề cập đến mô-đun ChildProcess API và [webworker-threads] (https://www.npmjs.com/package/webworker-threads) có thể làm cho nó tuyệt vời. ;) – ssube

+0

@ssube Tôi không đồng ý với bạn. Trừ khi bạn có nghĩa là tạo ra một ngã ba mà nhìn vào một hàng đợi để chạy một số lệnh bạn là đú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 tập hợp lớn các quy trình, nhưng nếu tôi có cách quản lý các nhiệm vụ được chạy trong hàng đợi, thì tôi rất vui khi 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 tự mình làm tất cả các công việc, nhưng để sử dụng lại mã đó là thử nghiệm chiến đấu (trong trường hợp này giống như Kue thực hiện tất cả phép thuật bạn cần và cho phép tích hợp api). – dewwwald

17

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 được 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 trong cùng một kho lưu trữ mã nếu bạn muốn, bất kỳ điều gì có ý nghĩa hơn.

Một lựa chọn tốt cho nhắn tin giữa hai quy trình sẽ là redis, nếu bạn bỏ qua một thư bây giờ và sau đó là OK. Nếu bạn muốn "không có thư bị bỏ lại", bạn sẽ cần một nhà môi giới hạng nặng 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 cần thiết cho hai quy trình được đồng tổ chức, chúng có thể nằm trên các máy ảo riêng biệt, vùng chứa Docker, bất kể bạn sử dụng cái gì. Điều này cho phép bạn mở rộng mà không gặp nhiều rắc rối.

+0

Thực sự là 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 –

-5

Tôi đề xuất sử dụng khung Node.js phù hợp để xây dựng ứng dụng cho bạn.

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

Đó là một khung MVC vì vậy nếu bạn được sử dụng để phát triển trong ROR, bạn sẽ tìm thấy nó rất dễ dàng!

Nếu bạn sử dụng nó, Trình duyệt đã có 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, vui lòng liên hệ với tôi!

+3

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

+0

Ok, bạn có thể thử Bull hoặc Webworker-Threads ... chúc may mắn whit Node.js :) –

+0

Dường như sails.js là khá lớn và không nhiều hơn cronJobs. Tôi tìm thấy node-cron (https://github.com/kelektiv/node-cron) mà tôi đặt cược là những gì sails.js sử dụng. – pbatey

7

Nếu bạn đang sử dụng MongoDB, tôi khuyên bạn nên Agenda. Bằng cách đó, các cá thể 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. Agenda UI là tùy chọn và có thể chạy riêng rẽ tất nhiên.

Cũng khuyên bạn nên thiết lập trừu tượng 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, giữ càng nhiều logic ứng dụng/xử lý cách xa các định nghĩa công việc chương trình làm việc của bạn để giữ chúng gọn nhẹ.

1

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 bạn.

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

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

Các vấn đề liên quan