fromm์ SQS์ DLQ - 2. Throughput์ ํจ๊ณผ์ ์ผ๋ก ๋๋ฆฌ๊ธฐ ์ํ Partial Batch ์ฌ์ฉ
- #AWS
- #SQS
- #DLQ
- #event-driven
- #partial batch
์๋ ํ์ธ์. ๋ ธ๋จธ์ค ๋ฐฑ์๋ํ์์ fromm ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๊น์ฐํ์ ๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
์ง๋ fromm์ SQS์ DLQ - 1. DeadLetterQueue๋ฅผ ๋์ ํ๊ธฐ๊น์ง ์์ fromm ์ด SQS ๋ฅผ ์ ํํ ์ด์ ์ DeadLetterQueue๋ฅผ ์ฌ์ฉํด ์์ ์ฑ์ ๋์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ํด๋น ํญ๋ชฉ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ด๋ผ๋ฉด ์ง๋๊ธ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
EventDriven Architecture๋ฅผ ์ ํํ๊ณ SQS๋ฅผ ์ฌ์ฉํด ์์คํ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ๋์๋ค๋ฉด ์ดํ ๊ด์ฌ์ฌ๋ ์ด๋ฐ ํ๊ฒฝ์์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋๊ฐ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ SQS์ throughput์ ์ด๋ป๊ฒ ์ฆ๊ฐ์ํฌ ์ ์๋์ง์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
SQS์ throughput ์ฆ๊ฐ์ํค๊ธฐ
SQS๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค์ฐ ๋์ ๋ฉ์์ง ์ฒ๋ฆฌ๋์ ๊ฐ์ง๊ณ ์๋ค๊ณ AWS๋ ๋งํฉ๋๋ค. ํ์ค ๋๊ธฐ์ด์ ๊ฒฝ์ฐ API ํธ์ถ์๋ ๊ฑฐ์ ๋ฌด์ ํ ์ด๋ผ๊ณ ํํํ๊ณ ์์ผ๋ฉฐ ํ์ค ๋๊ธฐ์ด๋ณด๋ค ์ฒ๋ฆฌ๋์ด ์ข๋ ๋ฎ์ FIFO ๋๊ธฐ์ด์ ๊ฒฝ์ฐ์๋ ๋ฆฌ์ ๋ณ ์ฐจ์ด๋ ์์ง๋ง ํ๊ตญ ๋ฆฌ์ ์ ์ต๋ ์ด๋น 90000๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ํฉ๋๋ค. ํ์ง๋ง ์ด๋ ์ต๋ ํธ์ถ์ ์ํด์ ๋ฐฐ์น ์ฒ๋ฆฌ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
SQS throughput์ ์ต๋๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ค์ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Horizontal Scaling
- Action Batching
Horizontal Scaling
Horizontal Scaling์ ๊ฒฝ์ฐ SQS์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ํด๋ผ์ด์ธํธ์ ๊ฐฏ์ ํน์ ์ฐ๋ ๋ ์๋ฅผ ๋๋ ค ๋ฉ์์ง์ ์ฒ๋ฆฌ๋์ ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค.
EC2, ECS, EKS ๋ฑ์ผ๋ก SQS ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ธ์คํด์ค๋ฅผ ๋๋ ค ๋ฉ์์ง์ ์ฒ๋ฆฌ๋์ ์ ํ์ ์ผ๋ก ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ์ด๋ Auto Scaling์ ํตํด ํด๋ผ์ด์ธํธ ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ์ฌ SQS์ ๋ฉ์์ง๊ฐ ๋ง์๋๋ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํด ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ ์๋๋ ์ธ์คํด์ค๋ฅผ ์ค์ฌ ๋น์ฉ์ ์ค์ผ ์๋ ์์ต๋๋ค.
ํ์ง๋ง fromm ์๋น์ค์ ๊ฒฝ์ฐ SQS์ ๋ฉ์์ง ํธ๋ค๋ฌ ํด๋ผ์ด์ธํธ๋ก Lambda๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ Lambda์ ์ด๋ฒคํธ ์์ค๊ฐ SQS์ผ ๊ฒฝ์ฐ Lambda๋ ๋ถ๋น 300๊ฐ์ ์ธ์คํด์ค๊น์ง ์คํ ์ค์ผ์ผ๋ง ๋ฉ๋๋ค. ์ด๋ ๊ฒ AWS ์์ฒด์ ์ผ๋ก ๋ฉ์์ง ํด๋ผ์ด์ธํธ์ ์คํ ์ค์ผ์ผ๋ง์ ์ง์ํด์ค๋ค๋ ์ ์ด SQS๋ฅผ ์ ํํ ์ฃผ์ํ ์ด์ ์ค ํ๋์๊ณ ๋ฐ๋ผ์ fromm ์๋น์ค์์๋ SQS Client์ horizontal scaling์ ํฌ๊ฒ ์ ๊ฒฝ์ฐ๊ณ ์์ง๋ ์์ต๋๋ค.
Action Batching
Action Batching์ SQS์ ๋ฉ์์ง๋ฅผ ํ๋ฒ์ ์ฌ๋ฌ๊ฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ throughput์ ์ฆ๊ฐ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ํจ์จ์ฑ์ ๋์ผ ์ ์๊ณ Lambda์ Concurrency๋ฅผ ์ต์ ํ ํ ์ ์์ต๋๋ค. ํ์ค ๋๊ธฐ์ด์ ๊ฒฝ์ฐ ํ๋ฒ์ ์ต๋ 10000๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐฐ์น๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
AWS Document ์ SQS Batch size์ max value๊ฐ 10, 10000 ์ผ๋ก ํผ์ฉ๋์ด ์ฌ์ฉ๋๊ณ ์๋๋ฐ aws-lambda-now-supports-batch-windows-of-up-to-5-minutes-for-functions ์ ๋ฐ๋ฅด๋ฉด 10์์ 10000์ผ๋ก ์ฆ๊ฐ๋์์์ ์ ์ ์์ต๋๋ค.
Action Batch ๊ตฌ์ฑํ๊ธฐ
action batch ์ฒ๋ฆฌ๋ฅผ ์ํ serverless ๋ฐ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋ ์์๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
serverless YAML config
serverless.yml
service: hello-fromm
provider:
name: aws
runtime: nodejs20.x
region: ap-northeast-2
memorySize: 1024
timeout: 60
tracing:
lambda: true
functions:
HelloFromm:
handler: src/lambda.handler
events:
- sqs:
arn:
Fn::GetAtt:
- HelloFrommQueue
- Arn
batchSize: 100
maximumBatchingWindow: 60
functionResponseType: ReportBatchItemFailures
.
.
.
(์ง๋ ๊ธ์ resource config์ ๊ฐ์)
functions์ handler ์ค์ ์ batchSize
, maximumBatchingWindow
, functionResponseType
์ ์ถ๊ฐํด ๋ฉ์์ง ๋ฐฐ์น์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
- batchSize : ํ๋ฒ์ ๋ฐฐ์น๋ก ์ฒ๋ฆฌํ ์ต๋ ๋ฉ์์ง ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- maximumBatchingWindow : ๋ฉ์์ง๋ฅผ ํด๋งํ๋ ์ต๋ ์๊ฐ์ ์ค์ ํฉ๋๋ค. ๋จ ์ด ์๊ฐ๋์ ๋ฐ๋์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๋ ๋ณด์ฅ์ ์์ผ๋ฉฐ ์ค์ ํ batchSize ๊น์ง ๋ฉ์์ง ๊ฐฏ์๊ฐ ๋์ง ์๊ฑฐ๋ batchWindow ๋งํผ ์๊ฐ์ด ๋์ง ์๋๋ผ๋ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ex. batchSize 50, maximumBatchingWindow 60์ผ๋ก ์ค์ ๋์์ผ๋ 10์ด๋ง์ 7๊ฐ์ ๋ฉ์์ง๋ง ๋ฐฐ์น์ฒ๋ฆฌ, ์ค์ ๋ก ์ด๋ ๊ฒ ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ํจ์ฌ ๋ง์ต๋๋ค.
- functionResponseType : Response Type์ ์ง์ ํด ๋ฐฐ์น ์ฒ๋ฆฌ์ค ์คํจํ ๋ฉ์์ง๋ง์ ์ฌ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ maximumBatchingWindow
, functionResponseType
๋ ์๋ต๋ ์ ์์ต๋๋ค.
Partial Batch Failure
๋ฉ์์ง๋ฅผ ๋ฐฐ์น๋ก ์ฌ๋ฌ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ค ๋ณด๋ฉด ์ค๊ฐ์ค๊ฐ ์ฒ๋ฆฌ์ ์คํจํ ๋ฉ์์ง๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ง์ฝ functionResponseType
๋ฅผ ์ค์ ํ์ง ์๊ณ ๊ทธ๋ฅ ๋ฐฐ์น๋ง ์ฌ์ฉํ๋ค๋ฉด SQS handler Lambda๋ ๊ฐ์ ธ์จ ๋ฉ์์ง๋ค์ด ์ฒ๋ฆฌ์ ์ฑ๊ณตํ๋์ง ์คํจํ๋์ง๋ง์ ๋ฆฌํดํฉ๋๋ค. ์ด๋ ์ค๊ฐ์ ์ฒ๋ฆฌํ ๋ฉ์์ง๊ฐ ํ๊ฐ๋ผ๋ ํฌํจ๋์ด ์๋ค๋ฉด ๊ฐ์ ธ์จ ๋ฉ์์ง ์ ์ฒด๋ฅผ ์ฌ์๋ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฏธ ์ฑ๊ณตํ ๋ฉ์์ง๊ฐ ์ฌ์ฒ๋ฆฌ ๋๋๋ผ๋ ์ ํ ์๊ด์ด ์๋ค๋ฉด ์ฝ๋์ ๊ฐ๊ฒฐํจ์ ์ ์งํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ค์ ๊ทธ๋๋ก action batch๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๊ทธ๋ ์ง ์๋ ๊ฒฝ์ฐ๋ ๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์๊ฒ Push ์ ์ก์ ์ํด SQS๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๋ฐฐ์น์ฒ๋ฆฌ ํ๊ณ ์๋ค๋ฉด ์ฑ๊ณตํ ๋ฉ์์ง๊ฐ ์ฌ๋ฌ๋ฒ ์ฒ๋ฆฌ๋์ด ์ฌ์ฉ์์๊ฒ ์ค๋ณต๋ Push๊ฐ ์ฌ๋ฌ๋ฒ ๋ฐ์ก๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ReportBatchItemFailures
๋ผ๋ handler Lambda์ Response Type์ ์ง์ ํด ์คํจํ ๋ฉ์์ง๋ง์ ์ฌ์ฒ๋ฆฌํ๋ partial batch failure๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
Lambda Handler Source Code
lambda.ts
export const handler = async event => {
const app = await NestFactory.create(AppModule);
const helloFrommService = app.get(HelloFrommService);
const batchItemFailures: SQSBatchItemFailure[] = [];
for (const record of event.Records) {
try {
await helloFrommService.executeTestData(JSON.parse(record.body));
} catch (e) {
batchItemFailures.push({ itemIdentifier: record.messageId });
// logging, alerting, etc...
}
}
return { batchItemFailures };
}
์ง๋๋ฒ ์ฝ๋์ ๋ฌ๋ผ์ง ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- 1๊ฐ๊ฐ ์๋ ์ฌ๋ฌ๊ฐ์ record๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก ๊ฐ ๋ ์ฝ๋๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ ๊ฒ
- ๊ฐ ๋ ์ฝ๋์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด batchItemFailures ๋ผ๋ ๋ฐฐ์ด์ ํด๋น ๋ ์ฝ๋ message ID๋ฅผ ๋ด์ ์คํจํ ๋ ์ฝ๋๋ง์ ๋ช ์์ ์ผ๋ก ๋ฐํํ๋ค๋ ๊ฒ
- ๋ฆฌํด์ด ๋ช ์์ ์ด๋ฏ๋ก handler ์ฝ๋์์ error throw๊ฐ ์์ด์ก๋ค๋ ๊ฒ
์ ์ฝ๋๋ฅผ ํตํด SQS์ Action Batch๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์คํจํ ๋ฉ์์ง๋ง ์์ ํ๊ฒ ์ฌ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
์ฌ๊ธฐ๊น์ง ๊ธ์ ๊ด์ฌ์๊ฒ ์ฝ์ด์ฃผ์ ๋ชจ๋ ๋ถ๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค๐โ
๋น์ ์ ์์ ์ด ์ธ์์ ๋ฐ๊พผ๋ค.
์ ํฌ์ ํจ๊ป ์๋น์ค์ ํ์ง์ ๋์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๊ณ ํจ๊ป ์ฑ์ฅํด๋๊ฐ ๊ฐ๋ฐ์๋ฅผ ์ฐพ์ต๋๋ค. ๊ด์ฌ์์ผ์ ๋ถ๋ค์ ์ธ์ ๋ ์ง ์ง์๋ถํ๋๋ฆฝ๋๋ค๐
์ฐธ๊ณ ์๋ฃ
Serverless Framework Documentation
Increasing throughput using horizontal scaling and action batching with Amazon SQS