【AWS】Lambda+SQS로 사일로+풀 모델을 실현하기 위한 디스패처 구성 검토

계기


  • 당사가 과거에 개발하여 현재도 계속 운용, 추가 개발을 하고 있는 클라이언트의 SaaS가 있어, 그래서 해소하고 싶다"라는 요청을 받았으니까.

  • 현재 분석


  • 요청 수신 부분은 REST API로 구성되며 다른 사용자의 요청은 처리 시간에 의존하지 않습니다
  • 실제 처리 부분은 요청 수신 부분과 비동기 적으로 처리되며 실제 처리는 순차적으로 실행되므로이 ​​부분은 병목 현상입니다.
  • 다음 사이트에서 분류된 분리 패턴에서는 현재 상태는 1. 사일로 모델



  • 3. 사일로 + 풀 모델을 목표로 하고 싶다.

    검증에서 목표로 하는 구성


  • 요청을 받는 SQS→각 요청을 할당하는 Dispatcher용 Lambda→특정 사용자용 SQS, 범용 사용자용 SQS와 각각 실제 처리 Lambda를 연결한다(본 기사에서는 실제 처리 Lambda는 생략)


  • 구축Step


  • 요청 수신 SQS와 Dispatcher 용 Lambda를 연결합니다
  • Dispatcher 용 Lambda에서 CompanyA 용 SQS로 메시지 저장
  • Dispatcher 용 Lambda에서 수신 메시지에 따라 저장

  • 1. 요청 수신 SQS와 Dispatcher용 Lambda를 연결




  • 요청 수신 SQS 생성 (fifo 대기열, 중복 삭제 만 설정)
  • Dispatcher 용 Lambda 만들기 (Node.js 14.x로 구성)
  • Lambda 소스 코드를 아래에 수정, 배포

  • index.js
    exports.handler = async function(event, context) {
      event.Records.forEach(record => {
        const { body } = record;
        console.log(body);
      });
      return {};
    };
    
  • Lambda 실행 역할에 "AmazonSQSFullAccess"부여
  • Lambda 설정에서 요청 수신 SQS를 트리거로 설정
  • 동작 확인 SQS로 메시지 보내기 → Lambda에서 로그 확인


  • 2. Dispatcher용 Lambda에서 CompanyA용 SQS로 메시지 저장




  • CompanyA용 SQS 작성(fifo 큐, 중복 삭제만 설정)
  • Lambda 소스 코드를 아래에 수정, 배포

  • index.js
    const aws = require('aws-sdk');
    aws.config.region = 'ap-northeast-1';
    const sqs = new aws.SQS({apiVersion: '2012-11-05'});
    
    const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyA.fifo';
    
    exports.handler = async function(event, context) {
    
            const recs = event.Records;
    
            for (let rec of recs){
                const body = rec.body;
                console.log(body);
    
                const params = {
                    MessageBody: body,
                    QueueUrl: QUEUE_URL,
                    MessageGroupId:rec.attributes.MessageGroupId,
                    DelaySeconds: 0
                };
    
                console.log(params);
    
                const result = await sqs.sendMessage(params).promise();
                console.log(result)
            }
    };
    
  • 동작 확인 요청 수신 SQS에 메시지 보내기 → Lambda 로그 확인 → CompanyA 용 SQS에 메시지가 저장되어 있는지 확인




  • 3. Dispatcher용 Lambda에서 수신 메시지에 따라 저장




  • CompanyOTHER용 SQS 만들기
  • Lambda 소스 코드를 아래에 수정, 배포

  • index.js
    const aws = require('aws-sdk');
    aws.config.region = 'ap-northeast-1';
    const sqs = new aws.SQS({apiVersion: '2012-11-05'});
    
    const companyA_QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyA.fifo';
    const companyOTHERS_QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyOTHER.fifo';
    let queue_url = '';
    
    exports.handler = async function(event, context) {
    
            const recs = event.Records;
    
            for (let rec of recs){
                const body = rec.body;
                console.log(body);
    
                const body_parse = JSON.parse(body);
    
                if(body_parse.company_code === '0001'){
                    queue_url = companyA_QUEUE_URL;
                } else {
                    queue_url = companyOTHERS_QUEUE_URL;
                }
    
                const params = {
                    MessageBody: body,
                    QueueUrl: queue_url,
                    MessageGroupId:rec.attributes.MessageGroupId,
                    DelaySeconds: 0
                };
    
                console.log(params);
    
                const result = await sqs.sendMessage(params).promise();
                console.log(result)
            }
    };
    
  • 동작 확인 요청 수신 SQS에 메시지 보내기 (company_code로 대상 제어) → Lambda 로그 확인 → CompanyA 용 SQS에 메시지가 저장되어 있는지 확인






  • 참고 사이트

    좋은 웹페이지 즐겨찾기