我认为这里的主要问题是您需要另一种消息传递解决方案(类似 IPC,而不是 IM),而不是试图弯曲“只是”一个队列的 Resque。其中一些选项是amqp gem(AMQP 协议)或zmq gem(ZeroMQ 协议),但您也可以通过 Ruby 标准库 Socket 类(很好的示例)使用普通的旧 UNIX 套接字。它们都有不同的优点和缺点,所以这取决于你和你的需求。
交互可能如下所示:
- 机器人启动。
- Bot 开始侦听 IPC 消息。
- Bot 接收来自发件人的查询(通过 XMPP)。
- Bot 通过 Resque 对作业进行排队。
- Job 通过 HTTP 调用 Rails 应用程序。
- Rails 应用程序完成了它的工作。
- 某人或某事解决了任何查询并通过 Rails 应用程序输入结果。
- Rails 应用程序使用某种 IPC 方法将结果发送到机器人。
- Bot 将结果发送给原始发件人(通过 XMPP)。
可以像往常一样进行一些更改。例如,我认为您根本不需要 Resque。机器人可以简单地将请求立即传递给 Rails 应用程序。但是,这取决于负载、您想要实现的响应时间、您当前的架构等。也许 Resque 作业可以等待 Rails 应用程序返回结果,然后该作业(而不是 Rails 应用程序)将使用 IPC。还有其他变体……</p>
我是否需要编写一个 rake 任务来启动/停止/重新加载机器人
不,你没有。如何以及何时运行它取决于您。毕竟,Rake 可以被视为将多个 Ruby 脚本放在一起并在它们之间创建依赖关系的便捷方式。如果您认为除了运行机器人之外还有其他任务(一些清理、部署等),那么为了方便起见,使用 Rake 会很好。如果您还没有,请将机器人的逻辑重构为类并使用 Rake 任务对其进行初始化。但是,如果您离开它也可以,只需按原样运行您的脚本(使用 monit、您的自定义 init.d 脚本、ad-hoc 等)。
如果我在没有 rake 的情况下运行它(假设是一个由 Monit 监控的独立进程),那么我如何与 Resque 交互或访问我的 rails 模型?
Rake 对此没有任何影响。从操作系统的角度来看,如果您通过 Rake 运行 Resque 并通过 Rake 运行您的机器人或作为独立脚本运行,这并不重要。无论如何,它们将是不同的过程。另外,请记住,Resque 需要 Redis 在某个地方运行。
我知道这些可能是非常琐碎的问题
一点也不。我认为需要一些时间才能将诸如此类的问题视为微不足道的问题。