SQS消息始终是无服务器中的一条消息

时间:2019-05-09 16:42:54

标签: amazon-web-services aws-lambda aws-sdk amazon-sqs serverless-framework

我正在使用无服务器API,并且有一个从sqs队列触发的lambda函数,批处理大小为1,这意味着我打算在将消息发送到队列后立即触发lambda,它是工作正常,但是当我第一次部署该功能时,它不会触发;当我第二次请求该功能时,它正在发送第一条消息,它始终是我发送的消息之后的一条消息。我已经附加了我的代码,不确定我在这里缺少什么,感谢您的帮助。

serverless.yml

iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "sqs:SendMessage"
      - "sqs:ReceiveMessage"
    Resource: "arn:aws:sqs:${self:provider.region}:*:EmailQueueDev"

functions:
   sendGrid:
      handler: handler.sendGrid
      events:
        - sqs: 
            arn: arn:aws:sqs:us-east-1:${file(./config.js):sqs.account_id}:EmailQueueDev
            batchSize: 1
resources:
 Resources:
   EmailQueue:
     Type: "AWS::SQS::Queue"
     Properties:
       QueueName: "EmailQueueDev"

代码

module.exports.sendEmail = async (event) => {

  // Trigger the SQS for SendGrid Function To Execute
  const sqs = new aws.SQS();
  const params = {
    MessageBody: JSON.stringify(transaction.data),
    QueueUrl: process.env.QUE_URL
  }

  sqs.sendMessage(params, (err, data) => {
    if(err) {
      log(JSON.stringify({info: 'Errors sending message to the Queue', trace: err}));
    }
    else console.log('data is', data);
  });

};

1 个答案:

答案 0 :(得分:1)

“ batchSize”参数指示每次函数调用要处理的最大消息数,并且不影响lambda函数何时触发。当您将SQS定义为事件源时,AWS创建了5个并行的长轮询连接,当它在队列中接收到某些内容时,它将触发您的功能。发送第一条消息后,您要等待多长时间才能查看它是否触发了该功能?在队列中接收消息和触发函数之间可能会有一个小的延迟。