ruby-on-rails - ruby 进程间通信有哪些可用的消息解决方案?

标签 ruby-on-rails ruby delayed-job interprocess

我有一个使用 delayed_job 的 Rails 应用程序。我需要我的工作相互沟通,例如“任务 5 已完成”或“这是任务 5 需要处理的事情列表”。

现在我有一个专门用于此的特殊表,我总是在事务中访问该表。它工作正常。我想为它构建一个更干净的 api/dsl,但首先想检查是否已经有现有的解决方案。奇怪的是,我没有找到任何东西,我要么谷歌搜索完全错误,要么任务太简单(在交易中设置和获取值)以至于还没有人将其抽象出来。

我错过了什么吗?

澄清:我不是在寻找新的排队系统,我是在寻找一种后台任务相互通信的方式。基本上只是安全地共享变量。以下框架是否提供此功能?很遗憾延迟工作没有。

用例:“并行执行这 5 个任务,然后在它们全部完成后,执行这 1 个最后的任务。”因此,5 个任务中的每一个都会检查它是否是最后一个任务,如果是,它会触发最后一个任务。

最佳答案

我使用 resque .还有很多plugins ,这应该使进程间通信更容易。

使用 Redis 还有另一个优势:您可以使用发布-订阅 channel 在工作人员/服务之间进行通信。

另一种方法(但未经我测试):http://www.zeromq.org/ , 其中还有 ruby bindings .如果你喜欢测试新东西,那就试试 zeromq。


更新

澄清/解释/扩展我上面的评论:

为什么我应该从 DelayedJobs 切换到 Resque 是我提到的优势,我在一个系统中有队列和消息,因为 Redis 提供了这个。

更多来源:

如果我必须留在 DJ 上,我会用 rediszeromq/0mq 扩展工作类(此处仅提供示例)以获得我现有后台作业中的消息传递。

不会尝试使用ActiveRecord/MySQL 进行消息传递(实际上什至不排队!)因为这个数据库不是性能最好的系统对于此用例,尤其是当应用程序在短时间内有太多后台工作人员和庞大的队列以及无数的消息交换时。

如果它是一个工作人员较少的小型应用程序,您也可以通过数据库实现简单的消息传递,但在这里我更喜欢内存缓存;消息是短暂的数据 block ,只能在内存中处理。

共享变量永远不是一个好的解决方案。想想您的应用程序和您的工作人员可以在其中运行的多台机器。您将如何确保它们之间的保存变量传输?

好吧,有人可能会提到 DRb(分布式 ruby​​),但它似乎不再真正被使用了。 (到目前为止从未见过真实世界的例子)

但是,如果您想使用 DRb,请阅读 this short introduction .

我个人的偏好顺序:消息传递(真实)> 数据库驱动的消息传递> 变量共享

关于ruby-on-rails - ruby 进程间通信有哪些可用的消息解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286000/

相关文章:

ruby-on-rails - rails,在设置新对象时传入参数

jquery - 带有 Rails 的 format.js

mysql - 制作新的 Rails 应用程序时出错

ruby-on-rails - Rails4 - 测试 - URLGenerationError : No route matches

ruby-on-rails - 当我尝试访问 URL : localhost:3000 时,Rails 日志在 Puma 的终端中没有显示任何内容

python - 如何使 Ruby 或 Python 网站使用多核?

ruby - 逐步迭代字符数组

ruby-on-rails - rails 上的 ruby : delayed_job does not execute function from module

ruby-on-rails - Rails 4.2 从事件作业中获取延迟的作业 ID

ruby-on-rails - 如何在 Kubernetes 中运行delayed_jobs?