2016-03-01 19 views
6

Sử dụng máy chủ Node.js, tôi tự hỏi nếu có thể và được khuyến nghị gửi phản hồi HTTP từ quy trình công nhân được ủy nhiệm, thay vì quy trình chính. Các quy trình công nhân này có thể là các máy chủ Node.js, hoặc đơn giản là các tiến trình con Node.js giao tiếp thông qua IPC."Phản hồi trực tiếp với Node.js" - Gửi phản hồi HTTP với quy trình Node.js khác (khác với quy trình chính)

Tôi không nghĩ rằng mô-đun lõi cụm https://nodejs.org/api/cluster.html có thể làm những gì tôi muốn làm, bởi vì trong mô hình đó, tất cả công nhân đang lắng nghe trên cùng một cổng và xử lý tất cả yêu cầu thay mặt cho quy trình tổng thể. Những gì tôi đang tìm kiếm là một quá trình Node.js chính đáp ứng tất cả các yêu cầu HTTP, có thể thực hiện xác thực và xử lý một số yêu cầu, nhưng cũng có khả năng ủy nhiệm các yêu cầu chuyên sâu về dữ liệu hoặc CPU tới một nhóm công nhân.

Hãy tưởng tượng rằng chúng tôi có yêu cầu GET cho một lượng lớn dữ liệu, giả sử 2-3MB.

Chúng tôi có ít nhất 3 tình huống có thể:

  1. Quá trình chính nhận được yêu cầu, yêu cầu các cơ sở dữ liệu cho số lượng lớn các dữ liệu và sau đó gửi dữ liệu trở lại để người yêu cầu.
  2. Quá trình chính nhận yêu cầu, gửi một số dữ liệu đến quy trình công nhân sử dụng IPC, nhân viên lấy dữ liệu từ DB thực hiện một số thao tác nặng và sau đó nhân viên sử dụng IPC để gửi tất cả 3MB dữ liệu trở lại quy trình, sau đó gửi lại phản hồi.
  3. Quy trình chính nhận được yêu cầu, gửi lượng thông tin nhỏ nhất có thể về luồng yêu cầu tới công nhân, công nhân thực hiện tất cả công việc và nhân viên gửi trả lời HTTP.

Tôi đặc biệt tò mò về việc làm # 3 có thể.

Một mô tả đơn giản của kịch bản 3 là dưới đây:

enter image description here

(Chỉ cần được rõ ràng, tôi không muốn 3 câu trả lời cho một yêu cầu, tôi chỉ cố gắng để chứng minh rằng một nhân viên có thể có thể gửi phản hồi thay mặt cho quá trình chính).

Bất kỳ ai biết cách này có thể hoạt động với Node.js như thế nào? Làm thế nào nó có thể làm việc trong các ngôn ngữ khác? Thông thường tôi không có vấn đề với mô hình đồng thời Node.js, nhưng với một số loại dữ liệu, sử dụng mô-đun Cluster có lẽ không phải là cách tốt nhất để đạt được mức đồng thời cao nhất.

Tôi tin rằng một cụm từ cho mô hình này là "phản hồi trực tiếp", nghĩa là người lao động phản hồi trực tiếp yêu cầu. Và có lẽ nó có thể chỉ đơn giản là sử dụng mô-đun lõi cluster https://nodejs.org/api/cluster.html cho việc này.

+0

Tôi đã có một ý tưởng tương tự cách đây không lâu nhưng sau khi tìm kiếm rộng rãi, tôi đã sử dụng nginx như một bộ cân bằng tải giống như những gì bạn đang cố gắng đạt được với điều này nhưng không quay lên toàn bộ ứng dụng. Tôi cũng muốn biết về giải pháp này nếu có ai có. – shriek

+0

chắc chắn, cảm ơn, tôi nghĩ cluster.setupMaster có thể làm những gì tôi muốn, nhưng tôi không chắc chắn, xem: https://nodejs.org/api/cluster.html#cluster_cluster_setupmaster_settings –

+1

ví dụ, xem câu trả lời được chấp nhận tại đây: http://stackoverflow.com/questions/23771516/using-cluster-in-a-node-module/24463511#comment59142347_24463511 –

Trả lời

0

Tôi tự hỏi nếu nó là cả khả năng và khuyến khích để gửi một HTTP response từ một quá trình lao động được giao

Có, đây là có thể và có lẽ là cách phổ biến nhất dễ nhất để mở rộng quy mô ra các máy chủ ứng dụng của bạn . Không giống như IPC, nó có thể hoạt động trên các máy chủ qua mạng. (Nó cũng sẽ làm việc cục bộ nếu bạn muốn nó ... nhưng chắc chắn rằng bạn thực sự là CPU-ràng buộc trong ứng dụng của bạn. Mặc dù JavaScript chính nó là đơn luồng, hầu hết các thư viện cho IO và một số mô-đun NPM sử dụng hồ bơi thread.)

Không có lý do gì để sử dụng Nút.js là cân bằng tải máy chủ giữa các máy chủ phụ trợ. Node.js tốt hơn cho máy chủ ứng dụng của bạn. Đối với một cái gì đó chỉ cần proxy yêu cầu HTTP, tôi muốn sử dụng Nginx hoặc tương tự. Nginx có thể xử lý hiệu quả tất cả các giao dịch với khách hàng, và có thể dễ dàng cấu hình để tải số dư.

0

Nếu bạn đang cố gắng khai thác nhiều bộ xử lý trong máy tính của bạn (s) (thực hiện Node bởi chính nó chỉ sử dụng một quá trình duy nhất), chỉ cần sử dụng PM2:

https://www.npmjs.com/package/pm2

PM2 bắt đầu các trường hợp khác nhau của bạn ứng dụng trên bộ xử lý mà bạn quyết định cho PM2. Nếu ứng dụng của bạn là không trạng thái (vì lý tưởng là sử dụng Node), một phiên bản ứng dụng của bạn sẽ chạy trên mỗi bộ xử lý và PM2 sẽ thực hiện định tuyến.

Nếu tôi có thể vẽ lại biểu đồ bằng giọng nói mà bạn đã đăng cho trường hợp 3, PM2 sẽ thay thế "MAIN" và "W" sẽ được thay thế bằng ứng dụng của bạn và không cần phải lo lắng về nhân viên.

Chúng tôi sử dụng PM2 trong quá trình sản xuất và nó hoạt động tốt cho chúng tôi.

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