[AWS] SQS

SQS๋Š” Single Queue Service์˜ ์•ฝ์ž๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ํ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋‹ค.

ํ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ๋Œ€๊ธฐ์—ด์ด๋‹ค.
์ž‘์—…์ด ๋ง‰ ๋ฏธ์นœ๋“ฏ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ์—, ์ผ๋‹จ ๋Œ€๊ธฐ์—ด์— ์Œ“์•„๋‘๊ณ  ์ฒœ์ฒœํžˆ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ๊ผญ ๋‹น์žฅ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋งŒ ๋ง์ด๋‹ค.

SQS์—๋Š” ๋‹ค์Œ์˜ 2๊ฐ€์ง€ ๋Œ€๋ถ„๋ฅ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.
ํ‘œ์ค€์€ ๊ทธ๋ƒฅ ๋ง‰ ๋˜์ง€๊ณ  ๋งˆ๋Š” ๊ฒƒ์ด๊ณ , FIFO๋Š” ๋ณด๋‚ธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
ํ‘œ์ค€์€ ๋น ๋ฅด๊ณ  ์ €๋ ดํ•œ ๋Œ€์‹  ํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ ,
FIFO๋Š” ๋А๋ฆฌ๊ณ  ๋น„์‹ผ ๋Œ€์‹  ํŽธ๋ฆฌํ•˜๊ณ  ์•ˆ์ •์ ์ด๋ž€ ํŠน์ง•์ด ์žˆ๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ์ž˜ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
์šฐ์„  ๊ธฐ๋ณธ์˜ต์…˜๋Œ€๋กœ ํ‘œ์ค€์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

์ด๋ฆ„๋งŒ ์ง€์ •ํ•˜๊ณ  ์ƒ์„ฑ์„ ํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ ํŽ˜์ด์ง€๊ฐ€ ๋œจ๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค.

๋ณดํ†ต ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ฝ˜์†”์—์„œ๋„ ์ง์ ‘ ๋ฉ”์„ธ์ง€๋ฅผ ์˜๊ณ  ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.
ํ•œ๋ฒˆ ์ด๋ณด์ž.

์ €๊ธฐ๋กœ ๋“ค์–ด๊ฐ€๋ฉด

์†ก์ˆ˜์‹  ์ฐฝ์ด ๋œจ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฉ”์„ธ์ง€๋ฅผ ์ง์ ‘ ์ด๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ƒฅ ์ด๋„ ๋˜์ง€๋งŒ

์†์„ฑ๊ฐ’์„ ์ถ”๊ฐ€๋กœ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ์ˆ˜์‹  ์ฐฝ์—์„œ

๋ฉ”์‹œ์ง€ ํด๋ง ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด

ํ˜„์žฌ๊นŒ์ง€ ์ €์žฅ๋œ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋ถ€ ์ฝ์–ด์˜ฌ ๊ฒƒ์ด๋‹ค.

๋ฉ”์„ธ์ง€๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ UUID ํ˜•์‹์˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.




With Lambda (์ „์†ก)

๋ฉ”์„ธ์ง€๋ฅผ ์Œ“์•„๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋ญํ•˜๊ฒ ๋Š”๊ฐ€?
์Œ“์•„๋‘”๊ฑธ ์ฒ˜๋ฆฌ๋„ ํ•ด์•ผ์ง€.

๊ผญ ๊ทธ๋ž˜์•ผํ•˜๋Š”๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์ด๋Ÿฐ ์ฒ˜๋ฆฌ๋Š” ๋žŒ๋‹ค๋กœ ์Šค์ผ€์ค„๋ง๋ฅผ ๊ฑธ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ํŽธ์ด๋‹ค.
10๋ถ„๋งˆ๋‹ค ํ๋ฅผ ์ฝ๊ณ  ์ž‘์—…ํ•  ๊ฒŒ ์žˆ์œผ๋ฉด ์ฒ˜๋ฆฌํ•ด์„œ ์ง€์šฐ๊ณ ... ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.

