2017-10-19 95 views
0

我一直在测试发送消息并从SQS队列接收消息所花费的时间。它需要平均800-1200毫秒,这似乎是一个荒谬的很长一段时间。这里是我的测试代码,请告诉我,如果我做错了什么。为什么AWS SQS如此之慢?

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)); 
} 

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

+0

我写了一个从SQS读取并存储在MySQL数据库中的“队列抽取器”工具......它内置了一些巧妙的东西,比如在获取下一批时异步删除上一批,但它仍然有一些可以完成的优化,我忘记了具体的数字...但我几乎肯定它可以消耗每秒接近200条消息......所以你的时间似乎有点关闭,有点当然有10条消息在队列中而不是1,你会有显着的trx/sec改进。你在哪里运行这段代码?在EC2中与队列相同的地区,还是其他地方? –

+0

我并不十分关心它每秒能处理多少条消息。我更关心单个消息的往返时间。另外,我从我的本地系统运行这个。 – Matt

+1

从您的本地系统运行将带来严重的延迟,因为您正在通过TLS向服务发送HTTP,因此会有多次开销。每秒提及消息的重点不在于服务的速度 - 它要快得多 - 关键是如果我每秒处理超过100条消息,那么我必须在10ms内处理每条消息。我只有一个线程在运行。如果我将消息的最大数量设置为1,我仍然通过约20条消息/秒或约50ms来消除。时间从冷启动只做1,没有什么显示。 –

回答

2

你会使用任何队列的原因不是为了性能,而是为了恢复力。

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

在处理队列时,您应该考虑围绕eventual consistency的概念设计您的系统,这意味着您的消息最终会到达并处理,但可能不会在您希望的顺序或甚至按照您的预期顺序处理。

功能,例如速度,排序,重试等,将队列实现(SQS,卡夫卡的RabbitMQ等)

之间。如果您正在寻找超高IOPS那么或许队列是不是你想要的改变。