๐ AWS ๊ฐ๋ฐ์ ๊ฐ์ด๋์ Serverless ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ์ฉํ ์ฝ๋์ ๋ํด์ ๊ธฐ๋กํฉ๋๋ค.
๐ SQS๋ฅผ ์ฌ์ฉํ ์ด์
- ๋งค์ผ ์ค์ 10์์ ๋ฏธ๊ฒฐ์ ๋ฅผ ์ฌ์๋ํ๋ ์ค์ผ์ฅด๋ฌ๊ฐ ๋์๊ฐ๊ณ ์์๋ค. ์์ํฌํธ ๊ฒฐ์ ์ฌ๋ฅผ ํตํด ๊ฒฐ์ ๋ฅผ ์๋ํ๋๋ฐ, ํ๋ฒ์ 500๊ฐ์ ๊ฒฐ์ ๋ฅผ ์๋ํ์ ๋ ๋ฌธ์ ๊ฐ ์์์ผ๋ ๊ทธ ์ด์์ ๊ฒฐ์ ๊ฑด์ ๋ํด์ ์ ์์ ์ผ๋ก ๊ฒฐ์ ๊ฐ ์งํ๋ ์ง๋ ๊ฒ์ฆ๋์ด ์์ง ์์๋ค.
- ์์ํฌํธ๋ ํธ๋ํฝ์ด ๊ฐ์๊ธฐ ์ฆ๊ฐํ๋ค๊ฑฐ๋์ ์ด์ ๋ก ์ข ์ข ๊ฒฐ์ ๋ฅผ ์คํจํ๊ฒ ๋๋๋ฐ, ๊ทธ ๋์ ์๋ฌ์ฒ๋ฆฌ๋ ์์ง ์๋ฒ์์ ํด์ฃผ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์, ์ด๋ค ์ ์ ์๋ ์ด์ ๋ก ๊ฒฐ์ ๊ฐ ๋๋ฒ ๋๋ ์ํ์ด ์๋ ๊ฒ์ด๋ค.
- ๊ฒฐ์ ์ฌ์ด์ ๋๋ ์ด๋ฅผ ์ค ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- ๋งค์ผ 4์ฒ์ฌ๊ฐ์ ๊ฒฐ์ ์์ฒญ์ด ์ ์์ ์ผ๋ก ๋ค์ด๊ฐ๊ณ , ๋ฐ๋ก ๋ณ์๋ฅผ ๋ฃ์ด์ค๋ค๊ฑฐ๋ ์ด๋ฐ ์ ๊ฒฝ์ ์ฐ๊ณ ์ถ์ง ์์๋ค.
๐ FIFO vs Standard
๐ก ์ฌ์ค ๋๋ ์ฒ์์ SQS์ ๊ธฐ๋ฅ ์์ฒด๋ฅผ ์ดํดํ๊ธฐ ํ๋ค์๋ค. ๋๊ธฐ์ด ๋ฉ์ธ์ง ์๋น์ค? ๋ฉ์ธ์ง ๋๊ธฐ์ด ์๋น์ค? ์๋ฌดํผ SQS๋ AWS ๊ฐ๋ฐ์ ๋ฌธ์์์ ํ๊ธ๊ณผ ์์ด๋ก ์ค๋ช ์ด ๋์ด ์์์๋ ์ดํด๊ฐ ์ด๋ ค์ ๋ค.
์ฝ๋ ์์๋ฅผ ๋ค์ด์ฃผ๋๋ฐ ์ฃ๋ค 'Mark'์๊ฒ 'Hello!'๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค. ๊ฐ์ ์์ ๋ฟ์ด์ด์, ์ ๋ง ๋ฌธ์๋ฅผ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ธ๊ฐ..? ์ด๋ฐ ์ฐฉ๊ฐ ์์ ๋น ์ ธ ์์ ์ฆ์, ๋ฉ์ธ์ง ๋๊ธฐ์ด์ด๋ผ๋ ์ด๋ฆ์ ๋ณด๊ณ ์์ฝ ๋ฌธ์ ์ ๋ ๊ตฌ๋! ๋จ๋จํ ์ฐฉ๊ฐ์ ๋น ์ ธ๋ฒ๋ ธ๋ค.
๋ญ, ๋ฐ์ ๋ง๊ณ ๋ฐ์ ํ๋ฆฌ๋ค.
๐ถ FIFO
- ์ ํํ 1ํ ์ฒ๋ฆฌ
- ์ ์ ์ ์ถ ๋ฐฐ์ก
- Standard๋ณด๋ค ๋์ ์๊ธ
๐ Standard
- ์์๊ฐ ๋ณด์ฅ๋์ง ์์
- ์ด์ฉ๋ค ํ ๋ฒ ๋ ๊ฐ ์ด์์ ๋ฉ์ธ์ง ๋ณต์ฌ๋ณธ์ด ์ ๋ฌ ๋ ์ ์์
๐ FIFO
๊ฒฐ์ ๋ฅผ ์๋ํ๋ ๋ฉ์ธ์ง์ด๋ฏ๋ก ์์๋ ์๊ด ์์ผ๋ ์ ํํ 1ํ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ FIFO๋ฅผ ์ฑํํ์ฌ ๊ตฌํํ์๋ค.
naming
- .fifo๋ก ๋๋์ผ ํ๋ค.
Delay
- FIFO๋ ๊ฐ๋ณ ๋ฉ์ธ์ง์ ๋ํ delay๋ฅผ ์ง์ํ์ง ์๋๋ค.
- Delivery delay์ Receive message wait time์ ๋๊ธฐ์ด์ ๋ชจ๋ ๋ฉ์ธ์ง์ ๋ํ ๊ฒ์ผ๋ก, ์ง์ ํ ์๊ฐ์ด ์ง๋๋ฉด ํ๋ฒ์ ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ์๋ฅผ ๋ค์ด 1์ 1์ด์ 5๊ฐ์ ๋ฉ์ธ์ง๋ฅผ delay๋ฅผ 5์ด๋ก ์ ์กํ๋ค๋ฉด, 1์ 6์ด์ 5๊ฐ์ ๋ฉ์ธ์ง๊ฐ ์ ๋ถ ๋ ์๊ฐ๋ค.
- Lambda๊ฐ ๋ฉ์ธ์ง๋ฅผ ํ๋ฒ์ ํ๋์ฉ๋ง ์ฒ๋ฆฌํ๊ฒ ํ๊ณ ์ถ์ผ๋ฉด, Lambda event์์ Batch size๋ฅผ 1๋ก ์กฐ์ ํ๋ค.
๊ฒฐ๊ตญ..
- ๊ฐ๋ณ ๋ฉ์ธ์ง์ ๋ํ delay๋ ๋ถ๊ฐ๋ฅ ํ๋, batch size๋ฅผ ์กฐ์ ํ์ฌ ํ๋ฒ์ ํ๋์ฉ๋ง ์ฒ๋ฆฌํ๊ฒ ํ์ฌ delay๋ ํ์ ์๋ค๊ณ ํ๋จํด FIFO๋ก ๊ตฌํํ๋ค.
๐ก ๊ฐ๋ณ ๋ฉ์ธ์ง์ delay๋ฅผ ์ค ์ ์๋ Standard๋ก ๋ณ๊ฒฝ ํด์ ๊ตฌํ์ ํด๋ณด๊ธฐ๋ ํ๋ค.
SendMessage๋ฅผ ํ ๋ DelaySeconds๋ฅผ ๋ฉ์ธ์ง ๋ง๋ค ๊ฐ๊ฐ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ฐ๋ณ delay๋ฅผ ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๋ง์ ์ฌ๋๋ค์ ์์์์ sendMessage๋ฅผ ํ๊ธฐ ์ ์ ๋๊ธฐ์ด์ ์๋ ๋ฉ์ธ์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๊ณ delay๋ฅผ ์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์๋ค.
- ํด๋น ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ํด๋ณด์์ ๋, ๋๋ Promise.all์ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ ๊ทธ๋ฐ๊ฐ ๋๊ธฐ์ด์ ์๋ ๋ฉ์ธ์ง๋ฅผ ๊ฒ์ → ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ ํ๋ ๊ณผ์ ์์ ๋๊ธฐ์ด์ ์๋ ๋ฉ์ธ์ง์ ์์ ์ ํํ ์ ์ ์์๊ณ , ๋ฉ์ธ์ง์ ์ซ์๋ 0์ผ๋ก ๋์๋ค.
- ๊ทธ๋์ ๋๊ธฐ์ด์ ๋ฉ์ธ์ง ์๊ณผ ์๊ด ์์ด ๋ฃจํ๋ฅผ ํ๋์ฉ ๋ ๋๋ง๋ค index๋ฅผ ์ฆ๊ฐ์์ผ 10๊ฐ๋น 1์ด์ delay๋ฅผ ์ค ์ ์๊ฒ ๊ตฌํํ์๋ค.
- ๋ํ ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํ์ฌ DB์ lock์ ๊ฑธ์ด DB๊ฐ ์ค๋ณต์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ง์๋ค.
๐ YAML File ์ค์
SQS ์์ฑ
resources:
Resources:
QueueQueueQueue:
Type: 'AWS::SQS::Queue'
Properties:
ContentBasedDeduplication: true
DelaySeconds: 0
FifoQueue: true
QueueName: "queueName.fifo"
- ContentBasedDeduplication : ๋๊ธฐ์ด์ ์๋ ๋ฉ์ธ์ง์ ๋ด์ฉ์ด ๋์ผํ๋ฉด ํด๋น ๋ฉ์ธ์ง๋ ๋ณด๋ด์ง์ง ์๋๋ค.
- DelaySeconds : ๋๊ธฐ์ด์ delay๋ฅผ ์ค๋ค. ๊ฐ๋ณ ๋ฉ์ธ์ง์ ๋ํ delay๋ ์๋๋ค.
- FifoQueue : FIFO ํ์์ ์ฌ์ฉํ ๊ฑด์ง
- QueueName : Queue์ด๋ฆ. FIFO๋ ๋ค์ .fifo๋ฅผ ๊ผญ ๋ถ์ฌ์ผ ํ๋ค.
Iam Role ์ค์
iamRoleStatements:
- Effect: Allow
Action:
- sqs:SendMessage
- sqs:ReceiveMessage
- sqs:DeleteMessage
- sqs:GetQueueAttributes
Resource:
Fn::GetAtt: [ QueueQueueQueue, Arn ]
- Fn::GetAtt: : arn์ ์ง์ ์ฐ์ง ์๊ณ arn์ ๊ฐ์ ธ ์ฌ ์ ์๋ค.
SQS Lambda Trigger ์ค์
functions:
queue:
handler: queue.queue
name: Backend-Fn-${self:provider.stage}-queue
events:
- sqs:
arn:
Fn::GetAtt:
- QueueQueueQueue
- Arn
batchSize: 1
maximumBatchingWindow: 0
๊ฐ์ฅ ๋ง์ด ํค๋งธ๋ ๋ถ๋ถ์ด๋ค. ๐ก
- trigger๋ฅผ ์ค์ ํ ๋ ์๋ฌด๋ฆฌ ๋ฌธ์ ๋๋ก ํด๋ ์๊ธฐ์ง ์์๋ค. deploy๋ฅผ ํด๋ณด์๋ ์๋ฌ ๋ฉ์ธ์ง์กฐ์ฐจ ๋จ์ง ์๊ณ , ์๋ฌด๋ฐ ๋ณํ๊ฐ ์์๋ค.
- ๊ตฌ๊ธ๋ง์ ํด๋ณธ ๊ฒฐ๊ณผ ๋์ ๊ฐ์ ์ํ์ธ ์ฌ๋๋ค์ด ๋ง์๊ณ , ๋ฌธ์ ๋ ๋์ด์ฐ๊ธฐ ๋๋ฌธ์ด์๋ค.
- ๋ณดํต yaml ํ์ผ์ ์์ฑํ ๋, tab์ ์ฌ์ฉํ์ฌ ๋์ด์ฐ๊ธฐ๋ฅผ ํ๋๋ฐ, serverless ๊ฐ๋ฐ์ ๊ฐ์ด๋์ ์์ ์ฝ๋๋ฅผ ์์ฃผ ์ ์ฌํ ๋ณด๋ฉด trigger๋ฅผ ์ค์ ํ ๋ space 3๊ฐ ์ฉ ๋์ด์ ธ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฑธ ์ด๋ป๊ฒ ์์! - batchSize : ํ๋ฒ์ ๋ฉ์ธ์ง๋ฅผ ๋ช๊ฐ์ฉ ์ฒ๋ฆฌํ ์ง์ ๋ํ ์ค์ ์ด๋ค.
- maximumBatchingWindow : ๋ฉ์ธ์ง ์์ง ์๊ฐ์ด๋ค.
๐ Send & Receive & Delete
sendMessage
let sendParams = {
QueueUrl: url,
MessageGroupId: groupName,
MessageBody: JSON.stringify(body)
}
- QueueUrl : queue์ url์ด๋ค. .bash_profile์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ์๋ค.
- MessageGroupId : FIFO๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์๋ก ํ์ํ๋ค. ๋๊ธฐ์ด ๊ทธ๋ฃน์ ์์ด๋์ด๋ค.
- MessageBody : ๋ณด๋ผ ๋ฉ์ธ์ง์ด๋ค. String ํ์๋ง ๊ฐ๋ฅํ๋ฉฐ, ๋ค๋ฅธ ํ์์ message attributes์ ๋ฃ์ด ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
receive
{
"Records": [
{
"messageId": "c451c9e2-00000",
"receiptHandle": "AQEBs1ugEzqRC1yWjeMAvq***",
"body": "{\\"key\\":2}",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "162704**",
"SequenceNumber": "18863***",
"MessageGroupId": "retry_unpaid",
"SenderId": "AROA5KBD****",
"MessageDeduplicationId": "56a778e****",
"ApproximateFirstReceiveTimestamp": "1627***"
},
"messageAttributes": {},
"md5OfBody": "3b9f0c439***",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:a****.fifo",
"awsRegion": "ap-northeast-2"
}
]
}
- ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด ์์ ํ์์ผ๋ก ๋ฐ์์ค๊ฒ ๋๋ค.
- ์ด์ ์ event์๋ ๋ค๋ฅธ ํ์์ด๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด์ handler๋ ์ฌ์ฉํ ์ ์์ด์ ์๋ก์ด handler๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ์๋ค.
- ๋ด๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ receiptHandle, MessageGroupId, body์๋ค.
deleteMessage
let deleteParams = {
ReceiptHandle: params.receiptHandle,
QueueUrl: params.url
}
- ๋ฉ์ธ์ง๋ฅผ ๋ฐ์๋ queue๋ ์๋์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋ค์ ๋๊ธฐ์ด๋ก ๋์๊ฐ๊ฒ ๋๋ค.
- ๊ฒฐ์ ์คํจ๊ฐ ๋ ๊ฑด์ ๋ํ์ฌ ๋งค์ผ ๋ค์ ๊ฒฐ์ ๋ฅผ ์๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ค์๋ ๋์ผํ ๋ด์ฉ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ผ ํ๋ค.
- ๋ฐ์์จ ๋ฉ์ธ์ง์์ receiptHandle๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฉ์ธ์ง๋ฅผ ์ง์์ค๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
jest๋ก ๋ก๊ทธ์ธ ํผ ํ ์คํธ ์ฝ๋ ์ง๊ธฐ (0) | 2024.08.19 |
---|---|
MAC ํฐ๋ฏธ๋์์ MySQL ์ฌ์ฉํ๊ธฐ (0) | 2023.01.04 |
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด๋? (0) | 2023.01.04 |
ํฌ์ธํฐ ๋ณ์๋? (2) | 2023.01.04 |
๋ณ์์ ์ข ๋ฅ (0) | 2023.01.04 |