[AWS] MSK (Managed Streaming for Kafka)
MSK๋ ๋ฉ์ธ์ง ํ์ธ ์นดํ์นด๋ฅผ ์ ๊ณตํ๋ ์๋น์ค๋ค.
Managed Streaming for Kafka์ ์ค๋ง์ด๋ค. ์ด๋ฆ ์ง์ง ๋ชป์ง๋๊ฑฐ ๊ฐ๋ค.
๋์ผํ๊ฒ ์นดํ์นด๋ฅผ ๋์์ฃผ๋ ์์ ๊ด๋ฆฌํ ์๋น์ค๋ก ํค๋ค์์ค๊ฐ ์๋ค.
๊ฐ์ ์ฅ๋จ์ ์ด ์์ผ๋ ์ฉ์ฒ์ ๋ง๊ฒ ์ ํํ๋ฉด ๋๋ค.
https://blog.naver.com/sssang97/222998247667
๋น์ฉ
๋น์ฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ฌ์คํฐ๊ฐ ์ฌ๋ผ๊ฐ์๋ ์๊ฐ, ์ ์ฅ์ ๋ฑ์ผ๋ก ๋ถ๊ณผ๋๋ค.
ํ๋ก๋น์ ๋๊ณผ ์๋ฒ๋ฆฌ์ค ๋ชจ๋๊ฐ ์๋ค.
ํ๋ก๋น์ ๋ ์๊ธํ๋ค.

ํ๋ก๋น์ ๋์ ๊ฐ์ฅ ์์ ์ฌ์ด์ฆ๋ก ํด๋ ํ๋ฌ 40๋ฌ๋ฌ๋ ๋์ค๊ณ , ์คํ ๋ฆฌ์ง๋ GB๋น 0.114 ๋ฌ๋ฌ๊ฐ ๋์จ๋ค.
๋ฌธ์ ๋, MSK๋ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ๋์ฐ๋๊ฒ ์๋๋จ ๊ฒ์ด๋ค. ๊ณ ๊ฐ์ฉ์ฑ์ ๊ฐ์ ํด์ ๋ฌด์กฐ๊ฑด 2๊ฐ ์ด์์ ๋์์ผ ํ๋ค.
๊ทธ๋์ ์ต์ ์ต์
์ผ๋ก ํ๊ฐ ๋์ ์ ๋์ ๊ธฐ๋ณธ๋น์ฉ์ ์ฌ์ค์ ํ๋ฌ 80๋ฌ๋ฌ๋ค.
์๋ฒ๋ฆฌ์ค์ ๊ฒฝ์ฐ์๋ ์์ธ ๋ฆฌ์ ์ด ์ง์๋์ง ์์..์๋๋ฐ, 2๋ฌ์ ๋ถํฐ ์ง์ํ๊ธฐ ์์ํ๋ค.
๊ต์ฅํ ๋น์ผ ํธ์ด๋ค.
๋ค๋ฅธ๊ฑฐ ๋ฐ์ง์ง ์๊ณ ํด๋ฌ์คํฐ 1๊ฐ ๋ ์๋ ์๊ฐ๋ง ์ธ์ด๋ด๋, ํ๋ฌ์ 662๋ฌ๋ฌ๊ฐ ๋์จ๋ค.
์๋ฒ๋ฆฌ์ค ํ๋์ ์ฅ์ ์ด ํ๋ ฅ์ ์ผ๋ก ๋น์ฉ์ ์ ๊ฐํ ์ ์๋ค๋๊ฑด๋ฐ, ๋ณ๋ก ๊ทธ๋ฐ ๋ถ๋ถ์์ ๋ฉ๋ฆฌํธ๊ฐ ๋ณด์ด์ง ์๋ ๊ฒ ๊ฐ๋ค.
์์ธํ๊ฑด ์๊ธํ๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
https://aws.amazon.com/ko/msk/pricing/
ํด๋ฌ์คํฐ ์์ฑ
์์ฑ ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ด๋ฐ ์ฐฝ์ด ๋ฌ๋ค.

