我是否应该使用heroku worker dyno来调查AWS SQS?

时间:2012-11-28 16:08:42

标签: ruby-on-rails heroku amazon-web-services amazon-sqs

我很困惑我应该在哪里有一个脚本在Rails应用程序中轮询Aws Sqs。

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

如果我保留一个单独的heroku工作者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

我需要帮助!!感谢

1 个答案:

答案 0 :(得分:4)

您有三个基本选项:

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