【发布时间】:2020-06-22 04:51:24
【问题描述】:
我有一个 SQS 队列,每次消息到达队列时都会触发一个 lambda。
该消息包含有关产品的信息,我们将其称为 A。执行 lambda 时,它将产品 A 的数据插入 RDS。
但是,另一条消息将在大约 30 秒后到达,其中包含有关产品 A 的其他信息,这将再次将数据插入 RDS。
是否有任何方法可以在 SQS 触发 lambda 上设置一些延迟? 另外,产品 A 收到的新消息是否可以处理而旧消息是否被丢弃?我想使用 SQS 消息重复数据删除,以便使用为产品接收到的每条消息都是唯一的,但我不确定它是否适合此用例?
另一个解决方案是将 SQS 替换为“自定义队列”,通过将 SQS 替换为 RDS aurora 实例,lambda 将在实例上执行 cron 并选择具有过期 TTL 的产品以便插入DB,但我觉得这有点矫枉过正,还有其他方法可以做到这一点吗?
谢谢
【问题讨论】:
-
你对消息的生产者有控制权吗?您可以为每条消息指定延迟。 p.s.
SQS message deduplication仅适用于 FIFO 队列。 -
是的producer是一个lambda函数,每次producer在SQS中插入数据都需要重置延迟,并且旧消息必须被删除或丢弃
-
您能解释一下为什么进行两次插入/更新对您来说不可行吗?我了解到您想等待 30 秒,以免进行两次数据库写入,对吗?
-
因为数据库接收到大量写入,这会影响写入的延迟。这些写入大部分是无用的,因为产品 A 的信息会在短时间内(1 分钟)多次放入 SQS 队列,这将触发 lambda 多次在数据库中重新插入数据。我们的想法是等待一段时间,以便只有最新的数据被放入数据库中,这将减少写入次数。
-
@Tar,如果你使用event source mapping 用于sqs,则有
maximum-batching-window-in-secondsparameter。该参数设置“调用函数之前收集记录的最长时间,以秒为单位”。也许这可以研究一下?
标签: amazon-web-services aws-lambda amazon-rds amazon-sqs