在rails web app中,如果我将消息写入像rabbitmq这样的队列,当生产者向队列发送消息时,客户端将如何得到通知?
我猜我必须创建一个在后台运行的单独进程才能正确响应消息?即此代码超出了Web应用程序的范围。
如果是这种情况,是否可以重新使用rails应用程序中的models / libs?我必须在2个地方复制此代码吗?
答案 0 :(得分:5)
您的应用程序看起来需要通常称为后台或工作人员的流程。对于任何中等复杂的Web应用程序,这是一个相当普遍的要求。
我猜我必须创建一个在后台运行的单独进程来响应正确的消息?
是的 - 你是对的。虽然完全可以使用线程来处理后台任务(在您的情况下,从RabbitMQ中读取和处理消息),但Rails应用程序的标准和推荐路由是运行单独的后台进程。
如果是这种情况,是否可以重新使用rails应用程序中的模型/库?
绝对。最简单的方法是使用Rails'built in runner command。
另一种选择是创建一个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 }
如果您的需求变得更加复杂,或者您发现需要运行多个后台进程以跟上需要处理的数据量,您可能需要查看其中一个many available libraries and frameworks这对此有帮助。
创建后台进程后,在将其部署到生产服务器时,需要一种方法来连续运行它。虽然可以像ctcherry所建议的那样使用像daemons这样的库,但我建议使用像upstart这样的专用工具(如果部署到ubuntu)或runit。最受欢迎的选项的一个很好的总结是available here。
答案 1 :(得分:0)
你是对的,你需要一个后台程序。如果你愿意的话,你可以将该进程的代码保存在Rails项目的lib
文件夹中,我之前没有遇到过问题,并且将相关的代码保存在一起,这很好。
我使用这个库来创建我的长时间运行过程,这非常简单:
为了重用rails应用程序中的模型,您可以在require
文件上运行config/environment.rb
以获取所有内容。 (首先将RAILS_ENV设置为环境变量以选择正确的环境)从那时起,脚本的行为就像您在rails控制台会话中一样。