ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ NestJS + Kubernetes & ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐฐํฌ: ์‹ค์ „ ๊ฐ€์ด๋“œ

25. NestJS + Kafka ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ


๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” Kafka์™€ ๊ฐ™์€ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
Kafka๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์†์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” NestJS์™€ Kafka๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ ,
Kafka์™€ NestJS๋ฅผ Kubernetes ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์šด์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๐ŸŒ


โœ… 1. Kafka ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ

[Producer] → [Kafka Topic] → [Consumer] → [NestJS Service] → [Database/Storage]

๐Ÿ’ก Kafka์˜ ์—ญํ• 

  • ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ๋ฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ
  • ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

โœ… 2. Kafka ์„ค์น˜ ๋ฐ ์„ค์ •

๐Ÿ”ธ ๋กœ์ปฌ Docker Kafka ์„ค์น˜ (Bitnami ์ด๋ฏธ์ง€)

docker run -d --name kafka-server \
  -p 9092:9092 -p 2181:2181 \
  -e ALLOW_PLAINTEXT_LISTENER=yes \
  bitnami/kafka:latest

๐Ÿ’ก Kafka UI ๊ด€๋ฆฌ ๋„๊ตฌ:

docker run -d -p 9000:9000 \
  -e KAFKA_BROKERS=kafka-server:9092 \
  provectuslabs/kafka-ui:latest

โœ… 3. NestJS + Kafka ๊ธฐ๋ณธ ์„ค์ •

๐Ÿ”ธ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜

npm install @nestjs/microservices kafkajs

๐Ÿ“‚ Kafka ๋ชจ๋“ˆ ๊ตฌ์„ฑ

๐Ÿ“‚ kafka/kafka.module.ts

import { Module } from '@nestjs/common';
import { KafkaService } from './kafka.service';

@Module({
  providers: [KafkaService],
  exports: [KafkaService],
})
export class KafkaModule {}

๐Ÿ“‚ Kafka ์„œ๋น„์Šค ๊ตฌํ˜„

๋ฐ˜์‘ํ˜•

๐Ÿ“‚ kafka/kafka.service.ts

import { Injectable, OnModuleInit } from '@nestjs/common';
import { Kafka, Consumer, Producer } from 'kafkajs';

@Injectable()
export class KafkaService implements OnModuleInit {
  private producer: Producer;
  private consumer: Consumer;

  async onModuleInit() {
    const kafka = new Kafka({
      clientId: 'nestjs-kafka-client',
      brokers: ['localhost:9092'],
    });

    this.producer = kafka.producer();
    this.consumer = kafka.consumer({ groupId: 'nestjs-group' });

    await this.producer.connect();
    await this.consumer.connect();

    await this.consumer.subscribe({ topic: 'nestjs-topic', fromBeginning: true });
    await this.consumer.run({
      eachMessage: async ({ topic, partition, message }) => {
        console.log(`Received message: ${message.value.toString()}`);
      },
    });
  }

  async sendMessage(topic: string, message: string) {
    await this.producer.send({
      topic,
      messages: [{ value: message }],
    });
  }
}

โœ… 4. Kafka ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ฐ ์ˆ˜์‹ 

๐Ÿ“‚ API ํ˜ธ์ถœ ์˜ˆ์‹œ (์ปจํŠธ๋กค๋Ÿฌ)

๐Ÿ“‚ app.controller.ts

@Controller('kafka')
export class AppController {
  constructor(private readonly kafkaService: KafkaService) {}

  @Post('send')
  async sendMessage(@Body('message') message: string) {
    await this.kafkaService.sendMessage('nestjs-topic', message);
    return { status: 'Message sent' };
  }
}

๐Ÿ’ก ์š”์ฒญ ์˜ˆ์‹œ

curl -X POST http://localhost:3000/kafka/send -d '{"message": "Hello Kafka"}' -H "Content-Type: application/json"

โœ… 5. Kafka์™€ Kubernetes ์—ฐ๋™

๐Ÿ“‚ Helm์œผ๋กœ Kafka ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install kafka bitnami/kafka

๐Ÿ“‚ Kafka ์„œ๋น„์Šค ํ™•์ธ

kubectl get pods
kubectl get svc

๐Ÿ“‚ Kubernetes์šฉ Kafka ์„ค์ •

