본문 바로가기

Spring

[Spring] 비동기 통신과 데이터 동기화를 위한 카프카 활용 (1)

2023.03.19 - [Spring] - [Spring] MSA 프로젝트 만들기 (1)

 

[Spring] MSA 프로젝트 만들기 (1)

2023.02.28 - [Server] - [Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA) [Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA) 이번에 블록체인 기반의 프로젝트를 진행하게 되었는데

keylog.tistory.com

이전에 MSA 프로젝트를 개발 할때 OpenFeign 라이브러리를 사용하여 동기 방식으로 마이크로 서비스들 간에 내부 통신을 구현했는데 이제 비동기 방식으로 통신하고 동일한 기능을 가진 마이크로 서비스들 간에 데이터를 동기화 하기 위해 카프카에 대해서 정리하고 적용해보려고 합니다.

Apache Kafka

Apache Kafka는 Apache Software Foundation의 Scalar 언어로 된 오픈 소스 메시지 브로커 프로젝트 입니다. 메시지 브로커란 특정한 리소스(서비스, 시스템)에서 다른 리소스로 메시지를 전달할 때 사용하는 메시지 서버로 단순한 텍스트 뿐만 아니라 json, xml, Object 등 다양한 형태의 데이터를 전달할 수 있습니다.

 

Kafka를 사용하기 전에는 아래 예시와 같이 End-to-End 방식으로 아키텍처들이 연결되어 있었는데 이렇게 되면 데이터 연동의 복잡성이 증가하고 확장이 어려워집니다.

 

그래서 모든 리소스로 부터 데이터를 실시간으로 전송하여 처리할 수 있고 확장을 용이하게 할수 있게 하기 위해 관계형 데이터베이스나 애플리케이션과 같은 다른 여러 시스템 사이에 Kafka를 두고 이 Kafka를 통해 데이터를 전달해 주는 구조로 변경할 계획입니다.

Kafka 설치하기

http://kafka.apache.org

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

먼저 위 링크를 통해 kafka를 설치해줍니다.

kafka는 Window 버전 Linux 버전 mac OS 버전 등 OS에 따라 따로 배포하지 않습니다. 대신 최신 버전을 설치하면 그 안에 Window, Linux, max OS 커맨드가 모두 들어가 있습니다.

 

 

설치를 완료했으면 위와 같이 kafka가 설치된 폴더에 접근하고 tar svf kafka_2.13-2.7.0.tgz 명령어를 사용해 압축을 해제해 줍니다.
압축을 해제한 후 해당 폴더에서 config 폴더에 접근하면 아래와 같은 설정 파일 목록을 확인할 수 있습니다.

 

 

이번에는 bin 폴더를 확인해 보면 아래와 같이 sh 파일과 windows 폴더를 확인할 수 있습니다. 이전에 말씀 드렸듯이 kafka는 os에 따라 따로 배포를 하지 않기 때문에 아래와 같이 Linux와 mac OS 를 위한 sh 파일과 Windows 를 위한 bat 파일을 한번에 다운 받습니다.

bat 파일은 windows 폴더 안에 있습니다.

 

카프카 사용해보기

카프카를 사용 하기 위해서는 먼저 카프카를 관리해주는 zookeeper 서버를 실행해주어야 합니다.

zookeeper란 분산 애플리케이션을 관리하기 위한 코디네이션 시스템입니다. 분산 애플리케이션이 안정적인 서비스를 할 수 있도록 분산되어 있는 각 애플리케이션의 정보를 중앙에 집중하고 구성 관리, 그룹 관리 네이밍, 동기화 등의 서비스를 제공해줍니다.

 

Broker를 하나의 kafka 서버라고 했을 때 위 사진과 같이 zookeeper가 여러대의 kafka application server를 관리해주고 메시지를 공유해 줌으로써 하나의 kafka 서버에서 문제가 생겼을 때 다른 kafka 서버를 통해 메시지를 사용할 수 있도록 해줍니다.


그러면 터미널에서 Kafka를 사용해보기 위해 아래 명령어들을 입력하여 zookeeper 서버, kafka 서버, 메시지를 보내는 역할의 Producer와 받는 역할을 할 Consumer를 실행시켜 줍니다.

 

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

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

 

카프카는 기본적으로 Producer가 메시지를 보내면 토픽에 메시지가 저장됩니다. 그리고 나서 토픽에 저장된 메시지는 해당 토픽을 등록한 Consumer에게 일괄적으로 전달됩니다. 그렇기 때문에 Producer와 Consumer를 생성하기 전에 먼저 아래 명령어로 토픽을 생성해 줍니다.

 

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic quickstart-events  --partitions 1

이때 뒤에 --partitions 속성은 멀티 클러스트링을 구성했을 때 토픽에 저장되어 있는 메시지를 몇군데 저장할 건지 지정하는 옵션입니다.

 

토픽 생성 후 ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list 명령어로 리스트를 확인해 보면 아래와 같이 quickstart-events 라는 이름이로 토픽이 하나 생성된 것을 확인할 수 있습니다.

토픽을 생성 했으면 이어서 Producer와 Consumer를 생성해줍니다.

./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic quickstart-events

./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic quickstart-events --from-beginning

 

위 명령어들을 제대로 입력했으면 아래와 같이 4개의 터미널이 실행중인 것을 확인할 수 있습니다.

(왼쪽 위부터 시계방향으로 zookeeper server, kafka server, consumer, producer)

 

 

그런 다음 producer에서 메시지를 입력하면 아래와 같이 producer와 같은 토픽에 연결된 consumer가 메시지를 받는 것을 확인할 수 있습니다.

 

 

여기까지 kafka를 설치하고 터미널을 사용해서 zookeeper, kafka, producer, consumer를 실행한 뒤 간단한 메시지를 주고받는 것 까지 해보았습니다. 다음 글에서는 카프카와 데이터베이스를 연동하기 위한 kafka connect를 사용해보고 데이터를 동기화 해준 뒤 테스트하는 과정까지 한번 알아보겠습니다.