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

Luc*_*cas 5 ruby-on-rails heroku amazon-sqs amazon-web-services

我很困惑,我应该在哪里有一个脚本轮询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
Run Code Online (Sandbox Code Playgroud)

我需要帮助!!谢谢

wil*_*ynn 4

您有三个基本选择:

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