본문으로 바로가기


(Kafka는 위 사진처럼 Producer들이 Kafka 클러스터에 요청을 보내면, 구독하고 있던 Consumer들이 해당 정보를 받아볼 수 있다)


일반적으로 Monolithic Architecture에서 Microservice Architecture로 옮겨갈 때 가장 문제가 되는 부분이 바로 데이터 동기화 문제이다. MSA는 많은 장점을 가지고 있지만 그만큼 단점 또한 존재한다. 이번 포스팅에서는 그 중 하나인 "데이터 동기화 문제"에 대해 다뤄본다.


수많은 MSA 어플리케이션이 존재하고 동일하게 같은 데이터를 필요로 한다면 어떻게 할까. 각 서버에서 API 엔드포인트를 열어놓고 HTTP Request를 통해 받아오는것도 하나의 방법이지만 중복된 데이터를 각 어플리케이션에 맞게 가공하여 들고있는 것 또한 하나의 방법이다. 그렇다면 데이터 동기화는 어떻게 진행해야할까. 그럴 때 바로 Event Bus를 사용하면 된다.



조금 다른 사진이긴 하지만, Kafka는 자체적으로 Partition중 가장 부하가 낮은 곳으로 데이터를 보낸다. 해당 Partition은 Consumer로 데이터를 보내는 형태인데, 중요한점은 중복이 발생하지 않고, Fail-over에 대해 자체적으로 대응해준다는 것이다. Kafka의 흐름을 간단하게 설명해보자면 다음과 같다.


1. 구독을 위한 특정한 Topic을 생성

2. Consumer는 Topic을 구독

3. Producer는 Topic에 데이터를 전송

4. Consumer는 Topic에 전송된 데이터를 수신


위 흐름대로 간단한 MSA구조를 그림으로 그려본다면 아마 아래와 같을 것이다.


(위 사진은 흐름만 표현하기 위해 정말 간단하게 그린 예제로써 실제와는 많이 다르다)


먼저 유저는 요청을 보낸다. 요청은 토큰 인증등의 행위를 위해 API Gateway를 거치고, Kafka에 데이터를 전송한다. Kafka는 특정 Topic을 구독하고 있던 어플리케이션들(Consumer)에게 데이터를 보내준다. 만약 위에 그려져있는 4개의 MSA들이 모두 같은 소스를 필요로 한다고 가정할 때 위와 같은 흐름대로 서비스를 구성한다면 동시에 동일한 데이터를 보유할 수 있다. 조금 더 자세하게 작성하려고 했지만 이미 인터넷에 수많은 좋은 자료들이 많으므로 Kafka에 대한 내용은 생략하고 Kafka설치 및 Python을 이용하여 간단하게 데이터를 받아보는 예제에 대해 설명한다.


먼저 아래의 명령어로 zookeeper와 kafka를 설치한다. (OS X기준으로 설명한다)


brew install kafka

(위 명령어를 실행하면 java와 zookeeper가 같이 설치된다)


다음으로 아래의 명령어로 zookeper와 kafka를 실행시킨다.


brew services start zookeeper

brew services start kafka


이제 토픽을 만들 차례이다. 아래의 명령어로 test라는 토픽을 생성한다.


kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test


다음으로 아래의 명령어로 producer와 consumer 콘솔에 각각 접속한다.


kafka-console-producer --broker-list localhost:9092 --topic test

kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning


이제 Producer에서 아무런 메시지나 전송해보면



위처럼 Consumer측으로 데이터가 전송되는 모습을 확인할 수 있다. (위쪽이 Producer, 아래쪽이 Consumer) 이제 파이썬을 통해 데이터를 받아본다. 파이썬에서는 kafka-python이라는 라이브러리를 통해 Kafka를 다룰 수 있다. 아래의 명령어로 설치해준다.


pip3 install kafka-python


from kafka import KafkaConsumer


consumer = KafkaConsumer('test')
for msg in consumer:
print(msg)


소스를 실행시킨다음 위 Producer 터미널에서 메시지를 보내보면


ConsumerRecord(topic='test', partition=0, offset=13, timestamp=1561084846793, timestamp_type=0, key=None, value=b'send kafka test', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=15, serialized_header_size=-1)


이렇게 메시지를 받아볼 수 있는 모습을 확인할 수 있다.


간단하게 글을 작성하고 보니 아래와 같은 흥미로운 자료를 찾았다. Kafka python 라이브러리들의 속도를 비교한 글인데 해당 자료에서는 confluent-kafka-python이 속도가 가장 월등하다고 한다. 참고삼아서 보길 바란다.


http://activisiongamescience.github.io/2016/06/15/Kafka-Client-Benchmarking/



다른 사람들이 많이 읽은 글

댓글을 달아 주세요