Nodejs Transform - можно ли считать обратный вызов перед отправкой хорошей практикой?

Что касается функции преобразования stream.Transform:
Это нормально, поскольку она не сломает что-то вроде механизма обратного давления,
и, предполагая, что меня не волнует порядок, чтобы вызвать callback() перед вызов push(), чтобы я мог асинхронно обрабатывать более 1 фрагмента одновременно?

В частности, я хотел бы делать асинхронные HTTP-запросы. У меня есть «поток URL-адресов», и я хочу push() обработанных результатов для дальнейшей обработки/хранения.

Если я буду ждать завершения запроса перед вызовом callback(), каждый раз у меня будет выполняться только 1 запрос. Если, однако, я вызываю обратный вызов, пока запрос находится в эфире:

request.get(url, (err, res) => push(process(res)));
return callback();

Я могу обрабатывать много запросов одновременно.

Код похоже работает, но мне интересно, не злоупотребляю ли я stream.Transform и должен ли я использовать что-то совершенно другое для конвейера такого типа.


person Harel Rozental    schedule 28.08.2018    source источник


Ответы (1)


Это нарушает дизайн потоков.

Если вас не волнует противодавление или порядок потока, не используйте поток. Предполагая, что ваш «поток URL-адресов» - это просто читаемый поток, напрямую используйте его и прекратите использовать поток в этот момент. Вы также можете подумать, почему вы используете поток URL-адресов, но я не хочу судить слишком много.

В качестве примера:

urlStream.on('data', (url) => {
  request.get(url, (err, res) => {
    // do whatever you want to do next.
  });
});
person snek    schedule 28.08.2018
comment
Это поток URL-адресов, потому что это 2-гигабайтный файл URL-адресов. На самом деле меня волнует обратное давление, так как мне нужно записать их на диск после этого. Я попробовал решение, в котором я пытаюсь использовать комбинацию флага записи / слива, но, похоже, это не сработало. Именно тогда я наткнулся на использование потоков для этого - person Harel Rozental; 28.08.2018
comment
Я не рекомендую использовать поток преобразования здесь. Вы можете использовать поток чтения для получения URL-адресов и поток записи для записи ответов на диск, но поскольку вы хотите выполнять параллельную работу и не заботитесь о порядке, средняя часть не должна быть потоком преобразования. - person snek; 28.08.2018
comment
Итак, я должен сделать всю комбинацию флага записи / паузы чтения / onDrain? Это было то, что я изначально пытался, но по какой-то причине пауза просто не работала, и поэтому она просто продолжала работать и, вероятно, замедлялась при потере данных. - person Harel Rozental; 28.08.2018
comment
Я не знаю, следует ли вам выполнять всю комбинацию флага записи/паузы чтения/onDrain. Теоретически это просто мой пример + outputStream.write(stuff), где у меня есть комментарий do whatever you want to do next. - person snek; 28.08.2018