我对在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

我需要帮助!!谢谢

最佳答案

您有三个基本选项:

  • 将背景工作作为 worker dyno的一部分进行。这是最简单,最直接的选择,因为这是最合适的选择。您的Web进程处理传入的HTTP请求,而工作进程处理SQS消息。完毕。
  • 将后台工作作为您的Web dyno的一部分。这可能意味着旋转另一个线程(并处理可能在Rails中引起的问题),或者可能意味着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来启动一次性流程。
  • 10-01 05:55