Ruby on rails 3 如何在Rails实例和Sidekiq实例之间共享对象

Ruby on rails 3 如何在Rails实例和Sidekiq实例之间共享对象,ruby-on-rails-3,sidekiq,Ruby On Rails 3,Sidekiq,我有一个侦听器(使用gem)对象,我正在将它添加到初始值设定项中的常量中: LISTENER = Listen.to(REPORT, ERROR, SENT) do |modified, added, removed| listener.ignore! /\.swp/ listener.ignore /\.DS_Store/ Communicator.notify(added) end 我在这个功能周围放置了一个小的管理界面,并在视图中显示侦听器的状态 在部署中,我有一个实用程序实

我有一个侦听器(使用gem)对象,我正在将它添加到初始值设定项中的常量中:

LISTENER = Listen.to(REPORT, ERROR, SENT) do |modified, added, removed|
  listener.ignore! /\.swp/
  listener.ignore /\.DS_Store/
  Communicator.notify(added)
end
我在这个功能周围放置了一个小的管理界面,并在视图中显示侦听器的状态

在部署中,我有一个实用程序实例,所有后台作业都在其中运行。我可能有一个或多个应用服务器同时运行,所以我只希望此侦听器侦听实用程序实例。Sidekiq是我的后台处理器。因此,在我的管理界面中,我招募了一个简单的Sidekiq工作人员来启动这个侦听器

当我获得侦听器的状态时,它说它没有运行。但过程是存在的。这当然是因为应用服务器正试图从应用服务器上的常量获取侦听器状态


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

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


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

似乎要使用分布式Ruby:

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

Rails 4.2已经实现,是一篇很好的博客文章,概述了ActiveJob,并介绍了如何使用GlobalID。(您可以分析活动对象!OMG部分)


我知道这是一篇老文章,但我只是偶然发现了它,并认为这个答案可能会对某人有所帮助。

虽然听起来它会起作用,但对于我想做的这件事来说,听起来似乎有些过分了。应该有办法利用现有的
Redis
配置来共享该对象。我必须弄清楚如何将Ruby对象序列化和反序列化到Redis商店。为了这件小事,我尽量避开数据库。