Плохая производительность на комбинации потоков
Я хочу передать результаты запроса PostgreSQL клиенту через веб-сокет.
Данные извлекаются из базы данных с использованием pg-обещания и pg-query-stream. Для потоковой передачи данных через веб-сокет я использую socket.io-stream.
По отдельности все компоненты работают достаточно хорошо. Хотя, когда я направляю поток pg-query в socket.io-stream, производительность резко падает.
Я начал с:
var QueryStream = require('pg-query-stream');
var ss = require('socket.io-stream');
// Query with a lot of results
var qs = new QueryStream('SELECT...');
db.stream(qs, s => {
var socketStream = ss.createStream({objectMode: true});
ss(socket).emit('data', socketStream);
s.pipe(socketStream);
})
.then(data => {
console.log('Total rows processed:', data.processed,
'Duration in milliseconds:', data.duration);
});
Я пытался использовать необъектные потоки:
var socketStream = ss.createStream();
ss(socket).emit('data', socketStream);
s.pipe(JSONStream.stringify()).pipe(socketStream);
Или же:
var socketStream = ss.createStream();
ss(socket).emit('data', socketStream);
s.pipe(JSONStream.stringify(false)).pipe(socketStream);
Запрос и передача данных для всех решений занимает примерно одну минуту.
Результаты запроса могут быть записаны в файл в течение одной секунды:
s.pipe(fs.createWriteStream('temp.txt'));
И этот файл может быть передан в течение одной секунды:
var socketStream = ss.createStream();
fs.createReadStream('temp.txt').pipe(socketStream);
Так или иначе, эти потоки, кажется, не объединяются хорошо.
В качестве глупого эксперимента я попытался поместить что-то среднее:
var socketStream = ss.createStream();
ss(socket).emit('data', socketStream);
var zip = zlib.createGzip();
var unzip = zlib.createGunzip();
s.pipe(JSONStream.stringify(false)).pipe(zip).pipe(unzip).pipe(socketStream);
И вдруг данные могут быть запрошены и переданы в течение одной секунды...
К сожалению, это не сработает как мое окончательное решение. Это будет тратить слишком много ресурсов процессора. Что вызывает снижение производительности в этой комбинации потоков? Как это можно исправить?