【问题标题】:Whats happening to AWS SQS messages?AWS SQS 消息发生了什么?
【发布时间】:2020-10-07 08:17:02
【问题描述】:

我是 AWS SQS 服务的新手,了解 lambda 函数的 SQS 触发器的行为。我用两个 lambda 函数编写了一个简单的用例。我为此使用了标准 SQS,因为消息的顺序并不重要。

Lambda 1(逻辑): 在 SQS 队列中写入 1 到 50 作为 50 条不同的消息。

Lambda 2(SQS 队列的触发 lambda): (批量大小 10,concurreny undefied 打印从队列中收到的号码。 (可以在 cloudwatch 日志中看到)

 def lambda_handler(event, context):
    # TODO implement
    print (event)
    print("*")
    print(json.loads(event['Records'][0]['body'])['search_query'])
    time.sleep(5)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    } 

场景 1: 当我只将 5-10 条消息写入队列时,所有消息都会被接收并在 lambda 中处理(在 cloudwatch 日志中验证)。

场景 2: 当我将 50 条消息写入队列时: 在队列监控中,它显示所有消息都已收到。 (没有可用或飞行状态的消息)。而当我去查看 cloudwatch 日志时,只调用了 14 个 lambda 实例,它们处理了 14 条消息并在 cloudwatch 日志中打印了详细信息。

注意:为了双重验证,我对 Lambda 2 进行了更改以将消息写入 DynamoDB,它也只有 14 条消息详细信息。

谁能知道这些消息发生了什么。

编辑1:并发为1时,50条消息全部被lambda函数处理。

编辑 2:感谢您的建议,我们发现问题在于我们阅读邮件的方式。 json.loads(event['Records'][0]['body'])

我们的假设是与批量大小无关,SQS 只会向 lambda 发送一条消息。

在进行了几次测试后,我们发现 lambda 函数何时只打印消息(意味着执行没有延迟),我们看到 SQS 一次只传递一条消息,即使批量大小设置为 10 . 但是,当有延迟(time.sleep(5))时,我们看到 SQS 为某些 lambda 调用传递了 1 条消息、2 条消息、7 条消息。与 Lambda 集成时,SQS 批量大小如何准确工作。 (添加 Lambda2 代码供参考)

【问题讨论】:

  • 这 14 个 lambdas 是每个只收到一个,还是每个都收到一批 > 1 条消息?
  • @mattfreake 来自 cloudwatch 日志我可以说每个 lambda 只收到一条消息。我还将批量大小设置为 1 并对其进行了测试,行为是相同的。只有一些消息得到处理。如果你想让我测试任何场景,我很乐意测试它并与你分享结果。
  • 根据SQS-Lambda scaling works 的方式,调用 14 个 lambda "instances" 是正常的。您是否打开了每个 CW 日志流以检查多个事件是否集中在一个事件下?对于 DynamoDB 测试,批量大小是否设置为 1?
  • 如果您共享 lambda 2 的最小版本,这可能是最简单的,它会重现问题并显示您如何检查 lambda 是否只收到一条消息(最简单的日志记录,而不是我猜是 DynamoDB)

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


【解决方案1】:

根据the documentation,如果您将批量大小设置为 10,但您的 SQS 队列中的消息少于 1,000 条,那么您在调用中接收整批 10 条消息的可能性较小。有关更多信息,请参阅 Amazon SQS API 参考中的ReceiveMessage

【讨论】:

    【解决方案2】:

    我认为正在发生的事情是 Lambda2 没有处理整个批次,而只是处理一条消息。

    你能分享你的代码吗?您是否遍历了 objectRecords 元素中的整个消息列表?

    这很奇怪,因为您声明当并发设置为 1 时,它可以工作 - 但绝对不建议将 SQS 的 lambda 并发设置为小于 5 :(。您是指并发还是批量大小?

    【讨论】:

    • 感谢您的建议,我们现在解决了这个问题。我们确实有一个问题。我们在问题中包含的 sqs 行为(在编辑下)。希望您能对此有所了解。
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多