我有一个使用delayed_job的rails应用程序。我需要我的工作相互沟通,例如“任务5已完成”或“这是任务5需要处理的事项列表”。
现在我有一个特殊的表,我总是访问事务中的表。它工作正常。我想为它构建一个更干净的api / dsl,但首先要检查是否已有解决方案。奇怪的是,我没有发现任何一件事,我要么谷歌搜索完全错误,要么任务如此简单(在事务中设置并获取值),没有人将其抽象出来。
我错过了什么吗?
澄清:我不是在寻找新的排队系统,我正在寻找一种方法让后台任务相互通信。基本上只是安全地共享变量。以下框架是否提供此功能?很遗憾,延迟工作没有。
用例:“并行完成这5项任务,然后当它们全部完成时,执行以下1项最终任务。”因此,5个任务中的每个任务都会检查它是否是最后一个,如果是,它将触发最终任务。
答案 0 :(得分:3)
我使用resque。还有很多plugins,这应该使进程间通信更容易。
使用redis还有另一个好处:您可以使用pub-sub通道进行工作人员/服务之间的通信。
另一种方法(但未经我测试):http://www.zeromq.org/,也有ruby bindings。如果您想测试新内容,请尝试使用zeromq。
<强>更新强>
澄清/解释/扩展我的评论:
为什么我应该从 DelayedJobs 切换到 Resque ,这是我在一个系统中有队列和消息的优点,因为 Redis 提供了这个功能。
其他来源:
如果我必须留在 DJ ,我会使用 redis 或 zeromq / 0mq (仅限此处的示例)扩展工作类以获取在我的后台工作中发送消息。
我不尝试使用 ActiveRecord / MySQL 进行消息传递(实际上甚至不排队!),因为此数据库不是性能最佳的系统对于这个用例,特别是如果应用程序在短时间内有太多的后台工作人员和庞大的队列以及不可数量的消息交换。
如果它是一个拥有较少工人的小应用程序,你也可以通过数据库实现一个简单的消息传递,但在这里我更喜欢memcache;消息是短生存数据块,只能在内存中处理。
共享变量永远不会是一个好的解决方案。想想您的应用程序和工作人员可以使用的多台计算机。如何确保它们之间的保存变量传输?
好的,有人可以提一下 DRb (分布式红宝石),但它似乎不再使用了。 (到目前为止从未见过现实世界的例子)
如果您想玩DRb,请阅读this short introduction。
我的个人偏好顺序:消息(真实)&gt;数据库驱动的消息传递>变量共享
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以使用管道:
reader, writer = IO.pipe
fork do
loop do
payload = { name: 'Kris' }
writer.puts Marshal.dump(payload)
sleep(0.5)
end
end
loop do
begin
Timeout::timeout(1) do
puts Marshal.load(reader.gets) # => { name: 'Kris' }
end
rescue Timeout::Error
# no-op, no messages to receive
end
end
管道表示为一对,一个读者和一个作家。要进行双向通信,您需要两组管道。