为什么要使用Restify?


101

我需要在node.js中构建REST API,并且正在寻找一个比express.js更轻巧的框架,这可能避免了不需要的功能,并且会像构建REST API的自定义框架一样工作。对于相同的情况,建议从其介绍中重新调整。

阅读为什么使用重整而不表达?似乎重新调整是一个不错的选择。

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

我在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();
}

我得到的结果似乎合理吗?在这种情况下,表达是否比重新定义更有效?还是我测试它们的方式有任何错误?

更新以回应评论

重整行为

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

  2. 当负载甚至达到100 reqs时。每秒接收到1015,之后一直没有响应。


3
您是否经历过:blog.perfectapi.com/2012/…?如果您在google上搜索,将会听到很多人对其性能表示怀疑。
Munim

3
在解析路由或请求数据时可能重新调整某处的块,而没有有效地执行,这会导致高负载的响应时间激增。Express.js轻巧但功能丰富。由于未使用的功能对总体性能没有太大影响,因此制作方式仍然很轻巧。同样,它也得到了大公司的良好维护和使用,例如:MySpace。我看不出将Express.js用于REST API的任何缺点(我确实做到了),实际上它允许您将来使用功能完善时改进您的API。
moka,

1
@Munim:谢谢你的图表。但是页面上显示“ 请注意,此图表已经过时,因为Restify性能问题已得到解决 ”。但是似乎没有任何解决。
mithunsatheesh

1
@mithunsatheesh我也注意到了。但是由于作者没有进行新的研究,所以我加了少许盐。github上的问题仍然让人们抱怨性能。
Munim

2
您能否提供更多(重新验证)示例代码?
阿德里安·海涅

Answers:


50

更正:此信息错误,继续滚动!

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


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

它说:

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

来自Raygun.io的基准图像

Restify似乎是这里的赢家,可简化服务部署。特别是如果您要构建的服务可以接收来自相同客户端的大量请求并希望快速迁移。与裸节点相比,您当然能获得更多收益,因为其中包含了诸如DTrace支持的功能。


1
如果作者披露有关他遵循的测试过程的更多详细信息,那么您提到的博客文章将很有用。查看帖子下方的评论!
mithunsatheesh 2015年

1
是的,的确如此,因为很难正确执行基准测试,如果作者发布了流程和代码,那就太好了。因此,我将其视为一小块盐,并希望与社区分享。
Masum 2015年

根据Restify文档,它还支持DTrace。mcavage.me/node-restify/#dtrace
Jeff Fairley


3
在得出结论之前,请注意同一篇文章中的附录。
Vignesh TV

26

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

它表明Koa比其他框架要快,但是由于这个问题涉及表达和重新定义,因此表达要快于重新定义。

它写在帖子中

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

在此处输入图片说明


11

根据Node Knockout的描述

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

性能问题和错误可能可以得到解决。也许描述会是足够的动力。


5

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

我大大地突破了极限,问题消失了。

您可以使用ulimit(或launchctl limit)检查maxfiles是否位于 <仅限于OS X),并查看最大值。

希望能有所帮助。


嗯..听起来可能类似于connect.bodyParser()问题,其中每个连接都在本地文件系统上打开临时文件?
埃里克·埃利奥特

操作系统通常对进程,线程和/或操作系统可以同时处理的文件描述符数量有可配置的限制。对于Linux:stackoverflow.com/questions/760819/... 适用于MacOS X:stackoverflow.com/questions/7578594/...
AndreasPizsa

2

我对express或restify或perfectAPI感到困惑。甚至尝试开发所有模块。主要要求是制作一个RESTapi。但是最终还是以express结束,用所有框架上每秒的请求测试了我自己,express比其他人提供了更好的结果。尽管在某些情况下重新表达出了杰出的表现,但明确的接缝赢得了比赛。我竖起大拇指表示感谢。是的,我也遇到过机车js,一些基于express的MVC框架。如果有人在寻找使用Express和Jade的完整MVC应用程序,请去机车。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.