• Rails- 让我欢喜让我忧! at 2016年03月15日

    Linux 创始人 Linus Torvalds 曾说过“C++ 是一门恐怖的语言,令它更加恐怖的是,许多不合规范的程序员使用它……”。Ruby 是一门很有魅力的语言,Rails 也是很强大的框架,不过恐怖的是,很多程序员不合规范的使用它。

    之前写其他语言的时候会很小心谨慎,大家也会反复思考:这样写会不会多用内存、会不会有内存泄露、会不会有多线程竞争关系,这是语言强加给程序员的价值观(当然也跟公司环境有关)。幸运的是 Ruby 没有这种限制,但是程序员认真追求极致的态度却不能少。

  • 这种做法实际上是 SJR-Server-generated JavaScript Responses(by DHH) ;Basecamp 中的大部分 Ajax 操作都是这样玩的;RJS was a "ruby-to-js" template system,这玩意只能算是 coffee 的一种粗糙形式。

    另外我一直有个疑惑是,返回的 javascript 在哪里由谁执行的,看了 jquery-ujs 源码并没有执行的语句,jquery-ujs 中 ajax 的回调是这样:

    success: function(data, status, xhr) {
      element.trigger('ajax:success', [data, status, xhr]);
    },
    complete: function(xhr, status) {
      element.trigger('ajax:complete', [xhr, status]);
    },
    
  • Froala 太贵,用不起啊。

    而且,token 直接这样传递给前端,token 的有效期设置为多少呢?最好是有一个获取 token 的接口,每次要上传的时候获取一下 token。

  • #11 楼 @dongli1985 froala editor 还不错,不过好贵啊。跟 simditor 对比,好像也并没有很明显的优势。

  • #6 楼 @hz_qiuyuanxin @hooooopo “解包”的操作是 CPU bound task,经过测试度量,一个线程与多个线程做毫无影响;我使用的是 BinData 这个 gem 做解包的,虽然灵活,性能的确不理想;我并没有使用 Resque 或 sidekiq 这样的组件。

    写 redis 的操作经过这几步优化后,性能有大幅提升:

    • 使用 hiredis driver
    • 使用 pipeline
    • 使用 unixsocket 各自有 2~3x 的提升吧。
  • #1 楼 @hz_qiuyuanxin 由于要先做解包然后再将包中的数据写到 Redis,解包耗费大量 CPU,因此使用了多线程;worker 线程先解包,然后写 Redis,最后释放回 thread pool。

    根据这两个条件:

    • Redis is a single-threaded server;
    • redis.rb 有方法全局锁;

    因此,打算 worker 线程只做解包,然后将包推到一个队列,另外有一个线程专门从队列读,然后写到 Redis,这样就避免多线程竞争锁的问题。

    不知道这样的想法是否可行。