限制队列服务

时间:2017-09-25 19:26:05

标签: amazon-web-services message-queue

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

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

编辑:一些澄清。

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

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

我的目标是在限制doWork(id)时以某种方式维护服务器的无状态水平可伸缩性。为了使问题更复杂一点,我不想限制doWork函数本身 - 我想限制传递给doWork的id所标识的每个单独记录的工作。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这很有意思。如果他们在给定时间段内遇到另一个密钥,您希望延迟工作。如果他们在那段时间内没有按下另一把钥匙,那么你就想做这项工作。即使他们继续输入(自动保存),您也可能希望在x秒后执行此操作。

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

亚马逊SQS确实能够延迟消息,这意味着它在一段时间内无法接收,但仅凭这一点无法解决问题,因为工作人员不会#39;不知道还发生了什么。

底线:传统队列不适合此用例。你需要类似于数据库/缓存的东西,它可以更新"最后修改过的"每次按下一个键时的时间戳。一旦该时间戳超过 x 秒,您就应该对该工作人员进行排队。