AWS SQS消息发生了什么?

时间:2020-06-17 13:30:44

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

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

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

Lambda 2(SQS队列的触发Lambda): (批处理大小10,未定义并发 打印从队列接收的号码。 (能够在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函数何时仅打印消息(这意味着执行没有延迟),我们看到即使批量大小设置为10,SQS一次仅传递一条消息。但是,如果存在延迟(time.sleep(5)),那么对于某些lambda调用,我们看到SQS传递了一条消息,2条消息,7条消息。与Lambda集成时,SQS批处理大小如何正确工作。 (添加了Lambda2代码以供参考)

2 个答案:

答案 0 :(得分:0)

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

可以共享您的代码吗?您是否在objectRecords元素中遍历整个邮件列表?

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

答案 1 :(得分:0)

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