• 有木有鼠标控 at 2018年08月24日

    我用的 罗技 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

    @evan127

  • ruby 实时推送 at 2013年11月15日

    我在用 nginx-push-stream

  • @ShiningRay nginx 60s 有问题啊, unicorn 处理超过60s 的话, nginx 就返回 504 了 。

  • 阿里员工来往二维码 at 2013年10月27日

    来往 经常 秒退 ...

  • @xieren58 看着不错

    nodejs 不觉得活跃啊, 我在 cnodejs.org 问了问题, 少有人回答 😢

  • @xieren58 @nightire promise 我当然知道了. 很多人写的 依然是原生的, 因为 nodejs 天生就是利用 callback 来实现异步io, 事件驱动. 不是你用 promise就能解决异步思维编程方式的.

    让我说 go 的 goroutine, lua 的 coroutine 同步编程写法, 轻松实现高并发, 写起来舒服多了.