2013-02-20 21 views
19

Tha thứ sự thiếu hiểu biết của tôi, nhưng đến từ một nền Django/Python tôi có thể thấy lợi ích to lớn của việc có hàng đợi Celery làm việc thông qua các quy trình chậm hơn trong nền trong khi giao diện web được cập nhật nhanh nhất có thể.Nhân viên JS của nút - bất kỳ nhu cầu nào đối với họ?

Tuy nhiên, với Node hoạt động không đồng bộ, trường hợp sử dụng cho hệ thống xếp hàng có giảm đi rất nhiều không?

Ví dụ:

1 - một bài viết sử dụng một cái gì đó vào trang web, 2 - trang web đáp ứng, sau đó mail quản trị viên.

Trong Django, bạn sẽ gửi thư quản trị đến một công việc, để được thực hiện sau đó, và sau đó trả lời yêu cầu. Cần tây gửi thư trong nền.

Trong nút, bạn gọi cho người gửi thư của mình, sau đó trả lời yêu cầu. Người gửi thư gửi một cuộc gọi lại để nói DONE hoặc không, theo đó người dùng đã xem phản hồi.

Vậy tại sao tôi nên sử dụng hàng đợi có Nút? Tôi đoán khi mọi thứ phức tạp hơn thế này - có vẻ như đối với những thứ tầm thường như thư giao dịch, không cần thiết ..

Hoặc tôi hiểu nhầm nó hoạt động như thế nào !?

Trả lời

7

Bạn nói đúng, việc tiếp tục khá tốt trong nút và nếu bạn đang chạy mọi thứ trong một quá trình nút đơn lẻ, không cần phải có hàng đợi ngay lập tức. Tuy nhiên, khi nút là chuỗi đơn, nút sẽ không thể xử lý bất kỳ yêu cầu mới nào trong khi nó bận gửi email đó hoặc xử lý tác vụ đó (nếu đó là tác vụ chuyên sâu của CPU)

Vì vậy, nếu công việc của bạn mất một lúc để xử lý cpu khôn ngoan, nó vẫn có thể đáng giá bằng cách sử dụng một hàng đợi bên ngoài và một quá trình riêng biệt để xử lý các nhiệm vụ/thông điệp đó. Nếu các tác vụ của bạn rất chuyên sâu và mất một thời gian vì chúng đang chờ phản hồi từ các máy chủ khác chẳng hạn, thì sẽ ít cần đến một lần nữa khi nút giao dịch tốt với io.

Nếu bạn có một nhiệm vụ chuyên sâu, nhưng bạn không muốn triển khai hàng đợi, bạn chỉ có thể tạo thêm quy trình nút và trường hợp máy và cân bằng tải trên tất cả, cho phép chúng xử lý các tác vụ này. Những bất lợi của phương pháp này sẽ là bạn không thể mở rộng quy mô trang web và xử lý nền riêng biệt. (ví dụ: 5 trường hợp xử lý yêu cầu web và 2 trường hợp công nhân)

+1

Vì vậy, nếu tôi muốn làm một cái gì đó như gọi một API bên ngoài để xác thịt người dùng thông tin - ví dụ: thực hiện một số mã hóa địa lý ngược lại với yêu cầu gọi đến bộ mã hóa địa lý của Google. Yêu cầu này sẽ không ngăn cản quá trình Node của tôi cho yêu cầu gửi đến sau đây? Nhưng nếu có rất nhiều CPU sử dụng nó sẽ ..? –

+1

Bạn sẽ cần điểm chuẩn, nhưng có. Đó là khoảng ý tưởng. Có một cái nhìn ở đây để có được một số ý tưởng về bao nhiêu có thể được thực hiện trong khi chờ đợi cho một hoạt động io: http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html. Nút chỉ thực hiện 1 điều tại một thời điểm, vì vậy nếu nó là số crunching, nó không thể phục vụ yêu cầu.Ngay khi bạn thực hiện bất kỳ io nào, bạn sẽ tự do thoát khỏi nút và thực hiện các công việc khác. – AndyD

+3

Cải tiến độ rõ ràng: nếu việc thực hiện song song của bạn liên quan đến việc đợi HTTP hoặc các yêu cầu hệ thống tập tin trở lại, thì I/O không đồng bộ của nút sẽ đủ rộng cho bạn. Nếu việc thực thi song song của bạn liên quan đến việc chạy các phép tính lớn cục bộ (chuyển mã video; chạy mô phỏng) thì bản chất luồng đơn của nút sẽ ngăn bạn ra ngoài và bạn sẽ cần phải quay công việc cho một nhân viên nếu có thể. – Dave

4

Không, luôn có trường hợp sử dụng cho hàng đợi, ngay cả trong thế giới nút. Một cách tiếp cận cơ bản mà tôi đã thấy nhiều người sử dụng với các mức độ thành công khác nhau là sử dụng hàng đợi được hỗ trợ Redis để lưu trữ thư hoặc tác vụ. Bạn có thể có một quá trình Node thêm các mục vào hàng đợi, với một đối tượng xử lý Node khác từ hàng đợi. Ngoài ra, hãy xem danh sách mô-đun nút cho queue modules và bạn sẽ thấy một số lượng thực thi phong phú.

+0

Tôi hiểu. Tôi nghĩ rằng phải có một lý do có rất nhiều triển khai hàng đợi, tôi đã nói rằng tôi nghĩ rằng trường hợp sử dụng đã được giảm hơn là đi ... –

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