如题,grape 文档看过了,自己写的时候希望可以优化下,求分享链接,可以借鉴优秀的代码
先看一下 ruby-china 的 API 怎么样?https://github.com/ruby-china/ruby-china/blob/master/app/grape/api.rb
#1 楼 @qichunren 这个跟我的想法差不多,就是不知道还有没有更加结构清晰的了,比如一个 resource 就在一个文件,毕竟这个不像 rails,resources 里面需要写代码
#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。
#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 自动处理加载可以解决。
@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
一个多对多的关系
user 中间表favorite_sports sport
如果手机客户端要输出一个 sports 表格,并用打钩来表示 favorited!
这样的情况,大家用 grape 怎样做?
是
一个获取全部sports,一次用过user_id获取favorite sports,然后在客户端进行比较
还是
直接在服务器端进行,组成类似sport (id, name, checked)后返回
@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 是 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/
@Victor 谢谢,很有帮助,但是把 wait-timeout 值(15)设低后会引起大量的 close-wait 连接,我改为 100 感觉就更好些,我现在是在执行后手动去关闭数据库连接,感觉还是挺笨的 orz