Плохая производительность на комбинации потоков

Я хочу передать результаты запроса 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);

И вдруг данные могут быть запрошены и переданы в течение одной секунды...

К сожалению, это не сработает как мое окончательное решение. Это будет тратить слишком много ресурсов процессора. Что вызывает снижение производительности в этой комбинации потоков? Как это можно исправить?

0 ответов

Другие вопросы по тегам