์ผ๋‹จ ํ ๋ฉ”์„ธ์ง€๋ฅผ ์Œ“์„ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.
ํ…Œ์ŠคํŠธ ๋Ÿฐํƒ€์ž„์€ ์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋…ธ๋“œ๋กœ ํ•˜๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋žŒ๋‹ค ๊ตฌ์„ฑ์— ๋“ค์–ด๊ฐ€์„œ ์‹คํ–‰์—ญํ• ->

SQS ์ ‘๊ทผ๊ถŒํ•œ์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ด ๋žŒ๋‹ค์—์„œ๋Š” ํ์— ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
์•„ ๊ทธ๋ฆฌ๊ณ , ์ ‘์†ํ•  ํ์˜ URL์„ ๊ธ์–ด์˜ค์ž.
์ด๊ฒŒ ์žˆ์–ด์•ผ ์ ‘์†์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„ธ์ง€ ๋ฐœ์†ก ์ฝ”๋“œ๋Š” ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
๋ฉ”์„ธ์ง€ ๋‚ด์šฉ๊ณผ URL์„ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•œ๋‹ค.

const AWS = require("aws-sdk");
const sqs = new AWS.SQS();

exports.handler = async (event) => {
    // ๋ณด๋‚ผ ๋ฉ”์„ธ์ง€
    const message = {
        productId: 1, 
        command: 'DELETE',
    };

    await sqs.sendMessage({
        //๋ฌธ์ž์—ด๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
        MessageBody: JSON.stringify(message),
        // ์ ‘์†ํ•  ํ ์ฃผ์†Œ
        QueueUrl: '์ฃผ์†Œ', 
    }).promise();

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

์ด์™ธ์—๋„ ์†์„ฑ๋„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ๋Š”๋ฐ, ๊ทธ๊ฑด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#sendMessage-property

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด

์‹ค์ œ๋กœ๋„ ์ž˜ ์Œ“์—ฌ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด์ œ ์ด๊ฑธ ์ฝ์–ด๋ณด์ž.




With Lambda (์ˆ˜์‹ )

์ด๋ฒˆ์—” ํ๋ฅผ ์ฝ์–ด์„œ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

์ž์ž˜ํ•œ ๊ตฌ์„ฑ ์„ค์ •์€ ์ด์ „๊ณผ ๊ฐ™๋‹ค.

๋ฉ”์„ธ์ง€๋ฅผ ์ฝ๋Š”๊ฑด receiveMessage ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
ํ ์ฃผ์†Œ๋งŒ ํ•„์ˆ˜ํ•ญ๋ชฉ์ด๊ณ  ๋‹ค๋ฅธ๊ฑด ์˜ต์…˜์ด๋‹ค.

const AWS = require("aws-sdk");
const sqs = new AWS.SQS();

exports.handler = async (event) => {
    const result = await sqs.receiveMessage({
        // ์ ‘์†ํ•  ํ ์ฃผ์†Œ
        QueueUrl: '์ฃผ์†Œ', 
    }).promise();

    console.log('๋ฉ”์„ธ์ง€');
    console.log(result);

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

์ด์™ธ์— ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ๊ฑด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#receiveMessage-property

์ €๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์˜ฌ ๊ฒƒ์ด๋‹ค.
ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„ธ์ง€์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 10๊ฐœ์ธ๋ฐ, ๊ธฐ๋ณธ ์˜ต์…˜๊ฐ’์€ 1์ด๋‹ค.

์ฝ์€ ๋ฉ”์„ธ์ง€๋Š” ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋‹ค.
๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ํ‘œ์ค€ SQS๋Š” ํ•œ ๋ฉ”์„ธ์ง€๋ฅผ 2๋ฒˆ ์ด์ƒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‚œ์ ์ด ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด ์ƒํ™ฉ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๋Œ๋ฆฌ๋ฉด ํ•œ ๋ฉ”์„ธ์ง€๊ฐ€ 2๋ฒˆ ์ด์ƒ ๋ณด์ด๋Š” ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ๊ฒŒ ์‹ซ๋‹ค๋ฉด ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•˜๊ณ  FIFO ํ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์ˆ˜๋™ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.



์ฐธ์กฐ
https://javabom.tistory.com/60
https://aws.amazon.com/ko/getting-started/hands-on/send-messages-distributed-applications/
https://devblog.croquis.com/ko/2017-05-13-1-aws-serverless-1/