我正在构建一个由亚马逊服务提供支持的警报系统。
我每天将一个文件放到 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 是否能够处理针对某个主题的大量小而频繁的消息...?