流组合的性能不佳

时间:2017-04-10 17:43:45

标签: node.js node-streams

我想通过websocket将PostgreSQL查询的结果流式传输到客户端。

使用pg-promise和pg-query-stream从数据库中获取数据。要通过websocket流式传输数据,我使用socket.io-stream

单独地,所有组件都表现得非常好。虽然当我将pg-query-stream传输到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);

突然间数据可以在一秒钟内被查询和转移......

不幸的是,这不能作为我的最终解决方案。这会浪费太多的CPU。导致这种流组合性能下降的原因是什么?如何解决这个问题?

0 个答案:

没有答案