在构建一个关联数据库的供应商时,意识到拥有一个可以运行查询的REST服务会非常方便。为了获得最高效的服务器,决定测试一些已经构建好的REST服务器,以评估它们的语法和性能影响。
由于这只是一个概念验证(POC),还没有准备好进行打包,因此请下载这个项目,然后使用npm安装journey和restify。如果是NodeJS世界的新手,强烈推荐使用Webstorm作为IDE。如果想要最新版本或者想要帮助,请访问GitHub上的rapid-rest项目,那里的工作仍在继续,将找到一个更新的版本,它支持可执行的查询字符串参数。
选择一个REST实现,第一反应是选择GitHub上关注数最高的项目,即restify。以为会对选择感到满意,然后迅速完成这个小项目。但令惊讶的是,吞吐量非常糟糕。观察到的请求每秒只有250个。根据之前的研究,应该接近10倍,最多20倍,最多40倍这个数字。
在浏览了太多内容之后,可能是因为在StackOverflow问题上读到的内容,决定将journey添加到试验中。如果自己进行试验,需要一个基线来衡量,然后,当然,应该受到启发去编写自己的库,它的运行速度应该在基线和最快的竞争者之间。
这里有一些库的简短描述,不分先后顺序:
最初的意图是衡量时间和消耗。在测试了一些基准测试库之后,很明显测试套件消耗了大部分资源。得到了一些漂亮的图表,但代价是什么?
要求是衡量数据库可以以多快的速度填充JSON字符串,这些字符串代表用户对问卷调查的回答。为了隔离数据库对性能的影响,另一组测试将在没有任何数据访问的情况下运行。
许多测试被运行,但只有一次测试运行用于图表。有一些运行有巨大的差异,只能将其归因于环境,也许是IDE,也许是机器。本文档中的结果来自在笔记本上尽可能清洁的环境中进行的最后一次运行。
生成简洁的函数提前,没有剖析restify或journey背后的任何代码,但知道性能差异与请求时运行的代码行数有关(毕竟JavaScript是解析的)。在REST服务器架构中,有一个很大的优势,即服务器是预先配置的。在这里,应该生成请求解析函数,以做最少的工作。
这个基准测试的一个附带结果是弄清楚如何通过发送对象数组来提高MongoDB的吞吐量。如果运行基准测试并做计算,会发现rapid-rest有300%的提高,journey和restify比基线结果有200%的提高。最优批量大小似乎超过4但少于15,这在开发时使用缓存是很好的。
尽管非安全模式的upserts速度和插入一样快,MongoDB在收到响应后仍然在旋转。这种额外的消耗似乎是非线性的,小测试没有产生,而30,000次迭代的测试增加了大量。由于每次测试前都会丢弃数据库,只能将这种慢速归因于搜索现有项目。没有向集合添加索引,这可能会解决这个问题。
// 示例代码:使用NodeJS创建一个简单的REST服务器
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(8000);