`
sg552
  • 浏览: 620022 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
47437293-94b9-3b04-9152-8971c7580049
白手起家学习使用Flex
浏览量:18709
社区版块
存档分类
最新评论

rails 性能优化心得

阅读更多
近期一个项目要上线(终于要交付了),交付前进行了一些大数据量下的性能优化,心得记录下来:

1. 在开发的初期就要使用大量的数据。10K 比较合适。 有生产数据最好(比如需要跟其他系统进行交互),没有的话,就自己生成(factory girl).   很多时候,打开一个性能糟糕的页面,100条数据下看不出来什么,但是10K数据下就看出速度来了。

2. 使用设计良好的MVC模式。该放在MODEL里的,绝对不要放在CONTROLLER里,更不要放在VIEW里。原因是:
  2.1 耦合严重。我们要 decouple.
  2.2 很多性能测试工具,难以测试出页面中的方法,但是可以测试出MODEL中的方法。
  2.3 放在MODEL中,容易写单元测试(测试代码易于编写,那么实现代码就易于编写)。

2. 另外,最好一次性的读取数据,例如,你需要读取3条记录,最好使用这样的方式:
  @device = Device.where("id in (1,2,3)")
  它会生成这样形式的 SQL:    select .... where id in (1,2,3)

  而绝对不要在你的页面中 :

  [1,2,3].each { |i|  Device.where("id = #{i}") } 

  因为后者会链接数据库 3 次, 而前者只一次。  想一想,如果你的某个循环需要重复链接数据库1000次,该是什么效果?  所以。...     回头再详述一下。(TODO)

3. WEBSERVICE 用的越少越好。 回头专门详述。 总之,这个是拖累系统速度的毒瘤。能不用就绝对不用,非用不可的话,一定要用缓存。

4. 缓存一定要用。可以不用MEMED CACHE这样重量级的,但是起码轻量级的一定要用。例如:
config.cache_store = :memory_store, {:expires_in => 60} 
使用 observer与之配合,效果更好。

在上一个项目用,我用cache来缓存系统的常量。它们是可被配置的,保存在数据库中,一般情况下不会被修改。 回头我也写个文章来记述一下。


5. 尽量少与其他 的系统交互。  这个也很拖累性能。(跟webservice 的理由一样,一个response 需要2~4秒,客户体验不好)。 一定要加缓存。 例如,目前这个系统的“authorization" (授权),不是使用cancan或者 本地的数据库表来授权,而是要访问远程的某个服务器,以GET方式读取某个用户的权限。
一般读取一次需要1~2秒,如果某个页面有5个地方需要授权,那么打开这个页面就要消耗10秒左右的时间。 所以,一定要做缓存。。。 
TODO 同上面第四点,写个专门的文章。。。

6. 使用SQLITE3的话,不要使用transaction. 可以使用delayed_job. 因为一旦使用了TRANSACTION, 那么很容易出现 锁死的情况。用户看到的就是 500 错误。 这个在生产环境下是不可接受的。 哪怕速度慢一点也没关系,我们用一个沙漏啥的小动画来告诉用户,这个东西在后台处理,需要等多少秒。用户也就知道了:哦,它在正常工作,等一会儿我就可以继续操作了。  (这个特别有效,比如说: 上传100K个数据的 CSV, 对它进行验证,读取,验证重复,导入的话,普通方式1000秒, 使用了transaction 300秒, 但是我们用delayed_job的话,用户1秒后就可以看到响应结果(正常处理。。。啥的文字),就会体验很好。 )

7. 同六,凡是会让用户等待过久的地方,使用DELAYED——JOB。

8. 很多功能实现起来很容易,但是需要对某个功能进行进度控制,结果控制的话,就非常麻烦。例如:

  8.1 单纯的导入100K个数据,非常容易。
  8.2 要求导入100K 个数据, 要求对某个属性进行验证,使之不能重复,也容易。
  8.3 在8.2的基础上,还要求显示结果,成功的有多少,失败的有多少。这个就稍有些复杂了。你的代码开始凌乱,有了坏味道,特别是单元测试不够丰富的时候,原有的良好结构开始破坏。
  8.4 在8.3的基础上,你使用了delayed_job,这个时候,要求用户看到进度(比如30%), 这个时候,你的代码的复杂度,是8.1的10倍, 8.2的 5倍。 起码在我目前这个项目中是这样的。

9. 数据的冗余很多情况下也是必要的。例如看这些功能:
  9.1 我们要调试100K个设备
  9.2 调试完毕后,记录每个设备的调试信息。
  9.3 某天,我们删除这些设备。
  9.4 管理员查看调试记录,发现很多调试信息都丢失了。为什么?

  原来,系统的实现方式,是每个调试信息(debug_info) 对应于 设备(device)。那么一旦 设备 被删掉之后,那么调试信息也就没有了。这个是不被允许的。所以,比较理想的办法,是在每个调试信息中,加上对应设备的信息。 虽然看起来比较冗余,但是这是一种平衡。

  我们目前上线的系统中,几乎每个模块都有这样的功能和需求。所以。。。哎。。。

10. 保持开发机器和生产环境的机器  环境要一致。这里的一致包括:
  1. 操作系统。 哪怕一个是CENTOS 一个是 UBUNTU, 将就吧,但最好一模一样
  2. 语言版本。 要么都是RUBY 1.8.7,要么都是 RUBY 1.9,要么都是 RVM。
  3. 数据库,  绝对不能一个是MYSQL, 一个是SQLITE3.
  4. 最好都能访问一个网络,不要出现一个处于内网一个处于外网,一个能访问GIT一个不能,一个能访问通过域名 ooxx.com 访问 授权服务器,另一个则只能通过 ip 访问。
  5. 最好VIM的版本都是一样的。不能一个 7.3一个 6.9 ,一个有很多PLUGIN, 另一个没有任何PLUGIN。
  6. 速度要一致。(生产环境的服务器的 SSH 速度不能太慢,例如不要一个在美国一个在大陆,否则 开发人员SSH 生产服务器之后,敲一下键盘3秒钟之后才看到结果,估计调试一个BUG要走神20次)

  以上几点,任何一个不满足都是有麻烦的。

11. 一定使用rails3 的 asset pipeline.
这个效果相当明显。记得最初的项目,我们用了20个JS库, 以及好多个CSS, 每次查看网络通信的时候,发现由于每个JS,CSS,IMAGE都要让客户端/服务器重新发送一个 request/response,时间占用的很多。使用了asset pipeline之后,性能改善太多,最显著的就是:只有一个 JS, 一个 CSS 文件。而且RAILS3提供的文档(优化 APACHE, NGINX )也对缓存非常有效。现在图片也缓存的非常好。 打个比方, 原来需要消耗10秒才能发送完毕CSS/JS/图片,现在只需要2~5秒左右。太棒了。

12. 一定要使用coffee javascript. 这个不但提高开发效率,还提高执行效率,还能提供压缩。 想起了 HIBERNATE  V。S。 RAW SQL。
分享到:
评论

相关推荐

    Rails相关电子书汇总二

    Rails的源码分析有助于开发者深入理解框架的工作原理,提升问题排查和性能优化的能力。而工具部分可能包括开发环境的搭建、调试工具、版本控制、自动化测试等方面的内容。 压缩包中的文件名 "Advanced Rails.chm" ...

    Agile Web Development With Rails Fourth Edition

    书中通过一系列实际项目的开发过程,介绍了如何使用Rails构建可扩展的、高性能的Web应用,并且深入探讨了如何在敏捷开发环境中有效地运用Rails框架。 #### 社区参与与反馈 作者团队鼓励读者积极参与到社区中来,...

    Agile Web Development with Rails-Second Edition-Beta一书例子

    《Agile Web Development with Rails-Second Edition-Beta》是一本专为Rails开发者设计的书籍,旨在教授敏捷Web开发的...书中可能还涵盖了部署、性能优化、安全等方面的知识,是Rails初学者和进阶者的重要参考资料。

    Beginning Google Maps Applications with Rails and Ajax

    - **社区交流**:加入相关的开发者社区,与其他技术人员交流心得,可以更快地解决问题,同时也能获得宝贵的建议和支持。 综上所述,《Beginning Google Maps Applications with Rails and Ajax》这本书为初学者提供...

    关于css排版的几点心得

    10. **性能优化**:减少HTTP请求、合并CSS文件、使用minify压缩代码、利用CSS Sprites和适当的CSS选择器都是提高网页加载速度的关键。 以上是关于CSS排版的一些核心知识点,熟练掌握它们将极大地提升你的网页设计...

    书友

    同时,应用的性能优化可能通过缓存策略、数据库索引和异步任务(如使用Sidekiq或Resque)得以提升。 书友应用可能采用版本控制系统,如Git,来协同开发和管理代码,每个版本的更新都会记录在Git历史中,这样团队...

    javaeye热点阅读

    19. Ruby on Rails:Ruby on Rails是一个流行的Web开发框架,文中探讨了其在企业开发、嵌入式开发中的应用,以及工作流实现。 20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。...

    个人博客系统

    9. **性能优化**:包括缓存策略、CDN内容分发网络、懒加载等技术,以提升网站速度和用户体验。 10. **安全性**:保护用户数据的安全,避免SQL注入、XSS攻击等,需要对输入进行验证和过滤,使用预编译语句或ORM框架...

    leetcode卡-Awesome-Articles:各种主题的精彩文章集合。每天都会更新新文章

    此外,还可能有关于RESTful API设计、性能优化、安全性等方面的讨论。 对于想要发展副业的读者,这个资源库提供了一系列文章,指导如何利用技术创业,或者在现有的工作之外开辟收入来源。这些文章可能涵盖个人品牌...

    luigiguerreros:个人页面

    【标题】"luigiguerreros:个人页面" 指的是一个名为Luigi Guerreros的人的个人网页项目。...同时,这个项目也可能包含Luigi Guerreros对代码组织、可维护性和性能优化的理解,这些都是作为一名优秀开发者必备的素质。

    Ruby语言教程.docx

    - **代码优化**:学会识别并优化性能瓶颈,提高代码质量和运行效率。 - **团队协作**:熟悉版本控制系统如Git,掌握团队协作的最佳实践。 #### 八、持续学习与技术更新 - **关注官方文档**:定期查阅Ruby官方文档以...

    Flavor-Town:必吃餐厅列表创建者应用程序

    9. 性能优化:为了提高应用性能,开发者可能会采用缓存技术,如Redis或Memcached,减少数据库查询次数。 10. 测试与部署:应用开发过程中,单元测试和集成测试是必不可少的,确保代码质量。最终,应用会部署到...

    tony2767.github.io:博客

    8. **Web开发最佳实践**: SEO优化,响应式设计,性能提升技巧,如压缩资源、减少HTTP请求等。 通过阅读和研究这个博客的源代码和内容,无论是对Ruby初学者还是经验丰富的开发者,都能获得宝贵的编程和Web开发知识。

    afinetooth.github.io:afinetooth开发人员博客

    4. **编程最佳实践**:博客可能包含Ruby编程的最佳实践,如代码风格、错误处理、性能优化和内存管理等方面的知识。 5. **开源项目**:afinetooth可能会分享自己参与或创建的开源Ruby项目,这些项目可以是工具、库...

    JustRecipes-:JustRecipes

    在这个平台上,用户可以浏览各种美食菜谱,搜索他们感兴趣的烹饪方法,甚至分享自己的烹饪心得。通过这个项目,我们可以深入学习Ruby在Web开发中的应用,以及如何构建一个完整的互联网应用程序。 Ruby是一种面向...

    cjinhuo.github.io:博客 cjinhuo.netlify.com

    此外,安全性、性能优化和RESTful API设计也是服务端开发的重要知识点。 "喜好"部分可能包含博主对特定技术或工具的偏好,他可能会推荐一些自己常用并认为优秀的开发资源,如代码编辑器、版本控制系统(如Git)、...

    国际象棋主题网站模板

    2. 后端开发:可以采用WordPress、Django、Ruby on Rails等CMS或框架搭建,便于内容管理。 3. 数据库:MySQL或MongoDB存储棋谱、用户信息、论坛帖子等数据。 4. API集成:可能与第三方对弈平台(如lichess.org)集成...

Global site tag (gtag.js) - Google Analytics