[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