AWS Lambda订阅SNS主题并不处理该主题的所有消息

时间:2015-05-15 11:17:12

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

我正在构建一个由亚马逊服务提供支持的警报系统。

我将一个文件放到S3每天生成一个lambda函数(让它称之为Generator函数)来处理该文件。

生成器根据此文件构建警报,并将多条消息发布到SNS主题(让我们称之为发件箱) - 每个收件人的一条消息由Generator计算。

我有第二个lambda函数(让我们称之为Courier)订阅Outbox,它应该接收每条消息并对它做一些事情。

生成器代码:

// 'Generator' function

exports.handler = function (event, context) {
  console.log('Reading options from event:\n', util.inspect(event, {depth: 5}));

  var users = {};
  var userSubscriptions = {};
  var alerts = {};
  var artists = {};
  var tracks = {};

  async.waterfall([
    function downloadSubscribersFile (next) {
      // Do stuff
    },
    function downloadAndFormatActionsFile (next) {
      // Download data file and analyse
    },
    function publishAlerts (next) {
      // Now we have alerts built, we need to mail them out
      var recipients = Object.keys(alerts);

      async.each(recipients, function (recipient, callback) {
        var recipientAlert = alerts[recipient];
        console.log(util.inspect(recipientAlert, { depth: 10 }));

        if (alerts[recipient].actions.artists.length < 1) {
          return callback();
        }

        var params = {
          TopicArn: SNS_TOPIC_ARN,
          Subject: recipient,
          Message: JSON.stringify(recipientAlert)
        };

        sns.publish(params, function (err, data) {
          if (err) {
            console.log(err);
            return callback(err);
          } else {
            console.log('PUBLISHED MESSAGE: \n', util.inspect(data, { depth: 10 }));
            console.log('MESSAGE WAS: \n', util.inspect(params, { depth: 10 }));
          }

          return callback();
        })
      }, function (err) {
        if (err) return next(err);
        next(); 
      })
    }
  ], function (err) {
    if (err) {
      console.log('Error: ', err);
    } else {
      console.log('Process successful');
    }
    context.done();
  })

}

另一个功能:

// 'Courier' function

console.log('Loading function');

exports.handler = function(event, context) {
    console.log(JSON.stringify(event, null, 2));
    console.log('From SNS:', event.Records[0].Sns.Message);
    context.succeed();
};

当调用我的Generator函数时,我可以看到应该将12条消息发布到SNS主题。发布这些消息时没有记录错误,但Courier功能仅触发一次。

我想知道是否有人对此有任何类似的问题以及我是否在这里缺少某些东西。可能是我在AWS中没有正确配置的东西,但我非常有信心所有设置都应该如此。

更新:

在查看我尝试发送的消息之后,似乎SNS收到的消息似乎是有效载荷最小的消息。我想知道SNS是否能够处理很多关于主题的小而频繁的消息......?

1 个答案:

答案 0 :(得分:1)

是的,SNS可以应对单个主题的高吞吐量。但是,最大邮件大小为256KB,因此如果您的邮件大于原因,则可能是原因。

我看到您的Generator功能正在记录消息,您是否看到带有消息ID的12条记录消息?我看到你有一个变量alerts,你希望从中获得多个收件人,但我不知道你在哪里设置它。

我的建议:在发送邮件之前添加更多日志记录,以验证您认为应该发生的事情是否真的发生。