[英]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个问题:
这怎么可能呢? 它是否来自Provider :: User本质上是一个可全局访问的对象,因此,从线程到线程,一切都混杂在一个变异汤中!
如果我仅使用“函数式”样式,没有任何实例,将参数和输出从静态方法传递到静态方法,这是否可以解决我的问题,还是我完全错了? 我怎样才能解决这个问题?
最终,是否有任何方法可以对这种类型的代码进行真正的测试,以确保不会混淆用户数据?
好的...原来这是一个虚拟数据问题。 我只是花了2个小时试图用复杂的解释来解决问题,但是答案很简单,就是在我的数据库中。 做得好 :-/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.