Amazon Simple Queue Service(SQS)는 마이크로 서비스, 분산 시스템 및 서버리스 애플리케이션을 쉽게 분리하고 확장할 수 있도록 지원하는 완전관리형 메시지 대기열 서비스입니다.
출처: aws amazon
SQS는 메세지 데이터를 담을 수 있는 공간을 제공해준다. 만약 처리해야 할 데이터가 많다면, 서버에서 바로 처리하는 것보다 역할을 분산시켜서 작업을 하는게 서버의 부담도 적고 효율성도 높을것이다.
예를 들어서 상품을 구매하고자 하는 소비자와, 주문 내역을 데이터베이스에 저장해야 하는 판매자가 있다. 판매하는 상품은 한정판이어서 수 많은 소비자가 동시간대에 주문을 할 예정이다. 대량의 데이터를 한 번에 넣으려고 하면 데이터를 처리하는데 시간도 오래 걸릴 뿐더러 데이터가 소실될 수도 있다. 이런 경우에 서버와 데이터베이스 사이에 SQS를 끼워서 중간 역할을 하도록 한다.
Lambda 함수가 실행될 때마다 접속자 정보가 100개씩 DB에 저장되게 하고싶다. 하지만 100개의 데이터를 하나하나 전송하기 보다는, 100개의 데이터를 묶어서 SQS로 보낸 후에 한번에 데이터를 저장하는 방식으로 진행하고 싶다.
Lambda를 만들 때 권한 설정을 잘 해야한다. 이번에 SQS와 CloudWatch 서비스를 사용해야 하니 권한을 적당히 잘 추가해서 만들어준다.
Amazon SQS 페이지에서 대기열 생성
버튼을 누른다. 메세지 순서는 딱히 의미가 없었기에 대기열 유형을 표준
으로 하고 바로 생성 버튼을 눌렀다. 만약 먼저 들어온 메세지를 먼저 처리해야한다면 FIFO
를 선택한다.
SQS로 메세지를 보낼 lambda 페이지에서 트리거 추가
를 한다. SQS
를 선택하고 아까 만들었던 SQS 대기열
주소를 선택한다.
아래 코드는 DB가 polling 해갈 데이터를 SQS로 보내는 작업이다.
import json
import os
import boto3
import random
import socket
from datetime import datetime, timedelta, timezone
from botocore.exceptions import ClientError
def lambda_handler(event, context):
dynamo = boto3.resource('dynamodb').Table('insert_test_db')
KST = timezone(timedelta(hours=+9), 'KST')
ip = socket.gethostbyname(socket.gethostname())
lst = []
for i in range(1,101):
values = {
'id': len(dynamo.scan(TableName='insert_test_db')["Items"]) + i,
"date_of_visit" : datetime.now(KST).strftime("%Y-%m-%d %H:%M:%S.%f"),
"ip_address" : ip,
"user_number" : random.randrange(1000000)}
lst.append(values)
msg_body = json.dumps(lst)
msg = send_sqs_message(os.environ['SQS_QUEUE'], msg_body)
def send_sqs_message(sqs_queue_url, msg_body):
sqs_client = boto3.client('sqs')
msg = sqs_client.send_message(QueueUrl=sqs_queue_url, MessageBody=msg_body)
환경변수를 설정해야 os.environ[<key값>]
코드가 실행된다. 구성 > 환경변수
로 들어가 key/value 값을 입력한다. value는 SQS URL 주소를 넣으면 된다. URL 주소는 1번에서 SQS를 생성한 페이지 참고.
SQS 대기열 페이지로 돌아가면 메세지가 들어왔는지 확인할 수 있다.
확인하려는 SQS 페이지로 들어가 메세지 전송 및 수신 > 메세지 폴링
버튼을 누르면,
메세지가 정상적으로 담긴 것을 볼 수 있다.
[참고 사이트]
생활코딩: Simple Queue Service (SQS)
SQS, Lambda를 이용해 문자전송하기(1부)