如何从一个服务向Nodejs(微服务)中的另一服务发送海量数据(一百万个对象的数组)?

时间:2019-06-06 12:35:04

标签: node.js microservices

我正在使用微服务架构。假设有两种服务,即 A B 。我正在尝试从服务 A 请求到服务 B ,该服务从数据库中获取一些数据并将其作为对服务 A 的响应。但是,当有大量数据时,服务 B 无法发送响应,但会在控制台上打印。我尝试了很多事情,但没有任何效果。请帮助我。

服务A

function makePostRequest(url, data, cb) {
    let postContents = {
        headers: {
            'content-type': 'application/json'
        },
        url: url,
        form: data,
        timeout: 1200000
    }
    console.log('POST ==> ', postContents)
    request.post(postContents, function(err, response, body) {
        console.log(err)
        if (err) {
            return cb({
                code: httpStatus.serverError,
                message: err
            })
        } 
        else if (response.statusCode != 200) {
            return cb({
                code: response.statusCode,
                message: body
            })
        }
        else {
            console.log(body, 'bodybodybodyPOST')
            try {
                var data = JSON.parse(body);
                if (data && typeof data == 'object')
                    return cb(null, data)
                else
                    return cb({
                        code: httpStatus.serverError,
                        message: 'invalid response'
                    })
            }
            catch(Ex) {
                console.log(Ex)
                return cb({
                    code: httpStatus.serverError,
                    message: Ex
                })
            }
        }
    })
}
exports.myapi = (req, res) => {
    makePostRequest(SERVICE-B-URL, POST-DATA, (e, d) => {
        if (e) res.status(500).json({msg: 'please try later'})
        else res.status(200).json({msg: 'data fetched', result: d})
    })
}

服务B

console.log(result)
console.log('sending response ...', resTotal)
res.status(200).json({
                    total: resTotal,
                    result: result,
                    condition: req.query
                  });

[RowDataPacket {     f_stamp:2019-05-25T05:17:48.000Z,     f_player_id:33370333,     金额:-0.5,     f_param_notes:空,     f_money_type:“ R”,     f_type:84},   RowDataPacket {     f_stamp:2019-05-25T05:14:44.000Z,     f_player_id:31946955,     数量:30.9,     f_param_notes:空,     f_money_type:“ R”,     f_type:70},   RowDataPacket {     f_stamp:2019-05-25T05:14:41.000Z,     f_player_id:31035703,     数量:258     f_param_notes:空,     f_money_type:“ R”,     f_type:70},   ... 163783更多项目] 正在发送响应...。163883

1 个答案:

答案 0 :(得分:0)

一种解决方案是将nodejs流和websocket组合在一起,这里是一个示例:

Streaming data in node.js with ws and websocket-stream

通常,当您有大量数据时,您希望一次获取一小部分并发送。另一方面,您可以收集这些小片段并重建更大的数据。

使用单个HTTP请求,通常会出现413错误(有效负载过大)。 为了避免此错误,您应该将服务器设置为接受更大的有效负载。

ExpressJS示例(更多信息在这里:Error: request entity too large

app.use(express.json({limit: '50mb'}));

Nginx示例

server {
    client_max_body_size 100M;
    ...
}