Sự khác biệt giữa chế độ Cluster và Fork trong PM2


89

Tôi đã tìm kiếm rất nhiều để tìm ra câu hỏi này, nhưng tôi không nhận được lời giải thích rõ ràng. Có một điều khác biệt duy nhất là ứng dụng được phân nhóm có thể được thu nhỏ và ứng dụng được phân nhánh không thể có?

Trang web công khai của PM2 giải thích chế độ Cụm có thể thực hiện các tính năng này nhưng không ai nói về ưu điểm của chế độ Fork (có thể, nó có thể NODE_APP_INSTANCEthay đổi).

Tôi cảm thấy như Cluster có thể là một phần của Fork vì Fork dường như được sử dụng nói chung. Vì vậy, tôi đoán Fork chỉ có nghĩa là 'quá trình được chia nhỏ' từ điểm của PM2 và Cụm có nghĩa là 'quá trình được chia nhỏ có thể được thu nhỏ'. Sau đó, tại sao tôi nên sử dụng chế độ Fork?

Câu trả lời:


121

Sự khác biệt chính giữa fork_modecluster_modelà nó ra lệnh cho pm2 sử dụng api child_process.fork hoặc api cụm .

Điều này có nghĩa là gì trong nội bộ?

Chế độ ngã ba

Lấy forkchế độ này làm quá trình sinh sản cơ bản. Điều này cho phép thay đổi exec_interpreter, để bạn có thể chạy một phphoặc một pythonmáy chủ với pm2. Có, exec_interpreterlà "lệnh" được sử dụng để bắt đầu quy trình con. Theo mặc định, pm2 sẽ sử dụng nodeđể pm2 start server.jslàm một cái gì đó như:

require('child_process').spawn('node', ['server.js'])

Chế độ này rất hữu ích vì nó cho phép rất nhiều khả năng. Ví dụ: bạn có thể khởi chạy nhiều máy chủ trên các cổng được thiết lập trước, sau đó sẽ được cân bằng tải bởi HAProxy hoặc Nginx.

Chế độ cụm

Các clustersẽ chỉ làm việc với nodevì nó là exec_interpreterbởi vì nó sẽ truy cập vào các nodejs cụm mô-đun (ví dụ: isMaster, forkphương pháp vv). Điều này rất tốt cho việc quản lý quy trình không cấu hình vì quy trình sẽ tự động được chia nhỏ trong nhiều trường hợp. Ví dụ: pm2 start -i 4 server.jssẽ khởi chạy 4 phiên bản server.jsvà để mô-đun cụm xử lý cân bằng tải.


3
câu hỏi dựa trên câu trả lời của bạn ở đây: Tôi có một trường hợp sử dụng mà tôi cần phải có, chẳng hạn như 30 trường hợp ứng dụng node.js của tôi được tạo ra với số cổng duy nhất, được xác định trước, (: 3000 đến: 3030) và mỗi trường hợp xử lý một nhóm người dùng cụ thể sẽ chỉ truy cập trên cổng được chỉ định của họ. Vì vậy, tôi không muốn quy trình Master thực hiện cân bằng tải, mà thay vào đó, chỉ bắt đầu (và tiếp tục chạy) các quy trình con. Điều này có khả thi không? Hay nó sẽ cố gắng phân tán tải trọng ra chỉ trên tất cả các quy trình con được tạo ra?
tamak

3
Tôi sẽ sử dụng API lập trình pm2 để khởi chạy 30 quy trình trong fork_mode và sử dụng thứ gì đó khác làm bộ cân bằng tải giữa 30 cổng. Bạn cũng có thể sử dụng pm2 start -i 30 app.jsvà để cụm nodejs thực hiện công việc.
đậu nànhuka,

11
lưu ý: trong cluster modequy trình tổng thể là một điểm thất bại.
Karl Pokus

40

Node.js là một luồng.

Điều đó có nghĩa là chỉ 1 lõi của CPU lõi tứ Intel của bạn có thể thực thi ứng dụng nút.

Nó được gọi là: fork_mode.

