Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么AWS SQS这么慢?_Javascript_Node.js_Amazon Web Services_Amazon Sqs - Fatal编程技术网

Javascript 为什么AWS SQS这么慢?

Javascript 为什么AWS SQS这么慢?,javascript,node.js,amazon-web-services,amazon-sqs,Javascript,Node.js,Amazon Web Services,Amazon Sqs,我一直在测试从SQS队列发送消息和接收消息所需的时间。平均需要800-1200毫秒,这似乎是一个可笑的长时间。这是我的测试代码,如果我做错了,请告诉我 var t0; sendMessage('hello'); function sendMessage(message){ var params = { MessageBody: message, QueueUrl: queueUrl }; t0 = now(); sqs.send

我一直在测试从SQS队列发送消息和接收消息所需的时间。平均需要800-1200毫秒,这似乎是一个可笑的长时间。这是我的测试代码,如果我做错了,请告诉我

var t0;
sendMessage('hello');

function sendMessage(message){

    var params = {
        MessageBody: message,
        QueueUrl: queueUrl
    };
    t0 = now();
    sqs.sendMessage(params, function(err,data){
        if(err){
            throw err;
        } else {
            console.log("Message Send Confirmation");
        }
    });
    unbatch();
}

async function unbatch(){

    var params = {
        QueueUrl: queueUrl,
        MaxNumberOfMessages: 10
    };
    var go = true;
    while(go){
        console.log("Polling...");
        sqs.receiveMessage(params, function(err, data){
            if(data.Messages){
                console.log("Message Received");
                console.log("Total Time: " + ((now() - t0)/1000));
                go = false;
                var deleteParams = {
                    QueueUrl: queueUrl,
                    ReceiptHandle: data.Messages[0].ReceiptHandle
                };
                sqs.deleteMessage(deleteParams, function(err, data) {
                    if (err) {
                        console.log("Delete Error", err);
                    } else {
                        console.log("Message Deleted");
                    }
                });
            }
        });
        await sleep(1);
    }
}

function sleep(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

它发送消息并立即开始尝试每毫秒接收一条消息。一旦收到,它就会计算时间。这不应该花费更少的时间吗?

您使用任何队列的原因不是为了性能,而是为了弹性

队列解决了许多问题,它们在断开连接的系统之间提供异步通信,允许您很好地扩展系统,并提供增强的恢复能力,确保消息在系统故障时不会“丢失”

当使用队列时,您应该考虑围绕“代码”的概念设计系统。最终一致性这意味着您的消息最终会到达并被处理,但可能不是在您期望的时候,或者是按预期的顺序。

速度、排序、重试等功能在队列实现(SQS、Kafka、RabbitMq等)之间会有所不同


如果您正在寻找超高IOPS,那么队列可能不是您想要的。

使用任何队列的原因都不是为了性能,而是为了弹性

队列解决了许多问题,它们在断开连接的系统之间提供异步通信,允许您很好地扩展系统,并提供增强的恢复能力,确保消息在系统故障时不会“丢失”

当使用队列时,您应该考虑围绕“代码”的概念设计系统。最终一致性这意味着您的消息最终会到达并被处理,但可能不是在您期望的时候,或者是按预期的顺序。

速度、排序、重试等功能在队列实现(SQS、Kafka、RabbitMq等)之间会有所不同


如果您正在寻找超高IOPS,那么队列可能不是您想要的。

我编写了一个“队列排水器”工具,它从SQS读取数据并将数据存储在MySQL数据库中。。。它有一些内置的聪明之处,比如在获取下一批时异步删除上一批,但它仍然可以进行一些优化,而且我忘记了具体的数字。。。但我几乎可以肯定它每秒可以消耗近200条消息。。。所以,您的时间看起来确实有点短,当然,如果队列中有10条消息,而只有1条,您的trx/sec会有显著的提高。你在哪里运行这个代码?在EC2中,与队列位于同一区域,或者在其他地方?我并不关心它每秒可以处理多少消息。我更关心单个消息的往返时间。另外,我是从本地系统运行的。从本地系统运行会带来很大的延迟,因为您正在通过TLS向服务传输HTTP,因此存在多个往返开销。提到每秒消息的意义并不是服务的速度——它要快得多——关键是如果我每秒处理的消息超过100条,那么我必须在10毫秒内处理每条消息。我只有一个线程在运行。如果我将max number of messages设置为1,我仍然会以大约20条消息/秒或~50ms的速度发送消息。从一个冷启动开始,只需执行1项操作的时间很少。看起来您一次只处理一条消息,并且包括从本地计算机发送/接收消息的所有延迟(而不是同一区域中的EC2实例)。SQS没有针对这个用例(单个消息)进行优化—它针对多个消息吞吐量和弹性(至少一次传递)进行了优化。我编写了一个“队列排水器”工具,它从SQS读取数据并将数据存储在MySQL数据库中。。。它有一些内置的聪明之处,比如在获取下一批时异步删除上一批,但它仍然可以进行一些优化,而且我忘记了具体的数字。。。但我几乎可以肯定它每秒可以消耗近200条消息。。。所以,您的时间看起来确实有点短,当然,如果队列中有10条消息,而只有1条,您的trx/sec会有显著的提高。你在哪里运行这个代码?在EC2中,与队列位于同一区域,或者在其他地方?我并不关心它每秒可以处理多少消息。我更关心单个消息的往返时间。另外,我是从本地系统运行的。从本地系统运行会带来很大的延迟,因为您正在通过TLS向服务传输HTTP,因此存在多个往返开销。提到每秒消息的意义并不是服务的速度——它要快得多——关键是如果我每秒处理的消息超过100条,那么我必须在10毫秒内处理每条消息。我只有一个线程在运行。如果我将max number of messages设置为1,我仍然会以大约20条消息/秒或~50ms的速度发送消息。从一个冷启动开始,只需执行1项操作的时间很少。看起来您一次只处理一条消息,并且包括从本地计算机发送/接收消息的所有延迟(而不是同一区域中的EC2实例)。SQS没有针对这个用例(单个消息)进行优化—它针对多个消息吞吐量和弹性(至少一次交付)进行了优化。