【问题标题】:SQS deduplication ID and item updatesSQS 重复数据删除 ID 和项目更新
【发布时间】: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-seconds parameter。该参数设置“调用函数之前收集记录的最长时间,以秒为单位”。也许这可以研究一下?

标签: amazon-web-services aws-lambda amazon-rds amazon-sqs


【解决方案1】:

基于 cmets,该问题的部分解决方案是在 Lambda 和 SQS 之间设置一个event source mapping

在理想情况下,生产者应该在这种情况下进行修改。但是,由于无法修改生产者,因此可以实施缓存解决方案(例如 ElastiCache),以在将“不完整”的 sqs 消息写入 RDS 之前存储它们并过滤掉重复消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2018-01-13
    • 2022-06-12
    相关资源
    最近更新 更多