[LG CNS AM Inspire CAMP 1기] MSA (6) - 데이터 동기화를 위한 메세지 브로커 (Kafka) 활용

니니지·2025년 3월 11일

LG CNS AM Inspire Camp 1기

목록 보기
38/47

INTRO

안녕하세요, 오늘은 다양한 환경에서 MSA 서비스가 기동 될 경우 데이터가 분산 저장되고 동기화 되지 않는 문제를 해결하기 위해, 메세지 브로커인 kafka를 활용하는 방법을 학습했습니다. MSA 개발 시 전체 서비스 동기화가 중요하기 때문에 구현 과정을 잘 알아두어야합니다.

1. Kafka vs RabbitMQ

2. 카프카

  • 메세지 브로커 중 실무에서 가장 많이 사용.
  • 데이터 동기화를 위한 용도로 실습했으나, 사실은 메세지를 전달하는 (메세지 브로커) 역할이 주가 됨.
  • scala 언어로 링크드인에서 개발, confluent 운영.

- 데이터 처리 흐름

- 브로커 (데이터 실행 서버)

* 카프카 클러스터 (브로커는 3개 이상의 홀수 개로 구성하는 걸 권장)

: 파티션에 나누어 문자 데이터 저장 -> 안전하지만 속도가 떨어질 수 있음.

- kafka client

  • kafka와 데이터를 주고 받기 위한 java libraray
  • producer, consumer, admin, stream 등 API 제공
  • 다양한 3rd party library 존재 (C/C++, Node.js, Python, .NET 등)

- kafka 실행 (도커 환경)

docker run -d -p 9092:9092 --name broker apache/kafka:latest

- 발행 vs 사용

  • 발행: 생산-producer-publisher-pub (양방향 처리 가능)
  • 사용: 소비-consumer-subscriber-sub

3. 실습

- 1 producer, 3 consumer

- producer 셋팅

- 명령어 모음

# producer
kafka-topics.bat --create --topic quickstart-events --bootstrap-server localhost:9092 --partitions 1
kafka-topics.bat --bootstrap-server localhost:9092 --list
kafka-topics.bat --bootstrap-server localhost:9092 --describe --topic quickstart-events

# consumer
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic quickstart-events --from-beginning
kafka-console-consumer.bat --bootstrap-server localhost:9092 --partition 0 --offset 1 --topic quickstart-events

# producer
kafka-console-producer.bat --bootstrap-server localhost:9092 --topic quickstart-events

4. 예제 서비스 (catalog/user/order-service) 연동

4-1. catalog-service

- KafkaConsumerConfig

[BOOTSTRAP_SERVERS_CONFIG]
  • docker 환경의 BOOTSTRAP_SERVERS_CONFIG 설정을 위해 IP Address 이해하기
# 도커 컨테이너 리스트 확인 (kafka 의 도메인 name 복사)
docker ps -a
# kafka의 IP Adress 확인 (kafka 의 도메인 name 붙여넣기)
docker inspect {kafka domain name}

로컬에서 돌릴 땐 CONFIG 값 127.0.0.1 로 했으나
order-service에서 지정 시 kafka의 IP Address로 바꿔줘야 함. (예제: 172.17.0.2)
단, kafka와 service 들이 모두 같은 NW 환경에 있어야 함.

[AUTO_OFFSET_RESET_CONFIG]

earliest : 가장 처음 값 부터 가져와라, default : latest = 최신 값 부터 가져와라.

[KEY_DESERIALIZER_CLASS_CONFIG], [VALUE_DESERIALIZER_CLASS_CONFIG]

deserializer 된 것을 확인 가능.

- KafkaConsumer

topic 의 변동사항 자동 감지하여 실행되는 코드.
아래 예시는 로그 찍은 후 값을 읽어와 repository에 반영하는 내용.

4-2. order-service

- KafkaProducerConfig

[BOOTSTRAP_SERVERS_CONFIG]

우선은 127.0.0.1 로 지정했으나, docker 배포 시 kafka 주소로 바꿔야 함.

[KEY_SERIALIZER_CLASS_CONFIG], [VALUE_SERIALIZER_CLASS_CONFIG]

serializer 된 것을 확인 가능.

- KafkaProducer

kafka 데이터 전송을 위해 kafkaTemplate 객체 주입, send 메서드에서 토픽과 데이터를 받아 전송함.
아래 예시는 send 처리 전 데이터를 string 으로 변환하는 작업 진행.
send 후 변경 및 전송된 문자열 로그 찍음.

- OrderController

kafka에 메세지 보내는 코드 추가. (line 68)

4-3. 정상 작동 로그

order-service

catalog-service

C:\Work\kafka\bin\windows>kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic example-catalog-topic --from-beginning

C:\Work\kafka\bin\windows>kafka-console-producer.bat --bootstrap-server localhost:9092 --topic example-catalog-topic

{"productId":"CATALOG-001","qty":10,"unitPrice":1000,"totalPrice":10000,"orderId":"test-order-id-dummy-id","userId":"8b2c437c-c8b2-42eb-b9ff-3aa8ee4cac1e"}

OUTRO

MSA 개발에 유익한 서비스를 하나씩 학습하고 있는데, 실무에서 어떻게 유용하게 쓰이는 지 경험해보고싶습니다.

profile
지니니

0개의 댓글