๋น ๋ฅธ ์์ฑ์ผ๋ก ๋์ถฉ ์์ฑํ๋ฉด
๋์ถฉ ์ด๋ ๊ฒ ์์ฑ์ด ๋๋ค.
๊ทธ๋๋ก ๋ง๋ค์๋ค๊ฐ๋ ์ฐธ์ผ๋ก ๊ณค๋ํ ์ํฉ์ ์ฒํ๊ธฐ ์ฌ์ฐ๋, ๋๋๋ก ์ฌ์ฉ์ ์ง์ ์์ฑ์ผ๋ก ๋ง๋๋ ํธ์ ์ถ์ฒํ๋ค.
์ฐธ๊ณ ๋ก, ์ด๊ฑด ์จํ๋ ๋ฏธ์ค kafka์ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ๋ฉด ๊ณค๋ํ๋ค.
ํผ๋ธ๋ฆญ ์๋ํฌ์ธํธ๋ฅผ ์ด ์๋ ์๋๋ฐ, ๊ทธ๋ฌ๋ ค๋ฉด ๊ฐ์ ๋ก IAM ๊ฐ์ ๋ณด์ ์ต์
์ ์ผ์ผ ํ๋ค.
๋๋๋ก์ด๋ฉด VPC ์์์๋ง ์ฐ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์ด๋ฆ ์ง๊ณ
์๊ธ ํญํ์ ๋ง๊ณ ์ถ์ง ์๋ค๋ฉด, ํ๋ก๋น์ ๋์ผ๋ก ํ๋ค.
์์ญ์ 2๊ฐ๋ก๋ง ํ์.
๊ตณ์ด 3๊ฐ๋ก ํ ํ์๊ฐ ์๋ ์ถ๋ค.
์คํ ๋ฆฌ์ง๋ ์ ๋นํ ์ค๋ค.
์คํ ๋ฆฌ์ง ํฌ๊ธฐ๋ ๋์ผ ์๋ง ์๊ณ ์ค์ผ ์๋ ์์ผ๋, ๊ทธ์ ์ ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ VPC์ ์๋ธ๋ท์ ์ ๋นํ ๊น์์ค๋ค.
ํผ๋ธ๋ฆญ ์ก์ธ์ค๊ฐ ํ์ํ๋ค๋ฉด ์ฌ๊ธฐ์ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ๊ณจ๋ผ์ค์ผ ํ๋ค.
๋ณด์๊ทธ๋ฃน๋ ์ ๋นํ ๊ณจ๋ผ์ค๋ค.
ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ ์ด๊ธฐ ์์ฑ๋๋ ์ง์ ํ์ง ๋ชปํ๊ณ , ์์ฑ ํ์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ ํด์ ํ์ฑํ๋ฅผ ํด์ค์ผ ํ๋ค.
์ด๊ฒ ์ค์ํ๋ค.
ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ฅผ ํ์ฉํ๋ ค๋ฉด ์ฌ๊ธฐ์ ์ธ์ฆ ๋ฐฉ๋ฒ์ ํ๋ ์ด์ ์ ํํด์ผ ํ๋ค.
ํ๋ผ์ด๋น ์ก์ธ์ค๋ง ํ ๊ฑฐ๋ผ๋ฉด "์ธ์ฆ๋์ง ์์ ์ก์ธ์ค"๋ฅผ ์ผ๋ ์ข๋ค.
๊ธฐ๋ณธ์ค์
๊ทธ๋ฆฌ๊ณ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ฉด ์ต๋ 15๋ถ ์์ ์์ฑ์ด ์๋ฃ๋๋ค๊ณ ํ๋๋ฐ, ๋ค ๊ฐ๋ปฅ์ด๋ค.
๋๋ 40๋ถ์ฏค ๊ฑธ๋ ธ๋ค.
์ฌ์ง์ด ๋ญ ์ค์ ํ๋ ๋ฐ๊ฟ๋๋ง๋ค ์
๋ฐ์ดํธ๋ ๊ทธ์ ๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์กฐ๊ธ์ด๋ผ๋ ๋ ๋ฏ์ด๋จน์ผ๋ ค๊ณ ์ผ๋ถ๋ฌ ์ด๋ฌ๋๊ฑด๊ฐ?
์์ฑ์ด ์๋ฃ๋๋ฉด ์ด๋ฆฌ ๋ฌ๋ค.
ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ฅผ ์ผ๋ ค๋ฉด ํธ์ง์ฐฝ์ผ๋ก ์ง์ ํด์ ์ด๋ ๊ฒ ์ฒดํฌ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.

