‡๐Ÿ‘ฉ‍๐Ÿ’ป ‡/ºSpring

[MSA] Apache Kafka (๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ) ์„œ๋ฒ„ ๊ตฌ์ถ•

Trudy | ์†ก์—ฐ 2024. 1. 11. 19:39

Apache Kafka ๋ž€?

 

Apache Kafka(์ดํ•˜ Kafka)๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ, ๋Œ€์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. Kafka๋Š” ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ „์†กํ•˜๊ณ , ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค. 

 

MSA๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ์ชผ๊ฐœ์ ธ ์žˆ๋‹ค. Kafka๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์— ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ๊ตฌ๋…ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋А์Šจํ•œ ๊ฒฐํ•ฉ(loose coupling)์„ ์ด‰์ง„ํ•˜๊ณ , ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

https://www.devkuma.com/docs/kafka/kafka-message-system.png

 


Kafka์˜ ๊ตฌ์„ฑ ์š”์†Œ 

 

ZooKeeper  : Kafka๊ฐ€ ์ฃฝ์—ˆ๋Š”์ง€ ์‚ด์•˜๋Š”์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋ฒ„

ZooKeeper๋Š” Apache Kafka์˜ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ธŒ๋กœ์ปค๋“ค ๊ฐ„์˜ ๋ฆฌ๋” ์„ ์ถœ, ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน๊ณผ ํŒŒํ‹ฐ์…˜ ํ• ๋‹น ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ฃผํ‚คํผ๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์กฐ์ • ๋ฐ ๋ฆฌ๋” ์„ ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Kafka ํด๋Ÿฌ์Šคํ„ฐ์˜ ์•ˆ์ •์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ์ฃผํ‚คํผ๋Š” Kafka ๋ธŒ๋กœ์ปค๊ฐ€ ๋ฌด์—‡์ด ๋ฆฌ๋”์ด๋ฉฐ, ์–ด๋–ค ํ† ํ”ฝ์ด ์–ด๋–ค ํŒŒํ‹ฐ์…˜์„ ๊ฐ€์ง€๋Š”์ง€ ๋“ฑ์„ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.


Kafka Broker : ๋ฉ”์„ธ์ง€ ํ ์„œ๋ฒ„ ์—ญํ• , ์ฃผํ‚คํผ์— ์ข…์†๋˜์–ด ์žˆ์Œ

Kafka ๋ธŒ๋กœ์ปค๋Š” Kafka ํด๋Ÿฌ์Šคํ„ฐ์—์„œ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ, ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ฐ ๋ธŒ๋กœ์ปค๋Š” ํŠน์ •ํ•œ ์ฃผํ‚คํผ(zookeeper) ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์„ฑ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
Kafka ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ธŒ๋กœ์ปค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๋ธŒ๋กœ์ปค๋“ค์ด ํ•จ๊ป˜ ํ˜‘๋ ฅํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง€ ์‹œ์Šคํ…œ์„ ํ˜•์„ฑํ•œ๋‹ค.


Producer : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐœ๋ฐœ, ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์—ญํ•  

Kafka ํ”„๋กœ๋“€์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Kafka ํ† ํ”ฝ์œผ๋กœ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ† ํ”ฝ์€ ๋ฐ์ดํ„ฐ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ”„๋กœ๋“€์„œ๋Š” ํŠน์ • ํ† ํ”ฝ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋“€์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Kafka ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ธŒ๋กœ์ปค๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ• ๋ฐ ๋ฉ”์‹œ์ง€์˜ ํ‚ค๋ฅผ ์ง€์ •ํ•˜๋Š” ๋“ฑ์˜ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


Consumer : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘๊ฐœ๋ฐœ, ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๋Š” ์—ญํ• 

Kafka ์ปจ์Šˆ๋จธ๋Š” ํŠน์ • ํ† ํ”ฝ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ปจ์Šˆ๋จธ๋Š” ํŠน์ • ํ† ํ”ฝ์˜ ํŒŒํ‹ฐ์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๊ณ , ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค. ๋˜ํ•œ, ์ปจ์Šˆ๋จธ๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์—ฌ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์–ด ๊ณ ๊ฐ€์šฉ์„ฑ ๋ฐ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.


 

Kafka ์„œ๋ฒ„ ๊ตฌ์ถ• 

- ๋ฆฌ๋ˆ…์Šค 2๋Œ€ (Zookeeper + Broker, Producer), ์ธํ…”๋ฆฌ์ œ์ด ํ”„๋กœ์ ํŠธ 1๊ฐœ (Consumer) 

 

๋ฆฌ๋ˆ…์Šค 1 (Zookeeper + Broker) 

1. ๋„คํŠธ์›Œํฌ ์„ค์ •

2. ์ž๋ฐ” ์„ค์น˜ openjdk11
3. wget ๋‹ค์šด

4. kafka ๋‹ค์šด ๋ฐ ์••์ถ• ํ’€๊ธฐ  ( tar -zvxf [ํŒŒ์ผ๋ช…] )
5. kafka ์••์ถ• ๊ณณ์—์„œ Zookeeper ์‹คํ–‰

