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 的操作经过这几步优化后,性能有大幅提升:
#1 楼 @hz_qiuyuanxin 由于要先做解包然后再将包中的数据写到 Redis,解包耗费大量 CPU,因此使用了多线程;worker 线程先解包,然后写 Redis,最后释放回 thread pool。
根据这两个条件:
redis.rb
有方法全局锁;因此,打算 worker 线程只做解包,然后将包推到一个队列,另外有一个线程专门从队列读,然后写到 Redis,这样就避免多线程竞争锁的问题。
不知道这样的想法是否可行。