【问题标题】:AWS Lambda subscribed to SNS topic doesn't process all messages to the topic订阅 SNS 主题的 AWS Lambda 不会处理该主题的所有消息
【发布时间】:2015-07-27 07:10:03
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的提示 - 我已经看到为每条消息打印了多个日志 - 没有问题。问题仍然存在,但我通过将文件输出为 S3 对象并使用 S3 的事件系统触发另一个 Lambda 函数来解决它。
    • 想知道存储桶事件与 SNS 是否解决了您的问题。我一直在测试一些场景,批量上传到一个存储桶并将压缩的 lambda 函数结果移动到另一个存储桶。通常情况下,有 1 到 5 个文件在最后一行上传,最终在未处理的初始上传存储桶中被隔离。它们似乎是调用错误,但我不太确定会导致问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2017-07-08
    • 2018-02-27
    • 2020-08-08
    相关资源
    最近更新 更多