나는 메시지를 보내고 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));
}
메시지를 보내고 즉시 밀리 초마다 메시지를 받기 시작합니다. 수신되면 시간을 계산합니다. 시간이 많이 걸리지 않아야합니까?
SQS에서 읽고 MySQL 데이터베이스에 저장된 "대기열 배수구"도구를 작성했습니다 ... 다음 배치를 가져 오는 동안 이전 배치를 비동기 적으로 삭제하는 것과 같은 약간의 영리함이 내장되어 있지만 여전히 일부 최적화가 완료 될 수 있으며 특정 숫자는 잊어 버렸지 만 초당 200 개의 메시지를 소비 할 수 있다고 확신합니다 ... 그래서 시간이 지나치게 쉬어 보이며 큐에 10 개의 메시지가 있습니다. 1에 비해 trx/sec가 크게 개선되었습니다. 이 코드를 어디에 실행하고 있습니까? 대기열과 같은 지역의 EC2 또는 다른 곳에서? –
나는 그것이 할 수있는 초당 메시지의 수에 대해서는별로 신경 쓰지 않는다. 나는 하나의 메시지의 왕복 시간에 더 관심이있다. 또한 로컬 시스템에서이 작업을 실행하고있었습니다. – Matt
로컬 시스템에서 실행하면 TLS over HTTP를 서비스에 적용하기 때문에 상당한 대기 시간이 발생할 수 있으므로 오버 헤드가 여러 번 왕복됩니다. 초당 메시지를 언급하는 지점은 서비스의 속도가 아닙니다. 이보다 훨씬 빠릅니다. 요점은 초당 100 개의 메시지를 처리하는 경우 각 메시지를 반드시 10ms 미만으로 처리한다는 것입니다. 하나의 스레드 만 실행 중입니다. 최대 메시지 수를 1로 설정하면 여전히 약 20 개의 메시지/초 또는 ~ 50ms가 소요됩니다. 콜드 스타트에서 단지 1 번을 할 시간은 거의 드러나지 않습니다. –