Shanghai on Rails 举办第 9 次线下活动

  • 丁雪丰

2011 年 5 月 22 日

话题:RubyRESTRuby on Rails移动MySQL语言 & 开发架构

成立于 2007 年 10 月的 Shanghai on Rails 是国内较有影响的一个 Ruby on Rails 社区,自成立之初起就坚持每个季度举行一次线下活动,5 月 21 日下午在篱笆网举行的第 9 次线下活动吸引了众多 Ruby 爱好者,还有从杭州、无锡等地特意赶来的朋友。

本次活动的第一个主题演讲是由QuickerBuy的 CTO 汪晓明(Bob Wang)带来的《通过 QuickerBuy 看 Rails 的电子商务应用》。Bob 介绍了 Rails 相关技术在电子商务领域的应用,以及他们在开发过程中的一些实践。QuickerBuy 也采用了目前流行的MongoDB,因为它使用简单,能方便地进行水平扩展,支持自动故障转移和自动分片,综合性能与功能等因素,他们从众多候选数据库产品中选择了 MongoDB。但令人有些意外的是,QuickerBuy 并没有用 MongoDB 来存储数据,而是将它当作一种分布式文件系统,用来存储大量的图片。他们通过CarrierWave这个 Gem 来写文件,随后直接用 nginx-gridfs 来读取文件,整个集群的性能表现还比较理想。

QuickerBuy 的系统中融合了很多流行的开源产品,比如使用nginx来接受请求,Passenger来运行 Rails 程序,Sphinx提供索引服务,使用Redis和 MySQL 相结合来存储数据。除此之外:

  • 针对电子商务 SNS 化的发展方向,使用OmniAuth来做身份验证。
  • 为了提高订单转化率,在支付环节使用支持国内外多种第三方支付方式的ActiveMerchant来进行支付。
  • 通过state_machine来管理订单状态。
  • 使用基于 Redis 的delayed_jobresque来处理后台任务。
  • 使用Capistrano自动化部署。
  • 用 Ruby 来编写系统定时任务,然后通过whenever将其转换为 cron 任务。

网站上线之后,他们也遇到了很多问题。首先是网站迟迟不被搜索引擎收录,经过一番总结,发现了不少问题,比如站点导航信息缺失,没有完整的 SiteMap,链接也不够完善等等。他们使用Tidy清理了不标准的 HTML 代码,改写了will_paginate生成静态的链接。为了掌握网站的运行情况,他们在监控方面也下了一些功夫,外部监控由适用于国内网络的监控宝和适用于欧美网络的Pingdom来实现;内部监控则使用了New Relic,它能够监控系统的每个动作、每条 SQL。

Bob 建议大家要不断学习、善用工具、不断重构,例如可以多看RailsCast,多上Ruby Toolbox了解主流的插件情况,用Cerberus做持续集成,在decent_exposure的帮助下编写更好的 Controller。还要将系统的优化做在前面,落实到日常中去,而不是等到系统大了才想起要合并压缩 CSS、JS,这些都是最基本的,晚做不如早做。

第二个主题演讲是由Ekohe的 Maxime 带来的《Rails as iOS Application Backend》,在过去的一年里,Ekohe 开发了 5、6 个 iOS 应用,都是采用 Rails 来提供后端 API 的。手机端的应用通过基于 HTTP、HTTPS 协议的 REST API 与后端交互,使用的数据格式是 JSON;另外也会调用Apple Push Notification Services来发送 Push Notification。

可以简单地把 iPhone 看做是一个浏览器,因为它能存储并使用 Cookies,这样一来进行身份验证就非常简单了,请求时带上 Cookies 即可。在发送 JSON 请求时,iOS 提供的 NSURLConnection 太过于底层,于是 Ekohe 自己开发了一套 JSONRequest,其中处理了 Cookies、HTTP 重定向及 HTTP 异常等各种常见的问题。借鉴了 Rails 中的 ActiveRecord,他们还开发了一套用于 iOS 的轻量级 ORM 框架,将 JSON Web 后端发来的内容转为对象,并开源了出来。虽然 Rails 自己提供了将 Model 转为 JSON 的功能,但是 Maxime 还是建议大家自己开发 to_json 方法,这样不仅可以定制自己的数据对象,还可以大大节省网络上的传输大小。对于 Push Notification,如果用户允许应用发送 Push Notification,那么会生成一个 Token,可以将这个 Token 保存下来。然后结合 Resque 和apn_on_rails来批量发送 Push Notification。发送时需要注意 256 字节的消息大小限制。

主题演讲之后是本次活动加入的一个新环节――Lighting Talk,由众多短小的演讲串联组成,每位嘉宾就自己的话题做 10 分钟左右的演讲,内容非常广泛。吕戈的《The Fork of Truth》介绍了 fork 函数的各种优点――克隆子进程速度很快、CopyOnWrite 等等;还介绍了一些使用 fork() 的成功案例,例如 Redis 使用 fork() 创建子进程 dump 内存中的数据。杨光在《Titanium Mobile Intro》中介绍了跨平台移动开发平台Titanium,它的优点是可以跨平台(iOS、Android 和 BlackBerry)、基于 JS 开发、本地 App;但它也有一些缺点,比如开发资源不够丰富、自定义 UI 非常困难,还有就是需要通过代码来判断当前的平台。《Ruby on Shoes》中介绍了由 _why 开发的Shoes,这是一个 Ruby 的 GUI 工具,可以跨平台,具有元编程能力,非常适合开发原型系统。周亮为大家介绍了Jekll这个轻量级的基于 Ruby 的博客工具,如果你想写博客,但又不想自己搭建复杂的系统,就可以考虑 Jekll 来生成静态的博客;周亮表示自己的博客就使用 YAML 来编写配置,用 Markdown 写文章,通过Pygments对生成的静态 HTML 中的代码进行代码高亮,使用Disqus添加评论功能。

来自薄荷网的 Vincent 介绍了他们在Percona方面的使用经验,之前使用 MySQL 5.1.34 时,数据库压力非常大,CPU 使用率经常达到 60%、Load Avg 到 8,在尝试了一些优化方法之后没有明显改善,随后他们切换到了 Percona 上,CPU 使用率降低到了 6%、Load avg 降到了 3;在官方的性能测试中,相比同版本的 MySQL,Percona 性能提升 40%,并且表现得更加稳定,能更好地利用多核和多 CPU,功能更加丰富。

来自盛大创新院的庄表伟对最新上线的盛大开源平台 SNDACode做了一个介绍,他那幽默诙谐的表达方式收到了大家的热烈掌声:

企业开源图什么:攒人品、求关注、搏出位、捞实惠、聚众智、收长效

企业开源怎么搞:拉关系、走门路、吹法螺、写软文、建微博、勤反馈、肯认错

如果你对 Ruby 感兴趣,如果你有自己的想法想要分享给大家,那么不妨去 Shanghai on Rails 的线下活动看一看,相信一定会有意想不到的收获。

RubyRESTRuby on Rails移动MySQL语言 & 开发架构