为啥要使用 Restify?

Posted

技术标签:

【中文标题】为啥要使用 Restify?【英文标题】:Why should I use Restify?为什么要使用 Restify? 【发布时间】:2013-07-09 11:26:56 【问题描述】:

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

阅读Why use restify and not express? 似乎restify 是一个不错的选择。

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

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

我目前正在通过

将负载应用到 API
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 更有效吗?还是我测试它们的方式有什么错误?

根据 cmets 更新

restify 的行为

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

    当负载甚至 100 个请求时。每秒它接收到 1015 并且在那之后没有响应。

【问题讨论】:

在解析路由或请求数据时,可能会在某处阻塞,并且不能有效地执行此操作,从而导致高负载的响应时间峰值。 Express.js 是轻量级的,但功能丰富。它的制作方式仍然很轻,因为未使用的功能对整体性能没有太大影响。大公司也很好地维护和使用它,其中一个例子是:MySpace。我看不出将 Express.js 用于 REST API 的任何缺点(我实际上就是这样做的),它实际上允许您在未来改进您的 API,因为功能已经存在。 @Munim:感谢图表。但页面显示“请注意,此图表已过时,因为 Restify 性能问题已解决”..但似乎没有任何问题得到解决。!! @mithunsatheesh 我也注意到了这些。但是由于作者没有进行新的研究,所以我对它持保留态度。 github上的issue还是有人吐槽性能。 你能提供更多(restify)示例代码吗? @AdrianLang 你的意思是restify rest 应用程序代码?它只有一个 post 路由,它使用新的 req.s 来增加一个全局计数器。在 express 中制作的相同副本。 【参考方案1】:

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

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


这是 2015 年,我认为自那以后情况发生了很大变化。 Raygun.io 发布了recent benchmark comparing hapi, express and restify。

上面写着:

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

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

【讨论】:

您提到的博客文章很有用,如果作者披露了他所遵循的测试过程的更多细节。查看帖子下方的 cmets! 是的,确实如此,因为基准测试很难正确进行,如果作者发布过程和代码会很棒。所以我把它当作一粒盐,想与社区分享。 根据 Restify 文档,它还支持 DTrace。 mcavage.me/node-restify/#dtrace 另见2016 Raygun.io performance test 请注意在得出结论之前提到的同一篇文章中的附录。【参考方案2】:

这是 2017Raygun.io 比较 hapi、express、restify 和 Koa 的最新性能测试。

说明 Koa 比其他框架快,但是由于这个问题是关于 express 和 restify,Express 比 restify 快。

而且写在post

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

【讨论】:

【参考方案3】:

根据Node Knockout description:

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

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

【讨论】:

【参考方案4】:

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

我大大突破了限制,问题就消失了。

您可以使用 ulimit(或 launchctl limit

希望对您有所帮助。

【讨论】:

嗯.. 听起来可能类似于 connect.bodyParser() 问题,每个连接都会打开本地文件系统上的临时文件? 操作系统通常对进程、线程和/或操作系统可以同时处理的文件描述符的数量有可配置的限制。对于 Linux:***.com/questions/760819/… 对于 MacOS X:***.com/questions/7578594/…【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于为啥要使用 Restify?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Restify 在同一个端口上运行多个 Node 应用程序?

如何使用 Restify 在同一个端口上运行多个 Node 应用程序?

使用 restify (node.js) 提供静态文件

Restify + TypeScript:

管理 Restify 中的错误

如何在 restify 上扩展 socket.io?