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



我有一个侦听器(使用侦听宝石)对象,我将其添加到初始化器中的常数:

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

我在此功能周围放了一个admin接口,然后在视图中显示侦听器的状态。

在部署中,我有一个实用实例,我所有的后台作业都运行。我可能一次有1个或许多应用程序服务器旋转,因此我只希望该侦听器在实用程序实例上收听。Sidekiq是我的背景处理器。因此,在我的管理界面中,我招募了一个简单的sidekiq工人来旋转此听众。

当我获得听众的状态时,它说它没有运行。但是这个过程在那里。当然,这是因为应用程序服务器正在尝试从应用程序服务器上的常数获取侦听器状态!

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

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

我知道这是一个古老的帖子,但我只是遇到它,以为这个答案可能会对某人有所帮助。

sidekiq和应用程序服务器没有共享内存。即使是应用程序服务器实例也不共享内存。您将必须使用数据库在Sidekiq和您的应用程序之间共享信息。

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

似乎您想使用分布式ruby:http://www.ruby-doc.org/stdlib-2.1.0/libdoc/drb/rdoc/rdoc/rdoc/rdoc/rdoc/rdoc/rdoc/drb.html./P>

Druby允许在一个Ruby过程中以一个Ruby对象(即使在另一台计算机上)在一个Ruby过程中调用方法。可以在过程之间传递对对象的引用。方法参数和返回值以编组格式倾倒和加载。所有这些都是透明地完成远程方法的呼叫者和所调用的对象。

最新更新