Rails 3 I / O进出后台进程

时间:2013-04-10 18:37:30

标签: ruby-on-rails ruby io

短版本:我需要从Rails控制器(使用Rails 3)启动子进程(Ruby脚本),并将子进程中的stdout消息呈现给网页,从Rails视图将信息传递到子进程。

设置:我有一个Ruby脚本,它与名为Ivy的软件消息传递总线系统进行通信,使用R​​uby 1.9.3向一些运行的硬件发送控制消息并从中接收消息我网络上的其他地方。我不能在这里使用替代消息系统,它必须是常春藤。该脚本当前将消息写入stdout

问题1:我想从Rails应用程序的控制器启动此脚本作为子进程(或线程,我愿意接受建议)。我希望能够从此脚本接收消息,以便它们可以显示在网页上。不需要将这些消息持久存储在数据库中,因此我考虑使用Rails缓存临时存储和访问消息,并且可能使用AJAX在一个间隔内轮询缓存以查找新消息。这可能吗?

问题2:同样的Rails应用程序需要能够从网页发送控制消息(例如,通过用户与按钮交互,下拉或其他一些UI元素)到常春藤子进程使这些控制消息可以传播到硬件。

我已经研究过SidekiqDelayed Job等其他可能的解决方案,但我无法通过浏览文档找到这些潜在解决方案可以解决问题1和问题2的确凿证据。所以,我的问题如下:

  1. 像Sidekiq或DelayedJob这样的现成解决方案可以处理这项任务吗?
  2. Rails中是否已经有一些方法可以实现这个目的?
  3. 这个问题与观点有关,但无论如何我都会问。我有其他理由去追求Rails,但如果这项任务非常困难,他们可能会胜过。使用Rails做这样的事情是一种痛苦,我应该考虑其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

听起来有三个问题:

  1. 监控ivybus的消息
  2. 通过ivybus发送命令
  3. 用户互动(网络界面)
  4. Rails框架只解决了3号问题。这就是它的设计目标。但是,这并不意味着Ruby / Rails不是这项工作的好工具。以下是我对此进行设置的一些想法:

    关注1绝对应该在某种背景工作中发生。它不应该是标准Web请求的一部分。我认为关注2在后台工作中也会更好。在可能的情况下,任何容易出错或可能长时间运行的任务都应该远离Web请求。

    有几种方法可以将这些任务放到后台。 Sidekiq是关注2(发送命令)的完美解决方案。控制器将接收来自用户的请求以执行某些动作,并且控制器向后台工作人员提交作业以执行该操作。 Sidekiq也可以解决问题1(监控),但您必须创建定期作业(如轮询)以继续检查接口是否有新消息。 Sidekiq并不打算运行无限期运行的工作。

    解决问题1最强大的方法是创建一个守护进程。这可能看起来有些过分,但像“守护进程”这样的宝石使这个任务非常简单。该守护进程可以监视接口并将您关心的数据推送到某种数据存储区(MySQL,Redis等)。

    您可以使用这些后台处理解决方案中的一个或两个来解决此问题,但我绝对认为您需要一个单独的流程来管理至少第一个问题。这将使关注3(您的Web应用程序)仅处理从数据存储区读取数据并为用户呈现数据,并将某些请求(命令)转换为后台作业。这可以让你的Rails应用程序做到最好,但仍然可以让你做你需要的一切。

答案 1 :(得分:0)

Rails(大部分)都很好。

Sidekiq,或者Resque,是进行常春藤投票的好方法。您可以安排工作人员定期轮询新消息。

虽然Rails 4可以直播,但它还没有为黄金时间做好准备。我建议使用类似Node.js / Socket.io设置的东西通过WebSockets与客户端浏览器通信。或者,如果不需要花哨的实时更新,并且客户端的数量很少,那么让工作人员将结果转储到数据库中并让浏览器轮询更新。

但是,常春藤是一个棘手的问题。我没有看到很多关于从Ruby / Rails应用程序与Ivy交谈的内容。也许您可以使用JRUby然后使用其中一个Java包装器。

由于你没有与Rails超级结合,因此在Python或Perl中这样做可能更容易,因为常春藤人已经使用这些语言编写了工具。