我对在Rails应用程序中应该在哪里轮询Aws Sqs的脚本感到困惑。
如果我在Web应用程序内使用线程,则可能会使用cpu周期永久监听此队列,从而影响性能。
如果我保留一个Heroku worker dyno,则每月需要花费$ 34.50。为单个队列轮询支付此价格是否合理?还是不是雇用一个 worker 呢?
脚本代码:
queue = AWS::SQS::Queue.new(SQSADDR['my_queue'])
queue.poll do |msg|
...
id = received_message['document_id']
@document = Document.find(id)
@document.converted_at = Time.now
...
end
我需要帮助!!谢谢
最佳答案
您有三个基本选项:
fork
将一个子进程进行后台处理。无论发生什么情况,请记住dyno消耗的512 MB RAM限制,并且由于我假设您只有一个Web dyno,因此请注意dyno idling意味着您的应用可能未全天候运行24x7。另外,此选项的气味很差,因为它通常与12-factor app的精神背道而驰。 rake handle_sqs
任务,该任务处理队列并在队列为空时退出。 Heroku Scheduler是理想的:让它每20分钟运行一次或类似的操作。只要运行一次,您就需要为一次性的dyno付费,但是如果队列为空,那么这仅需几秒钟,因此它的成本低于始终在线的工作人员。或者,您的Web应用程序可以使用Heroku API以编程方式运行等效的heroku run rake handle_sqs
来启动一次性流程。