【问题标题】:Throttled Queue Service限流队列服务
【发布时间】:2018-03-06 20:49:27
【问题描述】:

我有一个函数 doWork(id),我正在使用 AWS SQS 将其卸载到一些工作服务器。此函数可能会被非常频繁地调用,但我想限制该函数,以便对于给定的 id,工作不超过每秒一次。

AWS 是否有可能/是否有任何具有此功能的服务?


编辑:一些澄清。

doWork(id) 在数据库中的记录上做了一些昂贵的工作。每当用户与记录交互时,这项工作需要不断更新。因此,每当用户调用编辑记录的方法时,我都会调用doWork(id)。但是,用户可能会非常快速地多次编辑记录(我正在构建一个文本编辑器,因此每个字符都是一个编辑)。而不是doWork(id) 不必要的次数,我想限制这项工作,使其每秒最多发生一次。

因为这项工作很昂贵,所以我在 SQS 中将消息排入队列,并有一组“工作”服务器将任务出列并运行它们。

我的目标是在限制doWork(id) 的同时以某种方式保持服务器的无状态水平可扩展性。让事情变得更复杂一些,我不想限制 doWork 函数本身——我想限制传递给 doWork 的 id 标识的每个单独记录的工作。

【问题讨论】:

  • 很遗憾,您的解释不是很清楚。您能否编辑您的问题以澄清 DoWork、SQS 和您的员工之间的关系?无论如何,不​​管怎样,SQS 中没有任何功能会根据消息的内容而有所不同。它很简单“存储消息,检索消息”。
  • 哦@JohnRotenstein,这说明了吗?谢谢

标签: amazon-web-services message-queue


【解决方案1】:

您可以在 ElastiCache 上使用 Redis 实例,并将您的工作人员配置为基于 id 为密钥使用 distributed rate limiter。基于这种想法,还有许多适用于不同语言的包,它们可能已准备好在您的工作人员上运行。

【讨论】:

    【解决方案2】:

    这很有趣。您想延迟工作,以防他们在给定的时间段内击中另一个键。如果他们在那个时间段内没有按下另一个键,那么你就想做这项工作。即使他们继续输入(自动保存),您也可能希望在 x 秒后执行此操作。

    问题是每次按键都会向队列发送一条消息。当工作人员收到消息时,他们不知道自消息发送后是否按下了另一个键,也无法在队列中查找其他匹配的消息。

    Amazon SQS 确实具有延迟消息的能力,这意味着它在给定的时间段内无法接收,但仅此一项并不能解决问题,因为工作人员不知道还发生了什么。

    底线:传统队列不适合这种用例。您需要类似于数据库/缓存的东西,可以在每次按下键时更新“上次修改”时间戳。一旦该时间戳超过 x 秒,您应该将工作人员排队。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      相关资源
      最近更新 更多