104

我需要在 node.js 中构建一个 REST API,并且正在寻找一个比 express.js 更轻量级的框架,它可能会避免不需要的功能,并且就像一个用于构建 REST API 的定制框架。Restify from its intro 推荐用于相同的情况。

阅读为什么使用restify而不是express?似乎restify是一个不错的选择。

但是当我用负载尝试两者时,惊喜来了。

我在 Restify 上制作了一个示例 REST API,每秒发送 1000 个请求。令我惊讶的是,这条路线在一段时间后开始没有响应。基于 express.js 构建的同一个应用程序处理了所有问题。

我目前正在通过

var FnPush = setInterval(function() {           
    for(i=0;i<1000;i++) 
        SendMsg(makeMsg(i));                
}, 1000);

function SendMsg(msg) {
    var post_data = querystring.stringify(msg);
    var post_options = {
        host: target.host,
        port: target.port,
        path: target.path,
        agent: false,
        method: 'POST',
        headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': post_data.length,
                "connection": "close"
            }
    };

    var post_req = http.request(post_options, function(res) {});
    post_req.write(post_data);  
    post_req.on('error', function(e) {          
    }); 
    post_req.end();
}

我得到的结果是否合理?如果是这样,在这种情况下 express 比 restify 更有效吗?或者我测试它们的方式有什么错误吗?

根据评论更新

重新调整的行为

  1. 当负载超过 1000 个 req.s 时,它在 1 秒内停止处理,直到 1015 个 req.s 接收,然后什么也不做。IE。我实现的用于计算传入请求的计数器在 1015 之后停止递增。

  2. 当以 100 个需求的负载喂食时。每秒它接收到 1015 并且在那之后没有响应。

4

6 回答 6

51

更正:此信息现在有误,请继续滚动!

脚本存在问题,导致 Restify 测试在意外路线上进行。这导致连接保持活动状态,从而由于开销减少而提高了性能。


这是 2015 年,我认为自那以后情况发生了很大变化。Raygun.io 最近发布了一个比较 hapi、express 和 restify 的基准

它说:

我们还发现 Restify 保持连接处于活动状态,这消除了每次从同一客户端调用时创建连接的开销。公平地说,我们还用关闭连接的配置标志测试了 Restify。由于显而易见的原因,您会看到在这种情况下吞吐量大幅下降。

来自 Raygun.io 的基准图像

看起来 Restify 是更容易服务部署的赢家。特别是如果您正在构建一个服务,该服务接收来自相同客户端的大量请求并希望快速移动。你当然比裸节点更划算,因为你有像 DTrace 支持这样的特性。

于 2015-03-17T13:38:52.407 回答
27

这是2017 年, Raygun.io对 hapi、express、restify 和 Koa 进行的最新性能测试。

它表明 Koa 比其他框架更快,但是由于这个问题是关于 express 和 restify,所以Express 比 restify 更快。

并且写在帖子里

这表明 Restify 确实比我最初测试中报告的要慢。

在此处输入图像描述

于 2017-02-16T10:13:53.203 回答
11

根据Node Knockout 描述

restify 是一个 node.js 模块,用于在 Node 中创建 REST Web 服务。restify 使构建此类服务的许多难题变得更加容易,例如版本控制、错误处理和内容协商。它还提供了内置的 DTrace 探针,您可以免费获得这些探针,以快速找出应用程序的性能问题所在。最后,它提供了一个强大的客户端 API,可以在连接失败时为您处理重试/回退,以及其他一些细节。

性能问题和错误可能可以修复。也许这种描述将是足够的动力。

于 2013-10-21T20:45:42.083 回答
5

我通过 ab 在 OS X 上对多个框架进行基准测试时遇到了类似的问题。在大约第 1000 个请求之后,一些堆栈始终死亡。

我大大提高了限制,问题就消失了。

您可以使用ulimit(或launchctl limit < OS X)检查您的 maxfiles 并查看最大值是多少。

希望有帮助。

于 2013-08-14T17:30:49.147 回答
4

2021 年,Fastify ( https://www.fastify.io/benchmarks/ ) 进行的基准测试表明 Restify 现在比 Express 稍快。

用于运行基准测试的代码可以在这里找到https://github.com/fastify/benchmarks/

关于 fastify 开销如何针对其他一些知名的 Node.js Web 框架执行的简要总结

于 2021-01-24T02:30:30.720 回答
3

我对 express 或 restify 或 perfectAPI 感到困惑。甚至尝试在所有这些中开发一个模块。主要要求是制作一个 RESTapi。但最后以 express 结束,用所有框架上每秒发出的请求测试了我自己,express 给出了比其他人更好的结果。尽管在某些情况下,restify 胜过 express,但 express 接缝赢得了比赛。我为快递点赞。是的,我还遇到了机车 js,一些 MVC 框架建立在 express 之上。如果有人正在寻找使用 express 和 jam 的完整 MVC 应用程序,请选择机车。

于 2013-11-04T05:05:11.693 回答