2011-09-05 22 views
5

Tôi đang cố gắng hiểu cách tốt nhất để xử lý tác vụ chạy dài trong Node.js. Rõ ràng làm một quá trình chạy dài trong Node.js không phải là một ý tưởng tốt bởi vì bản chất luồng đơn của nút.Bạn có bao giờ sử dụng RabbitMQ và Node.js cho quá trình chạy dài không?

Tôi là một fan hâm mộ lớn của RabbitMQ vì vậy tôi đã nghĩ đến việc có hai máy chủ nút với thỏ ở giữa:

Node.js Web Server <--> RabbitMQ <--> Node.js Backend Worker 

Ý tưởng tất nhiên là không làm chậm máy chủ web bao giờ hết. Tôi thường sẽ thay thế các máy chủ phụ trợ với Java nhưng tôi đang cố gắng để giữ cho nó tất cả JS.

Tôi không phải là lập trình viên Node vì vậy tôi không chắc liệu đây có phải là một ý tưởng hay hay không? Có ai đã thử một cái gì đó như thế này?

+0

Tôi đã kết thúc chỉ làm cho nhân viên phụ trợ Java nhưng vẫn có nút ở phía trước và thỏ ở giữa. –

Trả lời

0

Điều đó tùy thuộc vào ý nghĩa của "quá trình chạy dài" - để chặn Node.JS, bạn phải thực hiện rất nhiều tính toán cùng một lúc. Làm I/O (khoảng, gọi một cái gì đó mà có một đối số gọi lại) sẽ mang lại cho vòng lặp sự kiện.

Có thể cho rằng một vài điều bạn sẽ làm trong trang web không liên quan đến phần lớn I/O. Ví dụ, nói chuyện với một cơ sở dữ liệu - I/O. Đọc một mẫu từ hệ thống tập tin - I/O. (Chạy một mẫu có dữ liệu từ cơ sở dữ liệu - ok, không phải là I/O. Có thể không phải là quá đắt.)

Nếu bạn chỉ có hai quy trình Node.JS như trong biểu đồ của bạn, phản hồi cho từng khách hàng là vẫn sẽ mất miễn là nó sẽ anyway (I/O thời gian cộng với thời gian tính toán). Tuy nhiên, bạn có thể nhận được thông lượng tốt hơn, vì bạn sẽ không được serialising yêu cầu đến. Mặt khác, các yêu cầu có thể chỉ sao lưu trong RabbitMQ, chuyển thông lượng cao hơn của bạn thành độ trễ cao hơn.

Bạn cũng có cơ hội để chạy/nhiều hơn một nhân viên phụ trợ, để có được yêu cầu nhanh hơn. Làm công việc chỉ trong máy chủ web, nhưng chạy một loạt các quy trình máy chủ web và cân bằng tải trên những người có nói, nginx, sẽ có tác dụng tương tự.

+1

Khi tôi có nghĩa là chạy dài, tôi có nghĩa là nhập hoặc xử lý hàng loạt sẽ mất ít nhất một vài phút đến một vài giờ. Đây không phải là quá trình 'nhất thiết phải khởi động bởi một yêu cầu người dùng bình thường. Tôi nghĩ Java là một nguyên nhân tùy chọn tốt hơn: Tôi biết nó thực sự tốt :), Hadoop, và trong khi Java hút JVM thì tốt ở công cụ này. Tôi thích RabbitMQ tại chỗ vì tôi có thể chuyển nó trở lại NodeJS sau này khi tôi cảm thấy thoải mái hơn. –

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