我想从不断填充的队列中检索所有当前可用的文档。我从 Amazon 的 SQS(简单队列服务)中提取,每个请求异步返回 0 到 10 行,其中可能包括先前提取的重复项。
每个唯一的文档都可以并行异步处理,独立于任何其他文档,因此即使有额外的异步查找,这部分对我来说在概念上也很简单。我遇到麻烦的地方是提取正确数量的记录以处理整个批次。
假设我查看并看到队列中有 100 个文档。如果我只执行 10 次提取,我可能最终会得到 100 个文档中的 50 个……或者如果我非常幸运的话,可能会得到全部 100 个。如果我一次获取 1,我会遇到基本相同的问题——我可能会得到 0 或 1 或一个欺骗(它请求循环到服务器集群)。如果让每个 async fetcher 更新一个公共计数器,它可能会在第一个请求甚至知道要计算多少个唯一文档之前产生数百个请求。如何确定何时停止从队列中获取额外的记录组?
这是失败代码的提炼版本:
libutil.countOffers(function(err, data) {
processEvents(~~data.Attributes.ApproximateNumberOfMessages);
});
function processEvents(count) {
while (count > 0) {
libutil.receiveOffers(10, function(err, offers) {
if (offers && offers.Messages) {
count-=offers.Messages.length;
// ^ Broken because async receiveOffers runs hundreds of
// times before count is incremented the first time.
}
});
}
}
libutil.countOffers(function(err, data) {
processEvents(~~data.Attributes.ApproximateNumberOfMessages);
});
function processEvents(count) {
libutil.receiveOffers(10, function(err, offers) {
if (offers && offers.Messages) {
count-=offers.Messages.length;
if(count > 0){
processEvents(count)
}
}
});
}
您的 while 循环不会等待异步回调中的计数增加。所以使用递归函数或承诺。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句