Rails - 将数据从后台作业传递到主线程

时间:2014-03-18 15:49:33

标签: ruby-on-rails multithreading communication

我在我的应用程序中使用后台作业系统(Sidekiq)来管理一些不应阻止UI的繁重工作。

我希望在作业完成时将数据从后台作业传输到主线程,例如作业的状态或作业完成的数据。

此时我使用Redis作为主线程和后台作业之间的中间件。它存储后台作业的数据,状态,...,以便主线程可以读取它背后发生的事情。

我的问题是:在预定作业和主线程之间管理数据(使用Redis或键值缓存)这是一个很好的做法吗?还有其他手续吗?哪个最好,为什么?

2 个答案:

答案 0 :(得分:3)

Redis pub/sub是您正在寻找的东西。 您只需在通道上使用subscribe命令订阅主线程,其中worker将使用publish命令宣告作业状态。 由于您已经在环境中使用了Redis,因此您无需启动其他任何操作。

答案 1 :(得分:1)

以下是我过去使用的其他两个选项:

  • Unix套接字。这非常繁琐,创建和关闭连接是一件麻烦事,但确实有效。还涉及清理套接字和与文件系统交互的问题。不建议。
  • 标准RDBMS。这很容易实现,并且对我的用例有意义,因为繁重的作业与特定模型相关联,因此进程的状态可以存储在该表的列中。这也意味着您只需要在一致性方面担心一家商店。

我使用过memcached,它和Redis做同样的事情,here's如果你感兴趣的话,可以讨论比较它们的功能。我发现这很好用。

如果Redis为你工作,那么我会坚持下去。据我所知,这是解决这个问题的合理方法。唯一可能导致问题的是生成唯一键(可能不那么难),并确保清除未使用的缓存条目。