我有一个函数doWork(id)
,我正在使用AWS SQS卸载到一些工作服务器。可以非常频繁地调用此函数,但我想限制函数,以便对于给定的id,每秒的工作量不会超过一次。
是否可以使用AWS /是否有任何具有此功能的服务?
编辑:一些澄清。
doWork(id)
对数据库中的记录执行一些昂贵的工作。只要用户与记录交互,这项工作就需要不断更新。因此,每当用户调用编辑记录的方法时,我都会调用doWork(id)
。但是,用户可以非常快速地编辑记录很多次(我正在构建一个文本编辑器,因此每个字符都是一个编辑)。而不是doWork(id)
不必要的次数,我想要限制这项工作,以便每秒最多发生一次。
因为这项工作很昂贵,所以我在SQS中排队了一条消息,并且有一组“工作”服务器使任务出列并运行它们。
我的目标是在限制doWork(id)
时以某种方式维护服务器的无状态水平可伸缩性。为了使问题更复杂一点,我不想限制doWork
函数本身 - 我想限制传递给doWork
的id所标识的每个单独记录的工作。
答案 0 :(得分:0)
您可以在ElastiCache上使用Redis实例,并将您的工作人员配置为使用distributed rate limiter基于id
的密钥。基于这种想法可以为您的员工准备好运行,还有许多不同语言的软件包。
答案 1 :(得分:0)
这很有意思。如果他们在给定时间段内遇到另一个密钥,您希望延迟工作。如果他们在那段时间内没有按下另一把钥匙,那么你就想做这项工作。即使他们继续输入(自动保存),您也可能希望在x秒后执行此操作。
问题是每个按键都会向队列发送一条消息。当工作人员收到消息时,他们不知道自发送消息以来是否按下了另一个密钥,并且无法在队列中查找其他匹配消息。
亚马逊SQS确实能够延迟消息,这意味着它在一段时间内无法接收,但仅凭这一点无法解决问题,因为工作人员不会#39;不知道还发生了什么。
底线:传统队列不适合此用例。你需要类似于数据库/缓存的东西,它可以更新"最后修改过的"每次按下一个键时的时间戳。一旦该时间戳超过 x 秒,您就应该对该工作人员进行排队。