Tag: amazon sqs

队列与非阻塞I / O

所以,我们正在devise一个新的微服务架构。 内部沟通是最大的挑战之一。 对于需要响应的通信,我们使用REST API。 但对于只想传递信息的服务,这个API处理是不必要的开销。 一种方法是使用队列。 service1将信息推入队列,service2可以从那里消耗。 因此,service1不必等待(不像API调用)。 (如果在处理信息时有任何错误,service2可以通过callbackURL通知service1,或者以其他方式通知;这点不是问题[1]) 现在有了Queue,有两个选项,一个是RabbitMQ 。 另一个是AWS SQS 。 有了RabbitMQ,我不得不担心服务器设置和一切(可以完成,但是要避免它)。 所以在SQS的POC之后,这似乎是一个不错的select,但SQS在内部使用Rest API与AWS服务器进行通信,在这两个时间点(service1在推送时,service2在消费时)都会有开销。 所以现在我想为什么不在NodeJS中做,service1将打到service2的信息。 Service2将立即作出回应,确认它已收到信息,如果有任何错误[1]。 现在我可以总结的优点/缺点是 – 的RabbitMQ 易于实施 如果接收方不可用,发送方不必担心重试。 服务器设置成本+维护(+调整) SQS 最容易实施 价钱 对消息进行持续轮询 在推/收上的开销 非阻塞API 没有第三个媒体需要沟通 Service1必须pipe理重试机制 相对于SQS,更less的开销 信息将在内存中处理 所以到了某种程度,我的问题是,使用非阻塞API是否是个好主意? 或者在制度可扩展性方面哪一个更好。 编辑 – 像PubNub或Pusher的PubSub提供程序可以用来代替队列吗?

通过Amazon SQS将压缩文本从PHP发送到NodeJS

我似乎被卡在通过Amazon SQS将压缩的消息从PHP发送到NodeJS。 在PHP方面我有: $SQS->sendMessage(Array( 'QueueUrl' => $queueUrl, 'MessageBody' => 'article', 'MessageAttributes' => Array( 'json' => Array( 'BinaryValue' => bzcompress(json_encode(Array('type'=>'article','data'=>$vijest))), 'DataType' => 'Binary' ) ) )); 注1:我也尝试将压缩数据直接放在消息中,但是库给了我一些错误,包含一些无效的字节数据 在节点方面,我有: body = decodeBzip(message.MessageAttributes.json.BinaryValue); 其中消息来自sqs.receiveMessage()调用,并且该部分工作,因为它为原始(未压缩的消息) 我得到的是TypeError:不正确的格式 我也试过使用: PHP – 节点 gzcompress() – zlib.inflateraw() gzdeflate() – zlib.inflate() gzencode() – zlib.gunzip() 而每一对都给了我他们的版本相同的错误(本质上,input数据是错误的) 鉴于所有我开始怀疑在消息传输的某个地方的错误 我究竟做错了什么? 编辑1 :似乎错误是在传输中的某处,因为PHP中的bin2hex()和.toString('hex')在节点返回完全不同的值。 似乎PHP中的Amazon SQS API使用base64传输BinaryAttribute,但Node无法对其进行解码。 我设法通过closures在amazon awsconfiguration文件中的自动转换,然后在节点中手动解码base64,但它仍然无法解码它部分解码。 […]

AWS SQS:当消费者发生错误时,转移到死信队列

我已经尝试使用npm软件包,如sqs-queue-parallel&sqs-consumer来消费节点中的SQS消息 但是最近我有一个机制,当处理时一个特定的消息发生错误时,它应该被移到死信队列中 但是到目前为止,它仍然以最大接收次数重试消息 是否有可能与其他一些npm包,每当发生错误,应该直接移动到死信队列?

使用Node轮询Amazon SQS队列的最有效方法

我的问题很简短,但我觉得很有趣: 我有一个来自Amazon SQS服务的队列,我每秒轮询一次队列。 当有消息处理消息并处理后,返回轮询队列。 有没有更好的办法吗?,某种触发器? 或者你认为哪种方法最好,为什么。 谢谢!

我如何让nodejs服务器监听AWS SQS?

在详细解释问题之前,我先告诉你我目前的做法。 我有一个运行setInterval()的js脚本。 和每个间隔,我将调用SQS从队列中获取消息。 如果有消息,我就处理它。 所以,它会无限地运行,直到我杀了这个过程。 我之前也build立了一个节点服务器(使用nodejs.org中的例子) 所以,我想知道的是,而不是定期运行setInterval。 有没有办法,如果SQS中有一条新消息,那么它会触发一个事件并处理消息?

Nodejs sqs队列处理器

我正在尝试编写一个nodejs sqs队列处理器。 "use strict"; var appConf = require('./config/appConf'); var AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/aws_config.json'); var sqs = new AWS.SQS(); var exec = require('child_process').exec; function readMessage() { sqs.receiveMessage({ "QueueUrl": appConf.sqs_distribution_url, "MaxNumberOfMessages": 1, "VisibilityTimeout": 30, "WaitTimeSeconds": 20 }, function (err, data) { var sqs_message_body; if (data.Messages) { if (typeof data.Messages[0] !== 'undefined' && typeof data.Messages[0].Body !== 'undefined') { […]

在使用Amazon SQS完成Lambdafunction时通知浏览器客户端

在我的情况下,我试图实现运行相当耗时的计算的服务器less后端。 这个计算是由Lambdapipe理的,它引用了一些外部的API。 在oder要求这个我使用的Amazon API网关有10秒的执行限制。 但是Lambda运行大约100秒。 为避免这种限制,我使用第二个Lambda函数来执行耗时的计算并报告计算已经开始。 我看起来非常相似: var AWS = require('aws-sdk'); var colors = require('colors'); var functionName = 'really-long' var lambda = new AWS.Lambda({apiVersion: '2015-03-31'}); var params = { FunctionName: functionName, InvocationType: 'Event' }; lambda.invoke(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(functionName.green + " was successfully executed and returned:\n" […]