在AWS lambda上执行大量并发函数(例如广播推送通知)

时间:2016-07-09 05:41:40

标签: javascript amazon-web-services apple-push-notifications aws-lambda

我有一个AWS lambda函数,可以将push发送到这样的设备:

var push = function(payload, ctx){
  var apn = require('apn'); 
  var connection = new apn.Connection(options);
  var token = "(MY TOKEN HERE)";
  var device = new apn.Device(token);

  var note = new apn.Notification();
  note.expiry = Math.floor(Date.now() / 1000) + 3600;
  note.badge = 3;
  note.sound = "ding.wav";
  note.alert = "Hello";
  note.payload = payload;
  connection.on('transmitted', function(){
    ctx.succeed({ "response": "OK" })
  });
  connection.pushNotification(note, device);
}

现在我想扩展它,以便我可以向一组设备发送广播推送。

起初我认为将它们全部置于for循环中会很简单,但是第二次认为它不起作用,因为ctx.succeed部分在发送完所有推送之前不应该返回。此外,如果我等到所有推送都已发送,那么请求将花费太长时间甚至可能超时。

执行大量并发请求的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您需要查看Async library for NodeJS。这在NodeJS中很常见,而不仅仅是在AWS Lambda函数中。在Lambda中,您将使用它来执行许多异步任务,并等待所有异步调用完成后再调用ctx.succeed()

对于一百万个电话,您仍然需要批量调用。我认为您应该考虑将所有这些任务添加为Kinesis stream中的项目,然后可以将这些任务的批量发送到您的Lambda函数。它可以配置为启动Lambda函数的许多并发实例,每个实例处理一个批处理。