2012-04-06 25 views
5

Tôi muốn thêm một số tiện ích quản trị vào một ứng dụng web nhỏ, chẳng hạn như "Cơ sở dữ liệu sao lưu". Người dùng sẽ nhấp vào một nút và phản hồi HTTP sẽ trở lại ngay lập tức, mặc dù quá trình chạy dài có khả năng đã được bắt đầu ở chế độ nền.Hành vi giống như "đẻ trứng" trong node.js

Trong Java, điều này có thể được thực hiện bằng cách sinh ra một chuỗi độc lập, trong Scala bằng cách sử dụng một diễn viên. Nhưng thành ngữ thích hợp trong node.js là gì? (đoạn mã được đánh giá cao)

Tôi đang đọc lại tài liệu, điều này thực sự có vẻ là câu hỏi 101 nút nhưng đó là khá nhiều nơi tôi đang ở trên ... dù sao, để làm rõ đây là kịch bản cơ bản:

function onRequest(request, response) { 
    doSomething(); 
    response.writeHead(202, headers); 
    response.end("doing something"); 
} 

function doSomething(){ 
    // long-running operation 
} 

Tôi muốn phản hồi quay lại ngay lập tức, để lại doSomething() chạy ẩn.

Ok, được cung cấp mô hình một luồng của nút có vẻ không khả thi mà không sinh ra một ChildProcess cấp hệ điều hành khác. Sự hiểu lầm của tôi.

Trong mã của tôi, những gì tôi cần để sao lưu phần lớn là dựa trên I/O, do đó, nút nên xử lý điều đó theo kiểu không đồng bộ tốt đẹp. Những gì tôi nghĩ rằng tôi sẽ làm là thay đổi doSomething để sau response.end, xem cách ứng xử đó.

+0

Tôi tin rằng bạn đã duyệt qua tài liệu. http://nodejs.org/docs/v0.4.7/api/index.html Tôi nghĩ rằng nó phụ thuộc vào bản chất của quá trình của bạn, nhưng hãy xem Quy trình Con. – supertopi

+0

Cảm ơn. Có vẻ như vấn đề của tôi đã bắt nguồn từ một sự hiểu lầm sâu sắc về cách thức hoạt động của nút :) Quá trình con là những gì tôi nghĩ, mặc dù không phải là giải pháp dễ nhất, xem phản hồi của Joe bên dưới. – danja

Trả lời

3

Tôi không thấy sự cố. Tất cả những gì bạn cần làm là có doSomething() bắt đầu một hoạt động không đồng bộ. Nó sẽ trở lại ngay lập tức, onRequest của bạn sẽ ghi lại phản hồi và khách hàng sẽ nhận được thông báo "OK, tôi bắt đầu".

function doSomething() { 
    openDatabaseConnection(connectionString, function(conn) { 
     // This is called some time later, once the connection is established. 
     // Now you can tell the database to back itself up. 
    }); 
} 

doSomething sẽ không chỉ ngồi ở đó cho đến khi kết nối cơ sở dữ liệu được thiết lập hoặc đợi trong khi bạn yêu cầu sao lưu. Nó sẽ trở lại ngay lập tức, đã đăng ký một cuộc gọi lại sẽ chạy sau. Đằng sau hậu trường, thư viện cơ sở dữ liệu của bạn có thể đang tạo một số chủ đề cho bạn, để làm cho công việc không đồng bộ theo cách của nó, nhưng mã của bạn không cần phải lo lắng về nó; bạn chỉ cần quay lại ngay lập tức, gửi phản hồi cho máy khách ngay lập tức và mã không đồng bộ tiếp tục chạy không đồng bộ.

(Đó là công việc thực sự hơn để làm cho hoạt động này đồng bộ -. Bạn sẽ phải vượt qua đối tượng response của bạn vào doSomething, và có doSomething làm response.end gọi bên trong gọi lại trong cùng, sau khi sao lưu được thực hiện Tất nhiên, đó không phải là những gì bạn muốn làm ở đây, bạn muốn quay trở lại ngay lập tức, đó là chính xác những gì mã của bạn sẽ làm.)

+0

Cảm ơn. Có vẻ như vấn đề của tôi đã bắt nguồn từ một sự hiểu lầm sâu sắc về cách thức hoạt động của nút :) – danja

5

Khi supertopi cho biết bạn có thể xem Child process. Nhưng tôi nghĩ rằng nó sẽ làm tổn thương hiệu suất của máy chủ của bạn, nếu điều này xảy ra rất nhiều tuần tự. Sau đó, tôi nghĩ bạn nên xếp hàng chúng thay thế. Tôi nghĩ bạn nên xem asynchronous message queues để xử lý công việc của bạn ngoại tuyến (được phân phối). Một số (chỉ với tên hai) ví dụ về hàng đợi tin nhắn là beanstalkd, gearman.

+0

Cảm ơn. Có vẻ như vấn đề của tôi đã được bắt nguồn từ một sự hiểu lầm sâu sắc về cách hoạt động của nút :) Sử dụng một hàng đợi mặc dù có vẻ là một ý tưởng rất hay. – danja

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