2017-10-19 1 views
0

나는 메시지를 보내고 SQS 큐에서 메시지를받는 데 걸리는 시간을 테스트 해왔다. 평균적으로 800-1200ms가 소요되는데, 이것은 오랜 시간이 걸리는 것처럼 보입니다. 여기 테스트를위한 코드가있다. 내가 틀린 일을하고 있는지 말해줘.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 over HTTP를 서비스에 적용하기 때문에 상당한 대기 시간이 발생할 수 있으므로 오버 헤드가 여러 번 왕복됩니다. 초당 메시지를 언급하는 지점은 서비스의 속도가 아닙니다. 이보다 훨씬 빠릅니다. 요점은 초당 100 개의 메시지를 처리하는 경우 각 메시지를 반드시 10ms 미만으로 처리한다는 것입니다. 하나의 스레드 만 실행 중입니다. 최대 메시지 수를 1로 설정하면 여전히 약 20 개의 메시지/초 또는 ~ 50ms가 소요됩니다. 콜드 스타트에서 단지 1 번을 할 시간은 거의 드러나지 않습니다. –

답변

2

대기열을 사용하는 이유는 성능 향상이 아니라 복원력 때문입니다.

큐는 많은 문제를 해결하고 연결이 끊어진 시스템간에 비동기 통신을 제공하므로 시스템을 실제로 확장 할 수 있으며 시스템 장애시 메시지가 "손실"되지 않도록 향상된 복원력을 제공합니다.

대기열을 사용하여 작업 할 때는 eventual consistency이라는 개념을 중심으로 시스템을 설계하는 것이 좋습니다. 그러면 메시지가 결국 도착하고 처리되지만 예상 한 순서대로 처리되지 않을 수도 있습니다. 당신이 매우 높은 IOPS를 찾고 있다면

기능과 같은 속도, 주문, 재 시도 등은 아마도 큐 당신이 원하는 것을하지 큐 구현 (RabbitMq 등 SQS, 카프카,)

에 따라 다를 것입니다.

관련 문제