Ruby 谁可以给我个用 Grape 写 API 的项目的源码或者 example

wangping · 2014年07月07日 · 最后由 Victor 回复于 2014年11月06日 · 7331 次阅读

如题,grape 文档看过了,自己写的时候希望可以优化下,求分享链接,可以借鉴优秀的代码

#1 楼 @qichunren 这个跟我的想法差不多,就是不知道还有没有更加结构清晰的了,比如一个 resource 就在一个文件,毕竟这个不像 rails,resources 里面需要写代码

其实用 Rails 不就好了?

#3 楼 @Rei 我也想啊,老板不要啊 ,你说说他去~~~

#4 楼 @wangping “你行你上啊”

#5 楼 @Rei 我行,但我不能上,完了谁发钱??

#4 楼 @wangping 我们的项目,第一版本用 Rails 3 写的 API,撑到了 70W PV。感觉一点问题都没有。后来看论坛的大神都说 Grape 霸气侧漏,Rails 太重了。我脑袋一热,API V2 就用 Rack App 配合 Grape 写的,没错,我没有用 Sinatra 之类的框架。然后就,呵呵。。。各种坑。用了两台服务器,都撑不到 500 RPM。

坚持了 2 个月,实在挺不住了。摔啊!!!然后花了 2 天时间,改回用 Rails 跑 Grape,现在两台服务器撑 2000 RPM 小意思。

所以,如果你不想给自己找麻烦,Rails 配合 Grape 挺好的。

PS: 服务器是阿里云低配,双核 CPU 内存 2.5G。

#7 楼 @Victor 谢谢你的建议

#7 楼 @Victor 我是准备 grape 配合 rainbows

#9 楼 @wangping 我用的 puma,感觉挺好的。双核 CPU 可以开 4 个 work,然后走 256 个线程。大概不眠不休 3 天,内存会吃 1G 左右。然后不论跑多久,都会稳定在 1.6G 左右,不会更高。

#10 楼 @Victor 嗯嗯,这个以后可以尝试,目前老大已经同意这么做了,我还不知道会有啥后果

#11 楼 @wangping 我遇到的坑主要集中在,数据库连接池的管理,缓存,线程安全。只要这 3 个解决了,用 Rack App 跑 Grape 其实也没那么吓人。

我当时是参考 https://github.com/intridea/grape/wiki 的例子。

主要是

https://github.com/dblock/grape-on-rack https://github.com/kunovsky/Grape_on_rack_sqlite3 https://github.com/cutalion/grape-api-example

这几个可以看看。

#1 楼 @qichunren ruby-china 这个结构用 require 的话开发环境自动重载会有问题. 亲踩.改为 rails 风格的目录结构让 rails 自动处理加载可以解决.

#2 楼 @wangping 这是我现在的结构,也是扔在 rails 里的.

#7 楼 @Victor 字码得有点多,RPM 这个词用得挺有意思的。

#12 楼 @Victor 数据库那边是准备用 pgpool-II 来分流

#13 楼 @flypiggys 确实会有,我已经感受到了。

#7 楼 @Victor 不太理解你那句 "所以,如果你不想给自己找麻烦,Rails 配合 Grape 挺好的。" 应该怎么理解啊. 前后你不是都在说还是用 rails 做比较好么.?

#19 楼 @ruohanc 。。。。

if i want trouble
  use Rack App + Grape
else
 use Rails + Grape
end

这样如何。。。

#15 楼 @zfjoy520 啊,这个词不是我乱造的,newrelic 的统计里面有。意思是 Requests Per Mintue

#16 楼 @wangping 我们还是 mysql。单表上千万数据,还 (bu) 行 (tai) 吧 (hao)

#21 楼 @Victor 呵呵,我也是第一次用 Postgresql,还不知道会怎么样~~

#22 楼 @wangping 可以参考一下 robbin 一年前的 sample app

https://github.com/robbin/ruby_framework_bench

#24 楼 @wangping 很多东西需要自己修改的喔。呵呵。

#25 楼 @zfjoy520 Gemfile 和数据库的配置要改吧

