[英]AWS - Sending 1000's of emails from Lambda / Node.js
我有一個由SNS觸發的“主要” Lambda函數。 它從數據庫中提取一個收件人列表,它需要根據模板向每個收件人發送一條消息,以替換名字等之類的信息。
設置的方式是我創建了另一個名為“電子郵件發送”的Lambda函數,該函數已訂閱“電子郵件發送”主題。 然后,“主” Lambda遍歷收件人列表,並將消息發布到具有適當有效負載(從,到主題,消息)的“電子郵件發送”。 最終可能需要單批處理1000封電子郵件。
這是滿足我要求的好方法嗎? 也許Lambda / SNS不是要走的路? 如果是這樣,您會推薦什么。
使用此設置,當我的“主要”功能完成運行並且以某種方式在循環中未觸發“ sns.publish”時,我遇到了問題。 我想是因為我沒有讓它結束。 但是我不確定如何解決它,這是一個循環。
這是我的Lambda函數的代碼段:
exports.handler = (event, context, callback) => {
// code is here to pull data into "data" array
// process records
for (var i = 0; i < data.length; i++) {
var sns = new aws.SNS();
sns.publish({
Message: JSON.stringify({ from: data[i].from, to: data[i].to, subject: subject, body: body }),
TopicArn: 'arn:aws:sns:us-west-2:XXXXXXXX:email-send'
}, function(err, data) {
if (err) {
console.log(err.stack);
} else {
console.log('SNS pushed!');
}
});
}
context.succeed("success");
};
感謝您的協助。
我認為更好的方法是使用AWS Lambda API。
這樣,您就不需要SNS。
例如:
var lambda = new AWS.Lambda({region: AWS_REGION});
function invokeWorkerLambda(task, callback) {
var params = {
FunctionName: WORKER_LAMBDA_NAME,
InvocationType: 'Event',
Payload: JSON.stringify({.....})
};
lambda.invoke(params, function(err, data) {
if (err) {
console.error(err, err.stack);
callback(err);
} else {
callback(null, data);
}
});
}
如您所見,lambda函數的調用不需要SNS。
重要提示:另一個建議是創建一個調用數組( functions
),然后按如下所示執行它們:
async.parallel(invocations, function(err) {
if (err) {
console.error(err, err.stack);
callback(err);
}
});
看看這個鏈接,我在其中獲得了很多有關Lambda調用的知識: https : //cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/
您的代碼正在執行此操作...
sns.publish()
1000次 context.succeed()
) 您沒有等待那1000個電話結束!
您的代碼應該做的是...
sns.publish()
1000次 sns.publish()
所有調用后,請return
。 ( context.succeed
很舊,因此我們應該使用callback()
代替)。 像這樣
// Instantiate the client only once instead of data.length times
const sns = new aws.SNS();
exports.handler = (event, context, callback) => {
const snsCalls = []
for (var i = 0; i < data.length; i++) {
snsCalls.push(sns.publish({
Message: JSON.stringify({
from: data[i].from,
to: data[i].to,
subject: subject,
body: body
}),
TopicArn: 'arn:aws:sns:us-west-2:XXXXXXXX:email-send'
}).promise();
}
return Promise.all(snsCalls)
.then(() => callback(null, 'Success'))
.catch(err => callback(err));
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.