将批次发送到Web API

时间:2016-01-26 18:58:00

标签: node.js mongodb

我在expressJS上有一个mongodb和NodeJS设置。这个API基本上做的是存储电子邮件地址和有关用户的其他信息。

这些称为角色,存储在MongoDB数据库中。我现在要做的就是在我的应用程序中调用一个url,它将所有角色都发送到Mailchimp API。

但是,由于存储的角色数量很高(144.000),我无法将它们一批发送到Mailchimp API。我想要做的就是分批发送,没有太多运气。

我该如何设置呢?目前我正在使用Async包来限制同时发送到Mailchimp API。但我不确定这是否是正确的方法。

我想下面的代码不起作用,因为我收集的角色数组太大而无法放入内存中。但是我不确定如何以正确的方式对其进行分块。

//This is a model function which searches the database to collect all personas
Persona.getAllSubscriptions(function(err, personas) {
    //Loop send each persona to mailchimp
    var i = 1;
    //This is the async module I'm using to limit the simultaneous requests to Mailchimp
    async.forEachLimit(personas, 10, function (persona, callback) {
      //This is the function to send one item to mailchimp
      mailchimpHelper.sendToMailchimp(persona, mailchimpMergefields, function(err,body){
        if(err) {
          callback(err);
        } else if(!body) {
          callback(new Error("No response from Mailchimp")); 
        } else {
          console.log(i);
          i++;
          callback();   
        }
      });
    }, function(err) {
      if (err) console.log(err);
      //Set a success message
      res.json({error: false, message: "All personas updated"});
    });
});

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,对一个可以返回超过170,000个文档的集合进行查询。我最终使用“stream”API来构建要处理的批次。您可以执行类似“构建”批处理的操作以发送到MailChimp。

这是一个例子。

var stream = db.collection.find().stream(); //be sure find is returning a cursor
var batch = []
this.stream.on('data', function(data){
    batch.push(data);
    if(batch.length >= maxBatchSize){
        stream.pause();
        // send batch to mail chimp 
    }
});
this.stream.on('pause', function(){
     // send batch to mailChimp
     // when mailChimp has finished
     stream.resume();
});
this.stream.on('end', ()=>{
    // data finished
});

您可以查看游标和流here

的文档

希望这有帮助。

干杯。

答案 1 :(得分:1)

似乎有一些我不会像你描述的那样做的事情。您正在尝试在节点服务器内进行相当繁重的处理。如果你没有保护它,url的触发器可能会给你带来很多问题。

此外,这是一个繁重的过程,最好将其作为与服务器分离的队列工作者方法来实现。这将使您可以更好地控制该过程,某些电子邮件发送可能会失败,或者在mailchimp端可能会发生错误(API已关闭等)。因此,不是触发直接发送,而是像@jackfrster描述的那样触发工作人员和处理电子邮件。

确保您已检查过Mailchimp API限制。您是否考虑过制作广告系列等广告系列并发送广告系列,以便您无需为列表中的每个人发送广告?