6

我对我应该在哪里有一个脚本来轮询 Rails 应用程序中的 Aws Sqs 感到困惑。

如果我在 web 应用程序中使用线程,它可能会使用 cpu 周期来永远监听这个队列,然后影响性能。

如果我预订一个 heroku worker dyno,则每月花费 34.50 美元。为单个队列轮询支付这个价格是否有意义?或者它不是使用工人的情况?

脚本代码:

它的作用:收听转换后的 pdf。获取响应并将对象创建到 postgres 数据库中。

  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

我需要帮助!!谢谢

4

1 回答 1

4

您有三个基本选项:

  1. 作为工人测功机的一部分进行后台工作。这是最简单、最直接的选择,因为它是最合适的。您的 Web 进程处理传入的 HTTP 请求,而您的工作进程处理 SQS 消息。完毕。
  2. 将后台工作作为 Web dyno 的一部分。这可能意味着启动另一个线程(并处理可能在 Rails 中引起的问题),或者可能意味着fork创建一个子进程来进行后台处理。无论发生什么,请记住测功机消耗的 512 MB RAM 限制,并且由于我假设您只有一个网络测功机,请注意测功机空闲意味着您的应用程序可能不是 24x7 运行。此外,这个选项闻起来很糟糕,因为它通常与12-factor app的精神背道而驰。
  3. 将后台工作作为一次性流程进行。例如,制作一个rake handle_sqs处理队列并在它为空时退出的任务。Heroku Scheduler是理想的:让它每 20 分钟运行一次。只要它运行,你就会为一次性的测功机付费,但是如果队列是空的,这只是几秒钟的时间,它的成本低于一个永远在线的工作人员。或者,您的 Web 应用程序可以使用 Heroku API 启动一次性进程,以编程方式运行等效的heroku run rake handle_sqs.
于 2012-11-28T16:22:59.237 回答