Bla*_*man 1 ruby-on-rails rabbitmq
在rails web app中,如果我将消息写入像rabbitmq这样的队列,那么当生产者向队列发送消息时,客户端将如何得到通知?
我猜我必须创建一个在后台运行的单独进程来响应消息是否正确?即此代码超出了Web应用程序的范围.
如果是这种情况,是否可以重新使用rails应用程序中的模型/库?我必须在2个地方复制此代码吗?
看起来您的应用程序需要通常称为后台或工作进程的内容.对于任何中等复杂的Web应用程序,这是一个相当普遍的要求.
我猜我必须创建一个在后台运行的单独进程来响应消息是否正确?
是的 - 你是对的.虽然完全可以使用线程来处理后台任务(在您的情况下,从RabbitMQ中读取和处理消息),但Rails应用程序的标准和推荐路由是运行单独的后台进程.
如果是这种情况,是否可以重新使用rails应用程序中的模型/库?
绝对.最简单的方法是使用Rails 内置的runner命令.
另一种选择是创建一个ruby脚本来加载你的Rails应用程序.例如,您可以my_script.rb在项目的根目录中创建文件,该文件可能如下所示:
# Load my application:
require File.join(File.dirname(__FILE__), 'config/environment.rb')
# Now you can access your Rails environment as normal:
MyModel.all.each { |x| x.do_something }
Run Code Online (Sandbox Code Playgroud)
如果你的需求变得越来越复杂,或者你发现你需要运行不止一个后台进程更跟上你需要处理的数据量,你可能想看看在一个许多可用的库和框架,可以帮助有了这个.
创建后台进程后,在将其部署到生产服务器时,需要一种方法来连续运行它.虽然像ctcherry所建议的那样可以使用像守护进程这样的库,但我建议使用像upstart这样的专用工具(如果部署到ubuntu)或runit.这里提供了最受欢迎的选项的完美摘要.