【问题标题】:How to limit the consuming rate from a topic?如何限制一个主题的消费率?
【发布时间】:2017-03-20 03:11:42
【问题描述】:

其他人解决了以下问题吗?
我的 SNS 主题 充满了来自 S3 的事件,并且有一个订阅了该主题的 Lambda 函数,并且当有数千个事件被放入此主题,由于超出并发限制,lambda 函数被限制。
我不想请求增加并发执行的限制,但我会减少主题的并发消耗,但我没有找到如何做的信息它。谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-sns aws-lambda


    【解决方案1】:

    关于 SNS 的几个选项:

    1) SNS 最大接收率

    设置SNS Maximum Receive Rate。这将限制发送给订阅者的 SNS 消息,但如果您有太多消息,以至于在处理它们之前它们将被丢弃,则可能不是一个好选择。来自文档:

    您可以设置 Amazon SNS 每秒发送的最大消息数 通过设置最大接收速率发送到订阅的端点 环境。 Amazon SNS 保存等待传送的消息 到一个小时。保留超过一小时的消息将被丢弃。

    如果您一次只接收数千个事件,将最大接收速率设置为 Lambda 的 default concurrent execution limit 的“100”可能值得一试。

    正如@kndrk 所指出的,此限制目前仅适用于 SNS 主题的 HTTP/HTTPS 订阅者。要解决此问题,您可以expose your lambda function via AWS API Gateway 并将该端点订阅到 SNS 主题,而不是直接订阅 lambda 函数。

    2) 来自 SQS 的流程

    Subscribe an SQS queue to the SNS topic 并处理来自队列的消息,而不是直接来自 sns 主题。单次调用 SQS ReceiveMessage 一次只能处理 10 条消息,这样可能更容易控制。


    另外值得注意的是,你可以发布S3 Events directly to AWS Lambda

    【讨论】:

    • 感谢您的快速回答。我在 lambda 被 S3 触发时尝试了该解决方案,但出现了同样的问题,因此我决定尝试组合 S3->sns->lambda。我将尝试您的第一个选项,它可能适合我。 P.S. 我想立即处理来自 S3 的事件,因为在大多数情况下负载不是那么高,但如果我理解正确的话,lambda 不能被来自 SQS 的事件触发。唯一的方法是安排执行 lambda 函数以从 SQS 消费
    • 这是正确的——对于 SQS,您实际上是按计划从 lambda 轮询 SQS RecieveMessage,而不是将其插入特定触发器。从您的评论中听起来,SNS 最大接收率非常适合您的用例。希望它对你有用!
    • 不幸的是,这只适用于 HTTP(s) 端点。 Lambda 订阅者根本没有受到限制。
    • 谢谢@knrdk!最初并没有遵循,但我重新阅读,这是一个很好的观点!认为我们可以通过 API 网关端点解决这个问题,我已经用解决方法更新了答案。
    • 是的,它适用于 API Gateway 端点,所以这就是我们最终要做的。
    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多