当前位置: 首页 > news >正文

Ruby Web框架

JGW Maxwell在2011年底做了一个 Ruby Web框架的并发处理能力测试 ,还做了node.js的对比测试。用250个并发去做压力测试,后端使用MongoDB数据库,总共跑完10万个请求,测试结果如下:

Web框架并发模型吞吐量
Rails多进程531 request/s
Sinatra多进程576 request/s
Sinatra::Synchrony纤程1692 request/s
Goliath纤程1924 request/s
CrampEvent IO3516 request/s
node.jsEvent IO3100 request/s

纤程IO模型的性能是传统多进程模型的3-4倍,而Event IO则是多进程的6-7倍。值得一提的是Ruby的Event IO框架Cramp甚至性能超过了node.js。看来并发性能差的原因并不在Ruby。

 

我们看一个 Ruby web框架请求处理性能评测 ,这个评测不访问数据库,也不测试并发性能,主要是测试框架处理URL请求路由,渲染文本,返回结果的处理速度。

 

Web框架处理速度
Rack1570.43 request/s
Camping1166.16 request/s
Sinatra912.81 request/s
Padrino648.68 request/s
Rails291.27 request/s

 

这里我想简单介绍3个Ruby轻量级框架,性能都远远超过Rails,很适合做Web Service:

  • Sinatra

    Sinatra本身也是Ruby社区非常流行和著名的轻量级Web框架,核心源代码不超过1000行,文档只有1页。对于Rails开发者来说,花了几个小时,就可以快速使用Sinatra开发Web Service了。Sinatra对多线程支持的非常好,可以用rainbows 来跑多线程Sinatra,IO并发处理能力很好。Github也是用它来提供开放API服务的。我自己写了一个 Sinatra的项目模版 ,如果你用Sinatra开发Web Service,可以参考。

  • Padrino

    Padrino是一个基于Sinatra之上的轻量级Web框架,在Sinatra基础之上提供了命名路由,模块化项目组织,页面helpers和generators等等。Padrino是一个高度模仿Rails的框架,API的命名和Rails很像,Rails开发者花1-2天看看文档就可以快速上手开发了。Padrino相比Rails易学易用,多线程支持良好,性能比Rails好很多,开发Website推荐使用。我自己的网站也是用Padrino开发的,源代码在: robbin_site

  • Goliath

    Goliath是一个Ruby的纤程开发框架,性能非常好,作者本身是在开发PostRank产品过程中开发的Goliath。PostRank是一个用户社交行为实时跟踪工具,需要很高的性能来支撑,PostRank被Google收购了,作者现在在Google工作。Goliath适合用来开发对性能非常敏感的Web Service或者real-time的应用,但使用Goliath有一些门槛,你不能使用普通的阻塞IO库,必须使用作者封装的一些纤程的库。http://tech.vonstark.co/post/20053649068/ruby-non-blocking-goliath  

 

比较适合写Web服务接口的轻量级Web框架我推荐两个:Grape和Sinatra,两个的区别主要是:

Grape是个纯粹的写API的框架,提供了很多写API很方便的功能,用Grape写API很爽,应该是首选,他只提供json/xml/txt格式输出。

Sinatra是个相对完善点的Web框架,带有模板渲染功能,但单纯写API的话,没有Grape爽。不过如果你的API Server有可能输出HTML页面片段,需要模板功能的话,还是Sinatra更合适,否则用Grape在代码里面拼字符串还是很麻烦的事情。

Grape和Sinatra都是基于Rack之上很轻量级的封装,我做了框架处理请求速度的测试,以及多线程并发的简单测试,基本上性能差异非常小,Grape稍微快一点点,但不超过5%。

转载于:https://www.cnblogs.com/avincross/p/3815440.html

相关文章:

  • js千分位的函数
  • SVN 安装到vs2010及SVN的用法
  • SpringMVC 中HttpMessageConverter简介和Http请求415 Unsupported Media Type的问题
  • Arcgis 10.1中空间连接功能
  • SQL SERVER索引
  • 浅谈C++多态性
  • Ubuntu12.04下使用valgrind内存测试工具测试Qt程序
  • 占位符的使用
  • OpenFlow协议标准演进过程
  • 收集与测试相关的所有工具
  • ORACLE优化器RBO与CBO介绍总结
  • 那些踩过的坑
  • 数学图形(1.44)超圆
  • ASP.NET MVC之单元测试分分钟的事
  • 连接池的概念
  • [case10]使用RSQL实现端到端的动态查询
  • CAP 一致性协议及应用解析
  • k8s 面向应用开发者的基础命令
  • October CMS - 快速入门 9 Images And Galleries
  • 编写高质量JavaScript代码之并发
  • 入手阿里云新服务器的部署NODE
  • 线性表及其算法(java实现)
  • 详解NodeJs流之一
  • 小程序开发中的那些坑
  • 字符串匹配基础上
  • (13):Silverlight 2 数据与通信之WebRequest
  • (a /b)*c的值
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (南京观海微电子)——I3C协议介绍
  • .Net 应用中使用dot trace进行性能诊断
  • .Net中ListT 泛型转成DataTable、DataSet
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @property python知乎_Python3基础之:property
  • [2016.7 day.5] T2
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Android]使用Retrofit进行网络请求
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [C/C++随笔] char与unsigned char区别
  • [CakePHP] 在Controller中使用Helper
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [Codeforces] probabilities (R1600) Part.1
  • [Contest20180313]灵大会议
  • [Django 0-1] Core.Handlers 模块
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [Git].gitignore失效的原因
  • [Hive] CTE 通用表达式 WITH关键字
  • [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
  • [MAC OS] 常用工具
  • [NOI2012]迷失游乐园
  • [NOIP 2015] Day.1 T1 神奇的幻方 [模拟]
  • [one_demo_18]js定时器的示例
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4
  • [SpringCloud] OpenFeign核心架构原理 (一)