2014-12-12 5 views
2

Я имею маршрутасинхронные операции в nodejs выразить

app.get('/posts', function (req, res) { 
    res.json([ 
    // data 
    ]); 

    // what would happen to the code below 
    // Suppose it is processing a million records 
    processMillionRecords(); 
}); 

function processMillionRecords() { 
    // process million records 
} 

После того, как ответ посылают, другая функция вызывается, которая является весьма дорогостоящей операцией. Что произойдет, если это будет продолжаться? Есть ли какие-либо последствия?

Я знаю, что идеальный способ сделать это - использовать фоновые процессы. Поэтому я заменил его ниже.

res.json([ 
    // data 
]); 

var child = require('child_process'); 
child.fork('worker.js'); 

// worker.js 
function processMillionRecords() { 
    // process million records 
} 

Какой из них более предпочтительный и в каких случаях?

+0

Как развернуть другой процесс * не * используя фоновые процессы? – Pointy

+0

Да, вы правы, может быть, я должен правильно перефразировать вопрос. – Madhusudhan

+1

ОК - хорошо, я не думаю, что с использованием фонового процесса есть что-то неправильное, если у вас все в порядке с накладными расходами (и в узле это не похоже на то, что у вас много вариантов). Накладные расходы не очень важны, если вы действительно занимаетесь большим объемом работы, так как вилка происходит только один раз (на каждую рабочую партию). – Pointy

ответ

2

Узел построен для обработки длинных асинхронных операций. Если это не очень тяжелый процессор, вам, вероятно, не нужно разветвлять новый рабочий процесс. Просто напишите свой процессMillionRecords, чтобы он был асинхронным и убедитесь, что он не блокирует цикл событий.

0

Что произойдет в ситуации, описанной выше (как упомянуто Тимоти), заключается в следующем:

  • Ваше приложение будет возвращать данные пользователю быстро.
  • Процесс вашего узла будет продолжать выполнять асинхронный код за кулисами до тех пор, пока процесс не завершится.

Если вы создаете приложение, ожидающее большого количества трафика или большую нагрузку на процессор, лучше всего переместить этот материал на отдельный сервер, специально предназначенный для обработки долговременных задач. Это уменьшает вероятность того, что:

  • Ваш веб-сервер перезагружается - уничтожает ваш материал для обработки фона.
  • Ваш веб-сервер обрабатывает слишком много фоновых задач, чтобы правильно обрабатывать входящие запросы пользователей.

Надеюсь, что это поможет.

Смежные вопросы