我用的 罗技 MX Master 2s
我用的 Cherry MX Board 8.0 青轴,外观和 Mac 很搭
@dudu_zzzz 描述下我遇到的问题,
事情发生在 2016 年 03 月,我们 API 采用 Grape 开发,线上请求量非常大,nginx 阻塞严重,于是把 unicorn 改成了 puma,以提高并发,上线后收到用户反馈,看到了别人数据。。
刚开始我们一度怀疑是 current_user 问题,最后发现不是这里的问题
根源是当时对象的 json 序列化用了非 release 版本的 active_model_serializers,其使用了非线程安全的类变量导致,也就是说同时来了两个用户的请求,A 用户 write 的类变量,有可能被 B read 到。。
当时的 Gemfile 配置:
gem 'active_model_serializers', git: 'https://github.com/rails-api/active_model_serializers.git', ref: '2df8804'
可以直接把 active_model_serializers clone 下来,git checkout 到 2df8804 找到该处代码:
active_model_serializers/lib/active_model/serializer.rb
def read_attribute_for_serialization(attr)
if self.class._serializer_instance_method_defined?(attr)
send(attr)
elsif self.class._fragmented
self.class._fragmented.read_attribute_for_serialization(attr)
else
object.read_attribute_for_serialization(attr)
end
end
测试代码没发现这个问题?
测试代码是单线程跑的,不会出现该问题。
怎么排查到这个问题的 ?
不同用户并发请求压测,最小原则一步一步注释代码,排除法找到是 active_model_serializers 问题,进一步发现用了类变量。
教训 ?
1、不要使用非正式版本的代码,隐患极大。
2、测试代码要测试多用户并发场景,验证返回的数据。
供参考,欢迎交流 ~ @dudu_zzzz
顶 豪哥 :D
我在用 nginx-push-stream
@ShiningRay nginx 60s 有问题啊,unicorn 处理超过 60s 的话,nginx 就返回 504 了。
来往 经常 秒退 ...
@xieren58 看着不错
nodejs 不觉得活跃啊,我在 cnodejs.org 问了问题,少有人回答
npm 包增长迅速,得益于 javascirpt 开源库多有关。
nodejs 异步 callback 写法,会导致嵌套很深,很反人类,也注定只能是小众范畴。
@kafka0102 <c 和指针> 已收到,顺便 show 下我书架,嘎嘎。
@kafka0102 已选,weibo 也帮转了,id 是 wxianfeng, 送两本呗。
我在用 ngx_lua 提供 json api, 性能比 node.js 还猛。
顶一把,三年前在无锡,现在北漂。
用户乱串 我们也遇到过,因为后面的用户复用了之前的线程变量。
所以应该在每次请求结束后清除线程变量,可以放到 application_controller 中
after_filter :clear_thread_variable
def clear_thread_variable
Thread.current[:user] = nil
end
我之前 resque 老是 crash 掉,用了 god 解决的,也许这里可以借鉴下。
利用 cron 不是很好實現嗎
報警可以使用 nagios, 提醒可以使用 郵件,短信 (飛信,139 郵箱),IM,微信等很多方式...
哈哈,好久不见啊。
每次我用的时候,都是想到下面这关系
&proc => block
我第一本进阶书是 Rails 高级编程 , 有同感的吗?
shuffle 中文叫洗牌
我们也有几台服务器 配置文件都是放在 git 中的,这边 push 别地 pull 就行了,很方便。
什么语言开发的?
你这监控是啥 new_relic?
统一先 parse 后再比较
同意楼上 用 NestedSet 模型吧,这个模型太棒了。
说下我们的备份方案: 1, RAID 1 2, 每天夜间 rsync 增量备份 3, 每天夜间 rsync 异地机房备份 4, mysql 主从复制
同感,从 Rails 高级编程 中学了很多招。