如何在Rails实例和Sidekiq实例之间共享对象

时间:2014-01-22 14:35:33

标签: ruby-on-rails-3 sidekiq

我有一个监听器(使用Listen gem)对象,我将其添加到初始化程序中的常量中:

LISTENER = Listen.to(REPORT, ERROR, SENT) do |modified, added, removed|
  listener.ignore! /\.swp/
  listener.ignore /\.DS_Store/
  Communicator.notify(added)
end

我在这个功能周围放了一个小管理界面,我在视图中显示了监听器的状态。

在我的部署中,我有一个Utility实例,其中运行所有后台作业。我可能有一个或多个app服务器一次旋转,所以我只希望这个监听器监听Utility实例。 Sidekiq是我的后台处理器。因此,在我的管理界面中,我要求一个简单的Sidekiq工作者来启动这个监听器。

当我获得监听器的状态时,它表示它没有运行。但这个过程就在那里。这当然是因为App服务器试图从应用程序服务器上的常量中获取侦听器状态!

如何在Sidekiq服务器上获取对象的状态?

3 个答案:

答案 0 :(得分:1)

Sidekiq和Application Server不共享内存。甚至应用程序服务器实例也不共享内存。您必须使用数据库来共享sidekiq和您的应用程序之间的信息。

从sidekiq进程向数据库添加侦听器的状态。读取应用程序服务器请求中的数据库值。

答案 1 :(得分:1)

Rails 4.2实现了GlobalIDhere是一篇很好的博客文章,概述了ActiveJob,它涵盖了使用GlobalID。 (你可以解析实时对象!OMG部分)

我知道这是一篇很老的帖子,但我刚碰到它并认为这个答案可能有助于某人。

答案 2 :(得分:0)

似乎您想使用Distributed Ruby:http://www.ruby-doc.org/stdlib-2.1.0/libdoc/drb/rdoc/DRb.html

  

dRuby允许在一个Ruby进程中对位于另一个Ruby进程中的Ruby对象调用方法,即使在另一台机器上也是如此。可以在进程之间传递对象的引用。方法参数和返回值以编组格式转储和加载。所有这些都是对远程方法的调用者和调用它的对象透明地完成的。