./bin/zookeeper-server-start.sh ./config/zookeeper.properties

 

6. ์„œ๋ฒ„ ํ•œ๊ฐœ ๋” ํ‚ค๊ณ , kafka ์••์ถ• ํ‘ผ ๊ณณ์—์„œ Kafka์‹คํ–‰

./bin/kafka-server-start.sh ./config/server.properties

๋ฆฌ๋ˆ…์Šค 2 (Producer

1. ๋„คํŠธ์›Œํฌ ์„ค์ •

2. ์ž๋ฐ” ์„ค์น˜ openjdk11
3. wget ๋‹ค์šด

4. kafka ๋‹ค์šด ๋ฐ ์••์ถ• ํ’€๊ธฐ  ( tar -zvxf [ํŒŒ์ผ๋ช…] )

5. Kafka ์„ค์ • ํŒŒ์ผ config/server.properties ์ˆ˜์ •

         advertise ๋ถ€๋ถ„ ์ฃผ์„ ์ œ๊ฑฐํ•˜๊ณ , broker IP์ฃผ์†Œ ์จ์ฃผ๊ธฐ
6. kafka ์••์ถ• ๊ณณ์—์„œ Producer ์‹คํ–‰


./bin/kafka-console-producer.sh --bootstrap-server [๋ฆฌ๋ˆ…์Šค 1 IP์ฃผ์†Œ]:9092 --topic emailcert --property "parse.key=true" --property "key.separator=:"



MSA ํ”„๋กœ์ ํŠธ (Consumer)

 

1. application.yml  Kafka ์„ค์ • ์ถ”๊ฐ€

spring:
  kafka:
    consumer:
      bootstrap-servers: [๋ฆฌ๋ˆ…์Šค1 IP์ฃผ์†Œ]:9092

 

2. pom.xml ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ 

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.8.11</version>
        </dependency>

 

3. CreateEmailCertConsumer.java 

package com.example.demo.emailcert.adapter.kafka;

import com.example.demo.common.ExternalSystemAdapter;
import com.example.demo.emailcert.application.port.in.CreateEmailCertCommand;
import com.example.demo.emailcert.application.port.in.CreateEmailCertUseCase;
import com.example.demo.emailcert.application.port.out.CreateEmailCertPort;
import com.example.demo.emailcert.application.service.CreateEmailCertService;
import com.example.demo.emailcert.domain.EmailCert;
import lombok.RequiredArgsConstructor;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;

@ExternalSystemAdapter
@RequiredArgsConstructor
public class CreateEmailCertConsumer {
    private final CreateEmailCertUseCase createEmailCertUseCase;

    @KafkaListener(topics = "emailcert", groupId = "emailcert-group-00")
    void createEmailCert(ConsumerRecord<String, String> record){

        System.out.println(record.toString());
        createEmailCertUseCase.createEmailCert(CreateEmailCertCommand.builder()
                        .email(record.value())
                        .build());

    }
}

 

์‹คํ–‰๊ฒฐ๊ณผ 

 

์œ„์™€ ๊ฐ™์ด ์‹ค์Šตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๊ฐœ์˜ ์ฐฝ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

Producer๊ฐ€ ์•Œ๋งž๊ฒŒ ์‹คํ–‰๋˜๋ฉด 

> ๋กœ ์ฝ˜์†”์ฐฝ์ด ๋œฌ๋‹ค. Producer์„ ์‹คํ–‰ํ•  ๋•Œ --topic ์˜ต์…˜์œผ๋กœ "emailcert"๋ฅผ ์ฃผ์–ด์„œ ํ† ํ”ฝ์„ ์ฐพ์•„๊ฐ€๋„๋ก ํ–ˆ๊ณ , ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก --property ์˜ต์…˜์œผ๋กœ parse.key=true --property key.seperator=:  ๋ฅผ ์ฃผ์—ˆ๋‹ค. 

email:tatpo0o0o0o0@gmail.com ์„ ์ž…๋ ฅ์„ ๋„ฃ์–ด์ฃผ๋ฉด, : ๋กœ ํŒŒ์‹ฑ๋˜์–ด DB์— ์ž˜ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์œ„๋Š” ์ธํ…”๋ฆฌ์ œ์ด(Consumer)์—์„œ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ณ , DB๋กœ ์ €์žฅ๊นŒ์ง€ ๋˜๋Š” ๊ฒƒ์„ ๋กœ๊ทธ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 


[์ฐธ๊ณ ]

https://velog.io/@holicme7/Apache-Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

[Apache Kafka] ์นดํ”„์นด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์นดํ”„์นด, ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ์˜ ์ตœ๊ฐ•์ž ์ฑ…์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์“ด ์ •๋ฆฌ ๊ธ€ ์ž…๋‹ˆ๋‹ค.์นดํ”„์นด(Kafka)๋Š” ํŒŒ์ดํ”„๋ผ์ธ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„, ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ๋ฐ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ๋ถ„์‚ฐ ์ด๋ฒคํŠธ

velog.io