인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

마비미님의 프로필 이미지
마비미

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Kafka를 활용한 데이터 동기화 테스트 ②

선생님 kafka와 kafka connect에 대해서 질문이 있습니다!

작성

·

491

2

안녕하세요 선생님! 강의가 너무 재밌어서 못참고 또 다른 질문을 하게 되었습니다..!
매 질문마다 좋은 답변주셔서 정말 감사합니다!!

kafka 와 kafka connect 를 사용할 때에 대해 서 질문이 있습니다.

kafka producer consumer 를 사용했을 때는 Producer 를 통해 데이터를 보내게 되면
그 데이터가 Topic 에 저장되고
Consumer의 리스너에 의해 구독 해둔 Topic의 데이터가 변경되면
변경된 데이터를 Json으로 받아서 역직렬화 후 직접 DB에 데이터를 변경해 주는걸로 이해했습니다.

kafka connect 는 source connect, sink connect 설정정보를 rest api(post)를 통해 설정하고
Source connect 를 통해 데이터를 보내면
그 데이터가 Topic 에 저장되고
구독해둔 Topic에 데이터가 변경되면 Sink connect 를 통해서 
Sink connect 설정에서 연결해둔 DB에 자동으로 insert ,update등이 되는걸로 이해했습니다.

여기서 궁금한 부분은 선생님 께서 order-service 의 인스턴스를 2개 생성하면 계속 주문을 했을 경우
인스턴스 마다 DB 가 달라서 주문 정보가 인스턴스 1, 2 에 따른 DB에 나눠서 저장된다고 하셨습니다. 

DB에 데이터가 나눠서 저장되기 때문에
Kafka connect 를 사용해 단일 데이터베이스를 사용 해야한다고 이해했습니다.
밑 설정으로 인해 새로운 인스턴스마다 새로운 h2 DB가 자동 생성됐는데

url: jdbc:h2:mem:testdb



선생님께서 나중에 하신것 처럼 order-service application.yml 의 datasource.url 을
하나의 DB 주소 지정하면

url: jdbc:mariadb://localhost:3306/mydb

인스턴스가 2개여도 주문이 인스턴스들에 잘 나뉘어서 처리되고
모든 주문이 같은 DB에 저장이 되었습니다.

  1. 그러면 kafka connect 를 사용하는 이유는 마이크로서비스들에서 사용되는 DB가 다양할 경우에
    kafka connect 를 통해서 하나 의 DB나 다양한 종류의 데이터 저장소로 데이터를 쉽게 자동으로 보내기 위함인 건가요??

  2. DB를 한개만 사용한다면 kafka connect 를 사용하지 않고 kafka만 사용해도 되는건가요??
    정확히 어떨 때 어떤걸 사용해야하는지 궁금합니다!! 

  3. 추가적으로 이거는 다른 질문이지만
    feign client 는 rest api 를 통한 동기 통신이고
    kafka 는 구독방식을 통한 비동기 통신으로 이해하고 있습니다.

    feign client 와 kafka 둘중에 어떨 때 어떤 방식을 사용하는지 잘 와닿지가 않아서 저는
    보통 마이크로서비스들 끼리의 통신은 feign client으로 처리하고
    주문하면 재고가 빠져야하는 데이터 동기화 처리같은건 kafka 로 한다고 이해하고 있습니다.

    혹시 모든 처리를 feign client 나 kafka 둘중 하나만 사용하는 방법도 존재하는건가요??
    또한 제가 잘 이해하고 있는지 궁금합니다..!


긴 질문 봐주셔서 감사합니다ㅜㅠ 혹시 제가 이해한게 틀린부분이 있으면 알려주시면 감사하겠습니다!!

 

답변 1

8

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

문의하신 질문에 답변 드립니다. 

1. Kafka Connect는 마이크로서비스들간의 데이터 공유 뿐만 아니라, Kafka의 Topic에 저장된 데이터를 다른 리소스들과 연결, 공유해 주는 Platform입니다. 따라서, DB로부터 데이터를 가져올 수도 있고, 다른 리소스로부터 데이터를 전달할 수도 있습니다. 

2. DB를 하나만을 사용해서 Shared Database의 개념으로 여러 마이크로서비스에서 사용할 수도 있습니다. 그럴 경우에는 Kafka를 빼고 직접 DB에 데이터를 저장하거나, 가져올 수 있습니다. 다만, 트랜잭션의 순서 및 데이터가 발생한 이벤트들의 기록을 위해서 Kafka와 같은 메시징 큐잉 서비스를 사용할 수 있습니다. 강의에서는 마이크로서비스에서 데이터를 공유하는 하나의 방법으로 Kafka Connect를 통한 동기화를 소개하였고, 이외에도 Event Sourcing, CQRS, Saga 패턴 등이 사용될 수 있습니다. 이러한 부분에 대해서는 후속 강의로 준비중입니다. 

3. Feign Client는 마이크로서비스간의 통신을 추상화 시켜놓은 객체라고 보시면 됩니다. 마이크로서비스 간의 통신을 위해 다른 서비스의 주소나 포트 등의 정보를 직접 입력하지 않고, 서비스의 이름(아이디)를 이용하여 통신할 수 있도록 해 줍니다. Kafka는 마이크로서비스간의 통신을 처리한다기 보다는 데이터를 Kafka의 저장소(Topic)에 순차적으로 저장해 주는 목적을 가지고 있습니다. 2개의 사용 용돋가 다르기 때문에, 둘 중 하나만 사용한다는 것보다는 Spring Boot + Spring Cloud로 작성된 마이크로서비스 간의 통신을 위해 RestTemplate 또는 Feign Client를 사용하고, 그 외 데이터나 이벤트 등과 같은 다양한 정보를 다른 서비스나 애플리케이션에서 사용하기 위해서 저장하고 가져오는 기술을 위해서 Kafka를 사용하신다고 보시면 좋을 것 같습니다.

잘 이해되지 않는 부분 있으시면, 추가 글 남겨 주세요.

감사합니다. 

마비미님의 프로필 이미지
마비미

작성한 질문수

질문하기