带有aws-sdk的Amazon SQS receiveMessage失速

我正在使用aws-sdk节点模块(据我所知)批准的方式轮询消息。

基本上总结:

sqs.receiveMessage({ QueueUrl: queueUrl, MaxNumberOfMessages: 10, WaitTimeSeconds: 20 }, function(err, data) { if (err) { logger.fatal('Error on Message Recieve'); logger.fatal(err); } else { // all good if (undefined === data.Messages) { logger.info('No Messages Object'); } else if (data.Messages.length > 0) { logger.info('Messages Count: ' + data.Messages.length); var delete_batch = new Array(); for (var x=0;x<data.Messages.length;x++) { // process receiveMessage(data.Messages[x]); // flag to delete var pck = new Array(); pck['Id'] = data.Messages[x].MessageId; pck['ReceiptHandle'] = data.Messages[x].ReceiptHandle; delete_batch.push(pck); } if (delete_batch.length > 0) { logger.info('Calling Delete'); sqs.deleteMessageBatch({ Entries: delete_batch, QueueUrl: queueUrl }, function(err, data) { if (err) { logger.fatal('Failed to delete messages'); logger.fatal(err); } else { logger.debug('Deleted recieved ok'); } }); } } else { logger.info('No Messages Count'); } } }); 

receiveMessage是我的“如果我有足够的收集消息做收集消息的东西”function

偶尔,我的脚本停滞不前,因为我根本没有得到Amazon的响应,比如说,队列中没有消息需要消耗,而不是点击WaitTimeSeconds并发送一个“no messages object”,callbackisn'叫。

(我正在写这个亚马逊古怪)

我问的是什么是检测和处理这个最好的方法,因为我有一些代码来停止并发调用receiveMessage。

build议的答案在这里: Nodejs sqs队列处理器也有阻止并发消息请求查询的代码(授予它只能一次获取一条消息)

我把整件事情都包裹进去了

 var running = false; runMonitorJob = setInterval(function() { if (running) { } else { running = true; // call SQS.receive } }, 500); 

(在删除循环之后运行= false(不在callback中))

我的解决scheme是

 watchdogTimeout = setTimeout(function() { running = false; }, 30000); 

但是,这肯定会留下一堆漂浮的sqs.receive潜伏着的,随着时间的stream逝,这么多的记忆呢?

(这个工作一直在运行,我星期五就把它放在了上面,星期六上午停了下来,直到我今天早上手动重新开始工作)

编辑:我已经看到它挂起约5分钟的情况下,然后突然获得消息, 等待20秒的时间,20秒后应该抛出“没有消息”。 所以~10分钟的WatchDog可能更实用(取决于业务逻辑的其余部分)

编辑:是长轮询已configuration队列。

编辑:这是根据aws-sdk和NodeJS v4.4.4(最新)v2.3.9