perform_in 在用户量不大的时候,可能没啥问题,但是由于商品竞拍这种性质,火热商品有可能在一段时间内造成大量的竞拍事件,这样大量的事件堆积在 sidekiq 队列中,终究不是啥好事情,很有可能会影响整个 sidekiq job 的响应时间。即使有逻辑从队列中祛除已经无用的 perform_in,也是一个很繁琐的事情,频繁操作,也会导致各种一致性和响应速度的问题。
为啥不换个想法?为什么每一次竞拍都需要 perform_in?从你的需求上能了解到,你关心的只是这个商品最后的竞拍人,和这个竞拍人竞拍的商品的过期时间。
所以很简单,只要有一个周期性的 Job,统一处理这些已经过期的商品,并生成对应的处理 job。没过期的就让他继续 active,在竞拍时候做个判断,是否是已经到了到期时间,顺便在前端展示时候,给个过期提示之类的。
这样就可以保证,每次生成的 job 一定是可用的,而且不会产生冗余的事件。
好突然
/^[\w\n]+(?=\d{4}-\d{2})/
用原生的的方法的话,取到你需要的类的模块和类常量,比如: ::Path1::Path2::Path3::Klass.new.send(method_name, args_arr)
如果拆分开来:
klass = ::Path1::Path2::Path3::Klass #取到类常量
instance = klass.send(:new, args_if_needed) #对应 java 的 new instance
instance.send(method_name, args)# 对应 invke
没有像 java 那么繁琐,而且 send 是可以调用私有方法的,不需要 像 java 一样 setAccessible