인프런의 "Spring Cloud로 개발하는 마이크로서비스" 강의를 보고 작성되었습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
이번 강의와 지난 강의에서는 마이크로서비스 간의 데이터 동기화를 위해 kafka를 사용하기 위해 kafka, kafka connect에 대해 사용 방법을 익혔습니다.
이번 강의에서 구현하는 부분은 Order Service에서 주문을 요청하게 되면 요청된 주문 수량을 Catalog Service에 반영시킵니다.
이때, Order Service에서는 프로듀서를 통해 Kafka Topic으로 메시지를 전송하고, Catalog Service에서는 컨슈머를 통해 메시지를 받아 처리합니다.
다음과 같이 카프카 컨슈머를 사용하기 위한 설정을 합니다.
@KafkaListener 어노테이션을 통해 설정한 토픽을 구독하고 메시지를 가져와 Catalog Repository에 수량을 변경하는 로직을 처리합니다.
Order Service에서 카프카 프로듀서를 사용하기 위해 설정 정보를 등록합니다.
주문 정보를 Catalog Service에 보내는 프로듀서 역할을 등록합니다.
기존과 동일하게 Order Service의 주문 생성 로직을 실행하고, 이후에 Kafka Producer send 메소드를 통해 Catalog Service에 메시지를 전송합니다.
다음과 같이 Order Service에서 주문 정보 등록 api를 호출하고 Catalog DB에도 잘 적용되었는지 확인합니다.
첫 번째 사진은 Order Service의 DB로 주문 정보가 추가된 모습이고, 두 번째 사진은 Catalog Service에서 STOCK 의 개수가 120에서 15만큼 줄어 잘 적용된 모습을 확인할 수 있습니다.
각각의 오더서비스가 각각의 데이터베이스를 현재 갖고 있어 밑에서 설명하는 모습처럼 데이터 동기화 문제가 발생합니다.
위의 두 사진을 비교하면 61782와 58880 포트에 각각 주문 정보가 등록된 것을 확인할 수 잇습니다.
따라서 이러한 상태에서 주문 정보를 조회하게 된다면 나눠진 데이터 베이스에 따라 주문 정보가 따로 조회됩니다.
각각의 Order Microservice에서 DB에 직접 데이터를 저장하지 않고 요청 데이터를 Kafka 토픽으로 전송합니다.
토픽에 전송된 데이터를 싱크 커넥트를 이용해 단일 DB, 이번 강의에서는 MariaDB에 전송해 데이터를 저장합니다.
따라서 하나의 데이터베이스를 바라볼 수 있습니다.
MariaDB에 orders 테이블을 생성해주고 datasource를 mariadb 로 변경해 줍니다.
카프카 커넥트를 통해 데이터를 전송해 DB에 insert 하기 위해 위와 같은 형식의 데이터를 전송해야 합니다.
이러한 형식은 Dto Class를 만들어서 값을 넣어 Producer에서 보내주었습니다.
템플릿과 동일한 형식의 Dto를 만들어 json으로 변환해 kafka producer로 전송합니다.
기존 컨트롤러에서 jpa를 통해 바로 DB에 데이터를 넣는 서비스 로직은 주석 처리하고, Order Producer의 카프카 send 를 통해 orders 토픽에 데이터를 전송합니다.
MariaDB datasource를 사용하고 topic은 orders인 카프카 싱크 커넥터를 만들어 orders 토픽에 데이터가 전송되면 이를 처리하도록 합니다.
인텔리제이에서 Order Microservice를 2개 실행시켜 주문 정보를 저장하는 api를 호출했을 때, 라운드 로빈 방식으로 로그를 확인할 수 있습니다.
mariaDB에는 두 개의 인스턴스에서 보낸 테이터가 저장된 모습을 확인할 수 있습니다.