2011-02-02 2 views
8

문제에 대해 자세히 설명하기 전에 나는 현재의 접근 방법을 알려줍니다.nodejs 서버가 AWS SQS를 수신하도록하려면 어떻게해야합니까?

setInterval()을 실행하는 js 스크립트가 있습니다. 및 각 간격, 나는 대기열에서 메시지를 얻기 위해 SQS를 호출합니다. 메시지가 있으면 처리합니다.
그래서 프로세스를 죽일 때까지 무한히 실행됩니다.

내가 대신 주기적으로 실행에서는 setInterval있는의 ..합니다 (nodejs.org의 예제를 사용)하기 전에 노드 서버

그래서, 내가 궁금하네요 것은을 구축했다. SQS에 새 메시지가있는 경우 이벤트가 발생하고 메시지를 처리하는 방법이 있습니까?

답변

6

아니요. SQS에 메시지를 요청해야합니다.

푸시 알림이 필요하면 SNS을보세요. 대기열에 메시지를 추가 한 후 SQS를 폴링하는 힌트를 서버에 제공하려면 SNS가 잘 작동합니다.

3

SQS는 알림을 제공하지 않지만 SQS에 새 메시지가있는 경우 메시지를 만든 모든 항목을 node.js에 기록하고 폴링을 몇 분 동안 사용할 수 있습니까? 대기열에있는 내용을 제어 할 수는 없지만, 그렇다면 node.js가 대기열 폴링을 시작하도록 유도해야합니다.

비용 때문에 폴링이 걱정된다면 내가 한 일을 할 수 있습니다. 폴링 시간을 동적으로 변경하십시오. 내 SQS 대기열은 5 초마다 폴링됩니다. 노드가 메시지를 감지하면 즉시 폴링 시간을 몇 초 동안 200ms로 낮 춥니 다. 대기열에서 메시지를 감지하지 못하면 5 초 폴링이 다시 히트 될 때까지 빈 요청이있을 때마다 50ms의 속도가 느려집니다.

첫 번째 요청이 느려지므로 처리하지 못할 수도 있습니다. 이를 극복하기 위해 폴링 시간을 몇 분마다 무작위로 늘려야합니다. 폴링 노드가 몇 개인 경우 대개 응답 시간이 매우 빠릅니다.

+2

예를 들어 동적 폴링 시간에 대한 작업 코드를 게시 할 수 있다면 좋을 것입니다. – Mark

7

이 질문은 2 년 이상 된 것이지만 폴링 간격을 변경하는 것보다 훨씬 좋은 방법이 있습니다. 대신 대기열의 메시지 수신 대기 시간을 최대 20 초로 설정하십시오. 그런 다음 연속 폴링을 수행 할 수 있지만 대기열이 비어있는 동안 분당 3 회의 요청 만 수행합니다. 대기열에 데이터가 있으면 즉시 응답합니다.

2

SQS Long Polling을 사용하면이 작업을 수행 할 수 있습니다. 긴 폴링은 응답을 보내기 전에 대기열에서 메시지를 사용할 수있을 때까지 Amazon SQS가 대기하도록 허용하여 빈 응답의 수를 줄입니다. 이는 또한 SQS 비용을 크게 절감 할 것입니다.

이것을 쉽게 만들려면 sqs-consumer이라는 훌륭한 라이브러리가 있어야합니다.

const Consumer = require('sqs-consumer'); 

const app = Consumer.create({ 
    queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name', 
    handleMessage: (message, done) => { 
    // do some work with `message` 
    done(); 
    } 
}); 

app.on('error', (err) => { 
    console.log(err.message); 
}); 

app.start(); 

이미 위에서 설명한 롱 폴링 기법을 사용한다 후드 :이 메시지가 처리되면 그냥 콜백을 SQS 메시지를 수신 함수를 정의하고 호출 할 수 있습니다.