- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 aws-sdk Node 模块(据我所知)通过批准的方式来轮询消息。
基本上总结为:
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
是我的“如果收集到的消息足够多,就处理收集到的消息”函数
有时,我的脚本会停止,因为我根本没有收到亚马逊的响应,例如,队列中没有消息可供使用,而不是点击 WaitTimeSeconds 并发送“无消息对象”,未调用回调。
(我正在为 Amazon Weirdness 写这篇文章)
我要问的是检测和处理此问题的最佳方法是什么,因为我有一些代码可以停止对 receiveMessage 的并发调用。
此处建议的答案:Nodejs sqs queue processor也有防止并发消息请求查询的代码(假设它一次只获取一条消息)
我确实把所有的东西都包裹在了
var running = false;
runMonitorJob = setInterval(function() {
if (running) {
} else {
running = true;
// call SQS.receive
}
}, 500);
(在删除循环后运行 = false(不在回调中))
我的解决方案是
watchdogTimeout = setTimeout(function() {
running = false;
}, 30000);
但是随着时间的推移,这肯定会留下一堆 float 的 sqs.receive 潜伏在周围,因此会有很多内存吗?
(这个作业一直在运行,我在星期五让它运行,它在星期六早上停止并挂起,直到我今天早上手动重新启动该作业)
编辑:我见过它挂起约 5 分钟然后突然收到消息的情况但是,等待时间为 20 秒,它应该在 20 秒后抛出“无消息”。所以大约 10 分钟的 WatchDog 可能更实用(取决于其余的业务逻辑)
编辑:是的,长轮询已经配置在队列端。
编辑:这是在 aws-sdk 的(最新)v2.3.9 下和 NodeJS v4.4.4
最佳答案
几天来我一直在追寻这个(或类似的)问题,这是我注意到的:
receiveMessage 调用最终会返回,尽管仅在 120 秒后返回
对 receiveMessage 的并发调用由 AWS.SDK 库序列化,因此并行进行多个调用没有任何效果。
receiveMessage 回调不会出错 - 事实上,在 120 秒过去后,它可能包含消息。
对此可以做些什么?出于多种原因,可能会发生这种事情,其中一些/许多事情不一定能解决。答案是运行多个服务,每个服务调用 receiveMessage 并在消息到来时对其进行处理——SQS 支持这一点。在任何时候,其中一项服务可能会出现 120 秒的延迟,但其他服务应该能够继续正常运行。
我的特殊问题是我有一些关键的单例服务无法承受 120 秒的停机时间。为此,我将研究 1) 使用 HTTP 而不是 SQS 将消息推送到我的服务中,或者 2) 围绕每个单例生成从属进程以从 SQS 获取消息并将它们推送到服务中。
关于node.js - 带有 aws-sdk receiveMessage 的 Amazon SQS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37111431/
我在 lambda 中有以下代码: entries = [ { "Id": str(index), "MessageAttribut
我正在构建一个无服务器应用程序,它在资源中定义了一个 SQS 队列,如下所示: resources: Resources: TheQueue: Type: "AWS:SQS:Q
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我想知道最后一条消息何时发布到 SQS 队列。 查看队列属性(通过 CLI 或其他方式),我看不到任何合适的内容 - 只能看到队列属性最后一次修改的时间。 如果有什么技巧可以找到这个(在不了解客户的情
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我正在使用 Amazon SQS 队列向外部系统发送通知。 如果使用 SQS 时 HTTP 请求失败 SendMessage ,我不知道消息是否已排队。我的默认策略是重试将消息发布到队列,但存在两次发
来自 SNS FAQ ,我知道 SNS 到 SQS 有重试策略,但是他们是否保证至少向 SQS 传递一条消息? 请给官方报价。 最佳答案 见 https://aws.amazon.com/sqs/fa
我是否可以使用 Amazon PHP SDK 根据消息 ID 从 SQS 队列中获取消息?我是否必须获取队列中的所有消息,然后在我的服务器上对其进行过滤? 我的服务器收到一个带有队列消息 ID 的 S
我意外删除了 Amazon SQS 中的队列。有没有办法检索/撤消删除? 最佳答案 不,队列(以及队列上的任何消息)将永远消失。 如果您使用相同名称重新创建队列,它将保留相同的 ARN 和 URL。希
我的大多数 Celery 任务的 ETA 都长于 Amazon SQS 定义的最大可见性超时。 celery documentation说: This causes problems with ETA
我正在实现 SQS fifo 队列。我必须使用 cloudformation 模板来实现。 当我放大推送时,我得到 错误API:sqs:CreateQueue 对资源 https://sqs.us-e
我有一个代码,我需要将消息发送到现有的 sqs 队列。 我在 aws-cdk 中有这段代码。但这是行不通的。没有添加访问权限。 const sqsQ = sqs.Queue.fromQueueArn(
我很想了解 GCP 的 PubSub 的实现。尽管 Pubsub 似乎指向遵循发布-订阅设计模式,但它似乎比 AWS SNS(使用发布-订阅模型)更接近 AWS 的 SQS(队列)。为什么认为这是,G
序言:我正在尝试为我认为是一个非常常见的用例提出一个建议,我想使用 Amazon 的 SWF 和 SQS 来实现我的目标。可能还有其他服务可以更好地匹配我正在尝试做的事情,因此,如果您有任何建议,请随
AWS SQS 是否可以通过某种方式调用我的 REST API?基本上,一旦消息被推送到 AWS SQS,我就想听到它并执行所需的操作。我可以安排一个每秒可以提取消息的监听器,但这不是一个优化解决方案
我已配置 SQS 监听器来使用消息列表中的消息,但一次只收到一条消息,并收到错误,因为无法将 model.StudentData 转换为 java.util.ArrayList 的实例 我的代码是:-
使用 Amazon Simple Queue Service 发送消息需要多长时间? 另外,我想知道在 Amazon SQS 中一分钟内会发送多少条消息? 最佳答案 截至 2007 年,at leas
我正在使用 Amazon-SQS,我尝试从队列中检索大约数量的属性,但响应为空 我正在使用 C# 以下是代码: GetQueueAttributesRequest attReq = new GetQu
我是一名优秀的程序员,十分优秀!