[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/