这基本上总结为:
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是我“收集邮件的东西”
有时,我的脚本停滞不前,因为我根本没有获得对Amazon的响应,例如队列中没有消息要消耗,而不是点击WaitTimeSeconds并发送“no messages object”,回调是’n’叫.
(我正在写这个亚马逊古怪)
我问的是什么是检测和处理这个的最佳方法,因为我有一些代码来阻止对receiveMessage的并发调用.
这里建议的答案:Nodejs sqs queue processor还有防止并发消息请求查询的代码(授予它一次只获取一条消息)
我确实把整件事包裹起来
var running = false; runMonitorJob = setInterval(function() { if (running) { } else { running = true; // call SQS.receive } }, 500);
(删除循环后没有running = false(不在它的回调中))
我的解决方案是
watchdogTimeout = setTimeout(function() { running = false; }, 30000);
但是,这肯定会留下一堆浮动的sqs.receive潜伏着,因而随着时间的推移会有很多记忆?
(这个工作一直在运行,我让它在星期五运行,它在星期六早上停滞不前,直到我今天早上手动重新启动工作)
编辑:我已经看到它挂起约5分钟然后突然得到消息的情况但是等待时间为20秒它应该在20秒后抛出“无消息”.因此,约10分钟的WatchDog可能更实用(取决于业务逻辑的其余部分)
编辑:是长轮询已配置队列端.
编辑:这是在aws-sdk的最新版本v2.3.9和NodeJS v4.4.4之下
我一直在追逐这个(或类似的)问题几天,这就是我注意到的:>尽管仅在120秒之后,receiveMessage调用最终会返回
>对AWS.SDK库序列化对receiveMessage的并发调用,因此并行进行多次调用无效.
> receiveMessage回调没有错误 – 实际上在120秒过后,它可能包含消息.
关于这个还能做什么?这种事情可能由于多种原因而发生,并且这些事情中的一些/许多不一定能够被修复.答案是运行多个服务,每个服务调用receiveMessage并在消息到来时处理消息–SQS支持这一点.在任何时候,这些服务中的一个可能会达到120秒的延迟,但其他服务应该能够正常继续.
我特别的问题是我有一些关键的单件服务,无法承受120秒的停机时间.为此,我将研究1)使用HTTP而不是SQS将消息推送到我的服务中,或者2)在每个单例周围产生从属进程以从SQS获取消息并将它们推送到服务中.