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

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


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

- kafka와 데이터를 주고 받기 위한 java libraray
- producer, consumer, admin, stream 등 API 제공
- 다양한 3rd party library 존재 (C/C++, Node.js, Python, .NET 등)
docker run -d -p 9092:9092 --name broker apache/kafka:latest

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


# 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

- 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에 반영하는 내용.
- 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)
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"}
MSA 개발에 유익한 서비스를 하나씩 학습하고 있는데, 실무에서 어떻게 유용하게 쓰이는 지 경험해보고싶습니다.