首页 > 解决方案 > 如何在我现有的 nodejs 服务器上使用 sqs 消息

问题描述

我想在 SQS 收到新消息时接收并触发电子邮件,现在我已经运行了 nodejs 服务器,我怎样才能让它工作?我真的不想触发那个功能。但我希望当 SQS 中有新消息时,这个消费者将消费并执行发送电子邮件的业务逻辑。

但我的职能没有得到任何触发。注意:我没有调用这个函数,我希望它在 SQS 有新消息时自动触发。

const AWS = require('aws-sdk');
const mongoose = require('mongoose');

//
// Configure the aws details
//
AWS.config.update({
    region: process.env['AWS_REGION'],
    accessKeyId: process.env['AWS_ACCESS_KEY_ID'],
    secretAccessKey: process.env['AWS_SECRET_ACCESS_KEY']
  });


const sqs = new AWS.SQS({apiVersion: '2012-11-05'});

var queueURL = "https://sqs.us-east-1.amazonaws.com/xxxxx/demo-lambda-to-email-sqs"



var params = {
    AttributeNames: [
        "SentTimestamp"
     ],
    MaxNumberOfMessages: 1,
    MessageAttributeNames: [
       "All"
    ],
    QueueUrl: queueURL,
    VisibilityTimeout: 20,
    WaitTimeSeconds: 0
   };

   sqs.receiveMessage(params, function(err, data) {
    if (err) {
      console.log("Receive Error", err);
    } else if (data.Messages) {
      console.log('--------------------------- MESSAGE RECEIVED -------------')
      var deleteParams = {
        QueueUrl: queueURL,
        ReceiptHandle: data.Messages[0].ReceiptHandle
      };
      sqs.deleteMessage(deleteParams, function(err, data) {
        if (err) {
          console.log("Delete Error", err);
        } else {
          console.log("Message Deleted", data);
        }
      });
    }
  });

标签: javascriptnode.jsamazon-web-servicesamazon-sqs

解决方案


SQS 是一种排队服务,因此需要通过基于拉的机制而不是基于推的机制来使用它。

仅当您具有轮询 SQS 队列的功能时才能调用此函数,然后在消息进入时触发该函数。

如果您不想维护使用者脚本,则应考虑将此脚本迁移到 Lambda 函数中。使用此选项时,Lambda 服务将充当队列的消费者,并仅在添加消息时触发 Lambda 函数。

文档中提供了有关将 AWS Lambda 与 SQS 队列结合使用的更多信息。


推荐阅读