#26 楼 @wangping 这个是必须的嘛。其他的就根据自己的情况来喽。

@wangping Peatio 的 API 也是 Grape 写的, 基本上一个资源一个文件 https://github.com/peatio/peatio/tree/master/app/api/api_v2

另外还用了 grape-swagger 来生成 API 文档 https://github.com/tim-vandecasteele/grape-swagger

#28 楼 @jan 谢谢,我看看

一个多对多的关系 user 中间表favorite_sports sport 如果手机客户端要输出一个 sports 表格,并用打钩来表示 favorited! 这样的情况,大家用 grape 怎样做? 是

一个获取全部sports,一次用过user_id获取favorite sports,然后在客户端进行比较

还是

直接在服务器端进行,组成类似sport (id, name, checked)后返回

#20 楼 @Victor .....好吧..我脑洞太大把你前面说的 rack 都脑补成了 rails

我有用 Grape 实现 android 版的服务端。还是挺好用的

#28 楼 @jan 从这上面学到了 mount 这个东西可以分离出文件

@Victor 我的经历跟你一样,也是参考了下面的代码 https://github.com/dblock/grape-on-rack https://github.com/kunovsky/Grape_on_rack_sqlite3 https://github.com/cutalion/grape-api-example

后来将 grape-api-example 删,拆,改,变成自己想要的纯 grape-on-rack 的框架,暂时还没发现什么问题,我做过 ab 测试,理论上纯 grape 要不 rails-grape 请求响应快。

@Victor 我也在头疼于数据库连接池的管理,是不是要针对不同的 server 做设置,你有什么好的建议或是参考么

#35 楼 @vode 没有理解你的问题?我是同样的配置克隆了两台机器,前面用阿里云的负载均衡。数据库刚刚转到 RDS 上去了。现在一切稳定。

对的,每个 server 要有自己的连接 mysql 的用户,这样出现慢查询,多少有点帮助。

@Victor 不是阿里云的那个物理 server 是 web-server,抱歉,我的思路有点混乱,因为我们现在在用 passenger 的免费版,而 passenger 的免费版是不支持多线程的,所以,我想包括 AR 和 Sequel 的连接池机制都没什么作用,因为那些连接池都是线程共享的,我现在加了 ActiveRecord::ConnectionAdapters::ConnectionManagement 这个中间件,在请求后关闭活跃连接,但是 mysql 还是会显示有没有端口号的连接,连接到 mysql(暂时也没找到原因,mysql 的连接数比不用 grape 之前要翻倍),所以我在想是不是使用多线程的服务器,利用 ORM 的连接池,能更好的管理数据库连接,所以请教下你有没有一些建议,或是什么例子可以参考下

#37 楼 @vode 如果你不是 Rails 的项目那么你需要自己管理数据库的连接和关闭。当我用 Rack 的时候发现了一个问题,我们的安卓客户端程序员没有关闭请求连接,因为他没有使用网上那些比较成熟的 lib 而是自己搞了一套。但是这样的情况应该比较少见。。。

我就想为啥我用 Rack 就这么脆弱,而当年用 Rails 写第一版本 API 的时候没这个问题呢?因为都是同一个客户端啊。后来发现 Rails 会帮忙关闭超时的数据库连接。也就是说 Rails 帮忙掩饰住了这个问题,我们过去 1 年的客户端都是这么 bug 着!!!

后来渐渐用户量上来之后又发现问题了,mysql 那边总是有很多连接在 sleep 状态,这明显和我们当时用户在线活跃度不同。关于这个问题你可以看看 http://wjp2013.github.io/rails/rails-and-mysql-wait-timeout/

40 楼 已删除

@Victor 谢谢,很有帮助,但是把 wait-timeout 值(15)设低后会引起大量的 close-wait 连接,我改为 100 感觉就更好些,我现在是在执行后手动去关闭数据库连接,感觉还是挺笨的 orz

#40 楼 @vode 我是设置的 110 秒。mysql 那边设置的是 120 秒。我那个文章写得是 15 秒吗。。。那真是坑读者了!!!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号