0

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

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

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

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

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

  1. 像 Sidekiq 或 DelayedJob 这样的现成解决方案可以处理这个任务吗?
  2. Rails 中是否已经内置了某种方法可以实现这一点?
  3. 这个问题接近于意见,但无论如何我都会问。我有其他理由追求 Rails,但如果这项任务非常困难,他们可能会被击败。使用 Rails 做这样的事情会很痛苦,我应该研究替代解决方案吗?
4

2 回答 2

1

听起来有3个问题:

  1. 监控 ivybus 的消息
  2. 通过 ivybus 发送命令
  3. 用户交互(网络界面)

Rails 框架只解决了第 3 个问题。这就是它的全部设计目的。然而,这并不意味着 Ruby/Rails 不是完成这项工作的好工具。以下是我对设置的一些想法:

问题 1 肯定应该发生在某种后台工作中。它不应该是标准 Web 请求的一部分。我认为关注点 2 在后台工作中也能更好地工作。任何容易出错或可能长时间运行的任务都应该尽可能远离 Web 请求。

有几种方法可以让这些任务进入后台。Sidekiq 是关注点 2(发送命令)的完美解决方案。控制器会收到用户的请求来做一些动作,控制器会向后台工作人员提交一个作业来做这件事。Sidekiq 也可以解决问题 1(监控),但您必须创建定期作业(如轮询)才能继续检查接口是否有新消息。Sidekiq 并不意味着运行将无限期运行的作业。

解决问题 1 最可靠的方法是创建一个守护进程。这可能看起来有点矫枉过正,但像“守护进程”这样的宝石使这成为一项非常容易的任务。该守护进程可以监控接口并将您关心的数据推送到某种数据存储(MySQL、Redis 等)中。

您可以使用这些后台解决方案中的一个或两个来解决这个问题,但我绝对认为您需要一个单独的过程来管理至少第一个问题。这将允许关注点 3(您的 Web 应用程序)仅处理从数据存储读取数据并将其呈现给用户,并将某些请求(命令)转换为后台作业。这可以让您的 Rails 应用程序做它最擅长的事情,但仍然可以让您做任何您需要的事情。

于 2013-04-11T04:12:50.720 回答
0

Rails(大部分)很好。

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

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

但是,常春藤是症结所在。我没有看到太多关于从 Ruby/Rails 应用程序与 Ivy 交谈的内容。也许您可以使用 JRUby,然后使用 Java 包装器之一。

由于您不是超级嫁给 Rails,因此在 Python 或 Perl 中执行此操作可能会更容易,因为 Ivy 人已经拥有用这些语言编写的工具。

于 2013-04-10T19:16:16.660 回答