0

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

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

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

我有第二个 lambda 函数(我们称之为 Courier)订阅了发件箱,它应该接收每条消息并对其进行处理。

生成器代码:

// '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 是否能够处理针对某个主题的大量小而频繁的消息...?

4

1 回答 1

1

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

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

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

于 2015-05-15T17:41:48.580 回答