SQS를 사용하여 NodeJs 마이크로서비스 간에 통신하는 방법

4481 단어 nodejavascriptsqsaws
Amazon SQS 메시지는 분산 메시지 대기열 서비스입니다. 이를 사용하여 분산 서비스 간에 통신할 수 있습니다. 대기열에서 메시지를 보내고 받을 수 있습니다. 생산자는 메시지를 대기열로 보내고 소비자는 대기열에서 메시지를 읽습니다. nodejs와 함께 Amazon SQS를 사용하는 방법을 보여드리겠습니다. Amazon SQS에는 표준 및 FIFO라는 두 개의 대기열이 있습니다. 나는 표준 대기열을 사용했습니다.

SQS 표준 대기열은 동일한 메시지를 여러 번 보낼 수 있습니다. 따라서 Amazon SQS에 중복 메시지가 있을 가능성이 있습니다. SQS 설정 및 코딩을 시작하기 전에 이해해야 할 몇 가지 용어가 있습니다.
  • 가시성 제한 시간은 다른 소비자가 메시지를 받은 후의 시간입니다. 따라서 한 컨슈머가 지금 메시지를 수신하면 다음 컨슈머는 현재 시간부터 가시성 시간 이후에 동일한 메시지를 수신합니다.
  • 수신 메시지 대기 시간은 메시지가 대기열에 추가된 후 Amazon SQS가 메시지를 사용할 수 있을 때까지 기다리는 시간입니다.
  • 배달 지연은 대기열에 메시지를 추가하기 전에 SQS가 대기하는 시간입니다.
  • 보관 기간은 Amazon SQS가 대기열에 메시지를 보관하는 시간입니다.

  • AWS에서 SQS 대기열을 생성하는 것부터 시작하겠습니다. AWS 콘솔을 열고 SQS를 검색합니다. 저는 뭄바이(ap-south-1) 지역을 사용하고 있습니다.


    대기열 만들기를 클릭합니다.


    SQS 설정에는 이름, 구성 및 액세스 정책이 필요합니다. 이 세가지는 필수사항이고 나머지는 선택사항입니다. 배달 못한 편지 큐는 실패를 처리하는 데 도움이 되지만 이 블로그의 범위를 벗어납니다. 우리는 표준 대기열을 사용할 것입니다. 액세스 정책을 기본으로 유지하십시오.


    화면 하단의 대기열 만들기 버튼을 클릭합니다.


    다음 화면에서 나중에 필요할 세부 정보 섹션에 대기열 URL이 표시됩니다.



    대기열 설정이 완료되면 코딩으로 이동할 수 있습니다. SQS 메시지 읽기, 쓰기, 삭제 권한과 로그 스트림, 로그 그룹 생성 및 로그 이벤트 추가 권한이 있는 IAM 사용자의 비밀 액세스 키와 액세스 키가 필요합니다. 나중에 디버깅에 사용할 수 있도록 CloudWatch에 로그를 저장하려면 로그 권한이 필요합니다. aws-sdk npm 패키지를 설치합니다.npm install aws-sdk이제 메시지를 보내거나 받기 위해 sqs를 초기화해야 합니다. QueueUrl은 대기열 생성 후 받은 URL입니다.

    const AWS = require('aws-sdk');
    const sqs = new AWS.SQS({
      accessKeyId: 'IAM user access key',
      secretAccessKey: 'IAM user secret key',
      region: 'region where you created queue(like ap-south-1)',
      apiVersion: '2012-11-05',
    });
    //parameter to send message
    const paramsSendMessage = {
      MessageBody: JSON.stringify({
        type: 'event-live-status',
      }),
      QueueUrl: 'url of queue we created',
    };
    
    //param to receive message
    const paramsReceiveMessage = {
      QueueUrl: 'url of queue we created',
    };
    
    


    SQS sendMessage 함수는 대기열에서 메시지를 보내는 데 사용합니다.

      sqs.sendMessage(params, (err, data) => {
        if (err) {
          console.log('Error', err);
        } else {
          console.log('Successfully added message', data.MessageId);
        }
      });
    


    AWS SQS는 폴링을 사용하여 대기열에서 메시지를 읽습니다. 구성에서 ReceiveMessageWaitTimeSeconds가 0으로 설정되었거나 WaitTimeSeconds를 0으로 추가했거나 매개변수에 WaitTimeSeconds 속성이 없는 경우

    //param to receive message
    const paramsReceiveMessage = {
      QueueUrl: 'url of queue we created',
      WaitTimeSeconds: 0,
    };
    



      sqs.receiveMessage(params, (err, data) => {
        if (err) {
          console.log(err);
        } else if (!data.Messages) {
          console.log('no message found');
        } else {
    /*
    we sent the message as json string so json parse the message body
    */
          const messageBody = JSON.parse(data.Messages[0].Body);
    
        }
      });
    


    nodejs 서버가 실행 중이면 대기열에서 메시지 읽기를 계속 시도합니다. 구성에 따라 짧은 폴링 또는 긴 폴링을 사용합니다.



    참고: IAM 사용자에게 SQS 대기열에서 메시지 쓰기, 읽기, 삭제 권한이 있는지, 대기열 URL이 올바른지 확인하십시오. 대기열에서 중복 메시지를 수신할 가능성이 매우 높습니다. 메시지를 받는 즉시 삭제하면 중복 메시지를 피할 수 있습니다.

    또한 AWS Lambda 함수를 사용하여 대기열에서 메시지를 읽고 메시지를 기반으로 작업을 수행할 수 있습니다. 다음 블로그에 포함하겠습니다.

    좋은 웹페이지 즐겨찾기