【问题标题】:Is there a way to add timer between messages in AWS SQS?有没有办法在 AWS SQS 中的消息之间添加计时器?
【发布时间】:2021-03-30 16:07:59
【问题描述】:

我正在开发一个使用来自客户的 SMTP 服务器的电子邮件客户端。我将凭证存储在 AWS RDS 数据库中。客户可以创建邮件营销活动,并且必须在营销活动创建后异步发送电子邮件。

我想配置一个 SQS 队列以使消息可用,每条消息之间有 2 分钟的延迟。目的是将消息发送到能够通过 SMTP 发送消息的 Lambda 函数(使用数据库中的凭证)。由于消息之间的延迟,我可以优化电子邮件的传递。交货顺序并不重要。

不幸的是,我找不到这样做的方法。 SQS 中可用的计时器适用于整个队列,或者必须针对每条消息。就我而言,如果我在 SQS 队列中放入 100 条消息,我需要立即发送第一条,2 分钟后发送第二条,依此类推。

有人对此问题有解决方案吗?如果 SQS 不是满足这一需求的合适服务,AWS 平台上是否还有其他可用的服务?

【问题讨论】:

  • Lambda + SQS 支持批处理:aws.amazon.com/about-aws/whats-new/2020/11/…
  • 我不想批处理。相反,我想每 2 分钟从 SQS 拉一条消息
  • 您可以通过 cloudwatch 安排一个触发器,该触发器基本上会触发一个 lambda,然后手动从 SQS 接收一条消息。除此之外(并部署您自己的应用程序并自己编写所有逻辑)您真的没有任何选择。
  • Amazon SQS 不会在消息之间设置延迟。您应该将此延迟构建到您的消费者代码中(以便它仅在给定的时间间隔内消费记录)。

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


【解决方案1】:

我们大概可以实现lambda event source mapping config 的 sqs 和 lambda reserved concurrency 设置的这种组合。

  • 事件源映射Batch大小:1

    这将只允许一次向 Lambda 发送 1 条消息。

  • 事件源映射批处理窗口:2 分钟

    这将允许每 2 分钟调用一次 lambda。

  • Lambda 保留并发为 1

    这将只允许一次调用一个 lambda 线程。

【讨论】:

  • 显然不能这样配置事件源映射批处理窗口。我们只能配置 MaximumBatchingWindowInSeconds 但这在这里没有帮助。
  • MaximumBatchingWindowInSeconds 最长可达 5 分钟,对吧?如果我们设置 2 分钟,lambda 不会在 2 分钟内被多次调用?
  • 不,更像是:如果您为最大批处理窗口选择 10 和 2 分钟的批处理大小,Lambda 将等待 10 条消息或 2 分钟。如果 2 分钟内只有 8 条消息,则 Lambda 启动该函数。
  • @TheoMartinez 谢谢。出于某种原因,我认为它是一个和。今天晚些时候我也会测试一下。
【解决方案2】:

感谢 @luk2302 的回答,对于 AWS 支持团队来说,这是一个很好的回答。使用 EventBridge 服务在定义的时间触发 lambda 效果很好。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多