๐Ÿ“‚ config/kafka-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: kafka-config
data:
  KAFKA_BROKER: kafka:9092

๐Ÿ“‚ deployment.yaml

env:
  - name: KAFKA_BROKER
    valueFrom:
      configMapKeyRef:
        name: kafka-config
        key: KAFKA_BROKER

โœ… 6. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์˜ˆ์‹œ

๋ฐ์ดํ„ฐ ์œ ํ˜• Kafka ํ† ํ”ฝ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ user-login ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ถ„์„ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
์ฃผ๋ฌธ ์ƒ์„ฑ order-created ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ๊ฒฐ์ œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
AI ๋ถ„์„ ๊ฒฐ๊ณผ ai-results ๋ชจ๋ธ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ DB์— ์ €์žฅ ๋ฐ ๋Œ€์‹œ๋ณด๋“œ ํ‘œ์‹œ

๐Ÿ“‚ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๋กœ์ง (NestJS)

๐Ÿ“‚ order-consumer.service.ts

@ConsumerService('order-created')
export class OrderConsumerService {
  async handleMessage(message: string) {
    console.log(`Order Received: ${message}`);
    // ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง
  }
}

โœ… 7. Kafka ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์šด์˜ ์ „๋žต

ํ•ญ๋ชฉ ๋„๊ตฌ

๋ธŒ๋กœ์ปค ์ƒํƒœ ํ™•์ธ Kafka UI, Kafka Manager
๋ฉ”์‹œ์ง€ ๋ชจ๋‹ˆํ„ฐ๋ง Kafka-UI, Prometheus + Grafana
์žฅ์•  ๋Œ€์‘ Kafka MirrorMaker, Multi-Broker ๊ตฌ์„ฑ
๋กœ๊ทธ ์ˆ˜์ง‘ ELK ์Šคํƒ (Elasticsearch, Logstash, Kibana)

โœ… 8. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํ™œ์šฉ ์‚ฌ๋ก€

  1. ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ: ์‹ค์‹œ๊ฐ„ ์œ ์ € ํ–‰๋™ ๋กœ๊ทธ ์ˆ˜์ง‘
  2. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ: ๋กœ๊ทธ ์ˆ˜์ง‘ → Kafka → ๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ์Šคํ…œ
  3. ์•Œ๋ฆผ ์„œ๋น„์Šค: ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ํ‘ธ์‹œ ์•Œ๋ฆผ
  4. AI ์‹ค์‹œ๊ฐ„ ์ถ”๋ก  ๊ฒฐ๊ณผ: Kafka๋กœ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ „๋‹ฌ

โœ… ๊ฒฐ๋ก : Kafka ๊ธฐ๋ฐ˜ NestJS ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์™„์„ฑ

โœ… Kafka๋ฅผ ํ†ตํ•ด ๋Œ€์šฉ๋Ÿ‰ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌ
โœ… NestJS์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„
โœ… Kubernetes์— Kafka๋ฅผ ๋ฐฐํฌํ•˜์—ฌ ํ™•์žฅ์„ฑ ํ™•๋ณด
โœ… Kafka ํด๋Ÿฌ์Šคํ„ฐ์™€ NestJS ๊ฐ„์˜ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ๊ตฌ์กฐ ์ตœ์ ํ™”

๋‹ค์Œ ๊ธ€์—์„œ๋Š” NestJS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ GraphQL API๋ฅผ ๊ณ ๋„ํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ „๋žต์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ’ก


๐Ÿ” ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ : NestJS GraphQL ์„ฑ๋Šฅ ์ตœ์ ํ™” – ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ๊ณผ ์บ์‹ฑ ์ „๋žต

๐Ÿ“Œ ๋‹ค์Œ ํŽธ: 26. NestJS GraphQL ๊ณ ์„ฑ๋Šฅ API ๊ตฌ์ถ•


 

NestJS Kafka,NestJS ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ,NestJS ์ŠคํŠธ๋ฆฌ๋ฐ,NestJS Kafka ํด๋Ÿฌ์Šคํ„ฐ,NestJS Kafka ์„ค์ •,NestJS Kafka Kubernetes,NestJS Kafka Helm,NestJS Kafka Consumer,NestJS Kafka Producer,NestJS ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•