【问题标题】:Should I have a heroku worker dyno for poll a AWS SQS?我应该有一个 heroku 工作人员 dyno 来轮询 AWS SQS 吗?
【发布时间】:2012-11-28 16:08:41
【问题描述】:

我不知道应该在哪里有一个脚本来轮询 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

我需要帮助!!谢谢

【问题讨论】:

  • 我想我的答案将取决于您对队列的操作。及时处理消息对您来说有多重要?收到消息后,您会执行什么处理?
  • 我已经更新了问题

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


【解决方案1】:

您有三个基本选择:

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

【讨论】:

  • 不错的答案!第一个选项似乎是正确的,但对我来说支付它有点贵。第三个选项我在没有调度程序的情况下尝试过一次,但是一次性进程保持活动状态 1 分钟就消失了。
  • 再次感谢您的回答。最后一个疑问:如果我想听多个队列,我可以把它放在一个工人中,对吗?
  • 当然。 ReceiveMessage 当然只能从一个队列接收,但是如果你是单线程的并且选择了 drain-the-queue-and-exit 策略,没有什么可以阻止你顺序处理多个队列。
  • 不太明白这个策略。您的意思是在它将池化的队列之间切换吗?
  • Heroku 按秒计费,所以如果你总共运行 1% 的时间,它会是
猜你喜欢
  • 2019-04-22
  • 2023-03-09
  • 2014-08-23
  • 2021-02-20
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多