Chúng tôi sử dụng nó cho nhà phát triển địa phương .

pm2 start server.js -i 0 giúp bạn chạy 1 luồng nút trên mỗi lõi của CPU.

tự động cân bằng tải các yêu cầu đến không trạng thái.

Trên cùng một cổng .

Chúng tôi gọi nó là: cluster_mode.

Được sử dụng vì lợi ích của hoạt động sản xuất .

Bạn cũng có thể chọn làm điều này trên nhà phát triển cục bộ nếu bạn muốn kiểm tra căng thẳng PC của mình :)


2
thaks, trời quang đãng rất nhiều điều trong tâm trí của tôi về nodejs
Rishabh Agrawal

1
lời giải thích tuyệt vời !!
Piqué

1
Node.js không phải là một luồng, (hiện tại) có một luồng người dùng nhưng chắc chắn nó được hỗ trợ bởi một luồng luồng libuv.
Benjamin Gruenbaum

1
@BenjaminGruenbaum Đồng ý với bạn. Tuyên bố của tôi nên được hiểu theo giả định rằng tôi sẽ không đề cập quá sâu xuống mức libuv
haotang

16

Tài liệu và nguồn thực sự sai lệch ở đây.

Đọc về điều này trong các nguồn, có vẻ như sự khác biệt duy nhất là chúng sử dụng nút clusterhoặc child_processAPI. Vì clustersử dụng cái sau, bạn thực sự đang làm như vậy. Chỉ có rất nhiều phong tục khác stdiođi qua nhà trọ đang diễn ra fork_mode. Ngoài ra, clusterchỉ có thể được giao tiếp với thông qua chuỗi, không phải đối tượng.

Theo mặc định bạn đang sử dụng fork_mode. Nếu bạn vượt qua -i [number]-option, bạn đang đi vào cluster_mode, điều mà bạn thường nhắm tới là w / pm2.

Cũng fork_modecó thể ví dụ không thể nghe trên cùng một cổng do EADDRINUSE. cluster_modecó thể. Bằng cách này, bạn cũng có thể cấu trúc ứng dụng của mình để chạy trên cùng một cổng được cân bằng tải tự động. Bạn phải xây dựng ứng dụng mà không có trạng thái, ví dụ: phiên, dbs.


1
Tôi vẫn còn bối rối. clustermô-đun tích hợp sử dụng child_processtrong nội bộ? và đề xuất của bạn là nếu tôi cần linh hoạt stdio, tôi phải sử dụng chế độ Fork?
Jinyoung Kim

THe stdiođiều là cái gì đó của pm2's thực hiện. Đừng lo lắng về điều này. Bạn muốn sử dụng cluster_modetrong sản xuất vì nó đang làm cứng phiên bản của bạn vì nó đang chạy các -i [number]phiên bản trong nền. Sử dụng fork_modenếu không cần thiết làm cứng hoặc bạn muốn các bản ghi và nội dung tốt hơn.
eljefedelrodeodeljefe

1
Cũng rõ ràng là cluster_modesử dụng nhiều tài nguyên hơn của hệ thống của bạn vì bạn đang chạy -i [number]các quy trình.
eljefedelrodeodeljefe

Mặc dù tôi nhiệt liệt đánh giá cao câu trả lời của bạn, nhưng tôi vẫn chưa nắm bắt được vấn đề. Hầu hết lời giải thích của bạn là những điều tự nhiên (ví dụ: sử dụng CLI cluster_mode, cân bằng tải cluster_mode, cluster_modesử dụng nhiều tài nguyên hơn ..). Đó là lý do tại sao tôi không được bình chọn. Bạn có thể giải thích cả hai trường hợp sử dụng đơn giản? Mỗi trường hợp phải có lý do tại sao nó sử dụng chế độ của nó.
Jinyoung Kim

@eljefedelrodeodeljefe Bạn có thể giải thích thêm về "Bạn phải tạo ứng dụng mà không có trạng thái, ví dụ: phiên, dbs." Tại sao ứng dụng không có trạng thái?
STEN
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.