繁体   English   中英

Sidekiq工作人员中的Ruby Object突变

[英]Ruby Object mutations within sidekiq workers

我有一个包装程序,该包装程序定期在Sidekiq工作程序中运行,将用户更新发送到外部服务。 每个用户都有自己的Sidekiq作业。 Sidekiq设置为使用20个线程。 这是Rails 5.0.1应用程序,MRI Ruby 2.3.0。 Web服务器是乘客5社区。

如果我过度简化,代码如下所示:

class ProviderUserUpdateJob < ApplicationJob
  queue_as :default

  def perform(user_id)
    user = User.find(user_id)
    Provider::User.new(user).push_update
  end
end


class Provider::User 

  def initialize(user)
    @user = user
  end

  def push_update
    SomeApiWrapper.call(
      user_id: @user.id,
      status: @user.status
    )
  end

  ....
end

现在,我只能在生产中遇到的大问题终于可以通过查看日志来了解,如下所示:

class Provider::User 

  def initialize(user)
    @user = user
  end

  def push_update
    SomeApiWrapper.call(
      user_id: @user.id,    # Some user
      status: @user.status  # NOT THE SAME USER !!! (and I have no idea where he is coming from)
    )
  end

  ....
end

2个问题:

  1. 这怎么可能呢? 它是否来自Provider :: User本质上是一个可全局访问的对象,因此,从线程到线程,一切都混杂在一个变异汤中!

  2. 如果我仅使用“函数式”样式,没有任何实例,将参数和输出从静态方法传递到静态方法,这是否可以解决我的问题,还是我完全错了? 我怎样才能解决这个问题?

最终,是否有任何方法可以对这种类型的代码进行真正的测试,以确保不会混淆用户数据?

好的...原来这是一个虚拟数据问题。 我只是花了2个小时试图用复杂的解释来解决问题,但是答案很简单,就是在我的数据库中。 做得好 :-/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM