JSONstring直接从节点mongodb
我已经在一个简单的服务器上进行了一系列的负载testing,试图确定哪些负面影响了我的复杂的node / express / mongodb应用程序的负载。 其中一个常常出现的问题是string操作需要在快速响应中将内存中的对象转换为JSON。
我通过节点从mongodb获取的数据量和通过networking发送的数据量是〜200/300 KB(未压缩的)。 (Gzip会把这个变成28k,好多了。)
有没有办法让本地nodejs的mongodb驱动程序为我的结果stringify结果? 现在,对于标准.toArray()的每个请求,我们正在执行以下操作:
- 查询数据库,查找结果并将其传送到节点本地驱动程序
- 本地驱动程序然后把它们变成一个内存中的JavaScript对象
- 我的代码然后传递这个内存中的对象来表示
- Express然后将其转换为string节点的http response.send使用JSON.stringify()(我读的源卢克。)
我正在寻找在c ++ /本地层完成string化工作,以便它不会将处理时间添加到我的事件循环。 有什么build议么?
编辑1:
这是一个被certificate的瓶颈。
可能很容易有其他的事情可以优化,但这里是负载testing显示。
我们在几秒钟内发出了500次请求。 有了这个代码:
app.get("/api/blocks", function(req, res, next){ db.collection('items').find().limit(20).toArray(function(err, items){ if(err){ return next(err); } return res.send(200, items); }); });
总体平均值:323ms,95%
如果我换出json数据:
var cached = "[{... "; //giant json blob that is a copy+paste of the response in above code. app.get("/api/blocks", function(req, res, next){ db.collection('items').find().limit(20).toArray(function(err, items){ if(err){ return next(err); } return res.send(200, cached); }); });
平均为164毫秒,第95位为580%
现在你可能会说:“天哪,323毫秒的意思是好的,你的问题是什么?” 我的问题是这是一个例子,其中stringify导致响应时间加倍。
从我的testing中,我也可以告诉你这些有用的东西:
- Gzip在响应时间上是2倍或更好的收益。 以上是用gzip
- 与通用nodejs相比,Express在开销上增加了几乎难以察觉的数量
- 通过执行cursor.each来对数据进行批处理,然后将每个单独的项目发送给响应就更糟了
更新2:
使用概要分析工具: https : //github.com/baryshev/look这是一遍又一遍地在同一个数据库密集型过程中打印我的生产代码。 该请求包含一个mongodb聚合,并发回〜380KB数据(未压缩)。
该函数非常小,包括var body = JSON.stringify(obj, replacer, spaces);
线。
听起来你应该直接从Mongostream到Express。
根据这个问题,正是这个问题 :
cursor.stream().pipe(JSONStream.stringify()).pipe(res);
- Express.JS:我怎样才能通过名字而不是数字设置回复状态?
- 如何构build基于Express的Azure移动服务/ Moible应用程序
- Node.js如何将geojson从mongodb传递给我可以在前端使用的对象
- 使用passport.js在node.js中进行身份validation后,redirect到上一页
- 我怎样才能用json发送响应而不是玉?
- Heroku(Cedar)+ Node + Express + Jade子目录中的客户端JavaScript文件在工作时使用foreman + curl,但是当推送到Heroku时
- 无法使用Angular在NodeJS服务器中获取/ html
- 使用pg-promise查询多对多关系的最佳方法
- 一旦我开始添加文件到我的控制器文件夹代码中断 – 为什么?