ํผ๋ธ๋ฆญ ์ก์ธ์ค๊ฐ ํ์ฑํ๋๋ฉด ์ด๋ฐ ์์ผ๋ก ํผ๋ธ๋ฆญ ์๋ํฌ์ธํธ๊ฐ ์ด๋ฆฌ๊ณ

ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ฅผ ์ฐ์ง ์๋๋ค๋ฉด ์ ํ๋ผ์ด๋น ์๋ํฌ์ธํธ๋ง์ ์ฐ๋ฉด ๋๋ค.

์ฌ์ฉ๋ฒ (Node.js)
ํ๋ฒ ๋ฉ์ธ์ง๊ฐ ์ ์ค๊ฐ๋ ํ
์คํธ๋ ํด๋ณด์.
๋๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค๋ฅผ ๊บผ๋จ๊ธฐ ๋๋ฌธ์, VPC ๋ด์์ ์ ์์ ํด์ผ๋ง ํ๋ค.
Kafka์ ๊ฑฐ์ ๋ค ํธํ์ด ๋๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ๋ฒ๋ ๊ฑฐ์ ๊ฐ๋ค.
์๋๋ ํ ํฝ์ ๋ช
์์ ์ผ๋ก ์์ฑํ๋ ์ฝ๋๋ค.
const { Kafka } = require("kafkajs");
async function main() {
const kafka = new Kafka({
clientId: "test-producer",
brokers: [
"b-1.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
"b-2.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
],
});
console.log("client connected");
const admin = kafka.admin();
await admin.connect();
console.log("admin connected");
await admin.createTopics({
waitForLeaders: false,
topics: [
{
topic: "test_topic1",
},
],
});
console.log("topic created");
}
main();

์ด๊ฑด ์ปจ์๋จธ
const { Kafka } = require("kafkajs");
async function main() {
const kafka = new Kafka({
clientId: "test-producer",
brokers: [
"b-1.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
"b-2.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
],
});
const consumer = kafka.consumer({ groupId: "test-group" });
// ์ ์
await consumer.connect();
// ๊ตฌ๋
await consumer.subscribe({ topic: "test_topic1", fromBeginning: false });
// ์คํ
await consumer.run({
// ๋ฉ์ธ์ง๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ํธ์ถ๋จ
eachMessage: async ({ topic, partition, message }) => {
console.log(`# topic ${topic}, partition ${partition}`);
console.log({
value: message.value.toString(),
});
},
});
}
main();
์ด๊ฑด ํ๋ก๋์๋ค.
const { Kafka } = require("kafkajs");
async function main() {
const kafka = new Kafka({
clientId: "test-producer",
brokers: [
"b-1.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
"b-2.testcluster.t2n3y6.c3.kafka.ap-northeast-2.amazonaws.com:9092",
],
});
const producer = kafka.producer();
// ์ ์
await producer.connect();
// ๋ฉ์ธ์ง ์ ์ก
await producer.send({
topic: "test_topic1",
messages: [
{ value: JSON.stringify({ user_id: 1, message: "์๋
ํ์ธ์" }) },
],
});
}
main();
์ปจ์๋จธ ์คํํ๊ณ

ํ๋ก๋์๋ฅผ ์คํํด์ ๋ฉ์ธ์ง๋ฅผ ๋ ๋ฆฌ๋ฉด

์ ๋ ๋ผ์ฌ ๊ฒ์ด๋ค.

์ฐธ์กฐ
https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html
https://blog.naver.com/sssang97/222889537359
https://stackoverflow.com/questions/60543419/amazon-kinesis-vs-aws-manage-service-kafka-msk-connect-from-on-prem