1 분 소요

Multi Orders Microservice 사용에 대한 데이터 동기화 문제

스크린샷 2022-10-10 오후 9 34 50
order-service를 두 개 기동한다고 했을 때, 각각의 order-service가 독립적인 데이터베이스를 가지고 있다.
따라서 사용자의 요청 정보가 첫 번째 order-service의 인스턴스로 갈 수도 있고,
두 번째 order-service의 인스턴스로 갈 수도 있다는 문제점이 있었다.

Kafka Connect를 이용해 이러한 문제를 해결해보자.

Kafka Connect를 활용한 단일 데이터베이스 사용

스크린샷 2022-10-10 오후 9 41 51

  • order-service에 요청된 주문 정보를 DB가 아니라 Kafka Topic으로 전송
  • Kafka Topic에 설정된 Kafka Sink Connect를 사용해 단일 DB에 저장 -> 데이터 동기화

review
Kafka Service에서 메시지를 토픽에 전달해주는 역할을 하는 것이 Source Connect 였고,
토픽에 저장되있던 데이터를 가져와 사용하는 쪽이 Sink Connect 였다.

이전 글에서 order-service에서 Producer를 만들어, 주문을 했을 때 메시지를 토픽에 전달해보았다.
이번 글에서는 Sink Connect를 통해 토픽에 저장된 데이터 값을 인지해 단일 데이터베이스에 담아보자.
(이 작업을 위해서, 이전에 Sink Connect를 등록했고, MariaDB도 설정해높은 상태이다.)

새로운 테이블 생성

터미널에서 아래 커맨드를 통해 새로운 테이블을 생성하자.

$ mysql -u admin -p # admin 자리에는 mariadb의 username을 넣으면 된다.

# 데이터베이스 확인
mysql> show databases;

# mydb 라는 데이터베이스 사용
mysql> use mydb;

# mydb 데이터베이스 안에 있는 테이블 확인
mysql> show tables;

mysql> create table orders (
  id int auto_increment primary key,
  user_id varchar(50) not null,
  product_id varchar(20) not null,
  order_id varchar(50) not null,
  qty int default 0,
  unit_price int default 0,
  total_price int default 0,
  created_at datetime default now()
);

# 방금 생성한 테이블 확인
mysql> show tables;

스크린샷 2022-10-11 오후 11 11 38

order-service 수정

기존의 H2 데이터베이스에서 MariaDB로 변경해보자.

pom.xml

pom.xml에는 이미 Mariadb 관련 dependency가 추가되어 있을 것이다.

<!-- MariaDB -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.7.2</version>
</dependency>

application.yml

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

테스트

아래 순서로 서버를 기동하자.

  • zookeeper 서버
  • kafka 서버
  • eureka 서버
  • config-service
  • gateway-service
  • user-service
  • order-service

상품 주문

스크린샷 2022-10-11 오후 11 21 35

mariadb 확인

두 개의 상품을 주문했을 때, 아래처럼 h2가 아닌 mariadb에 잘 들어가는 것을 확인할 수 있다.
스크린샷 2022-10-11 오후 11 22 06

다음 글에서는, 사용자가 상품을 주문했을 때 OrderController에서 바로 order-service를 호출해 데이터베이스를 생성하는 것이 아니라.
kafka message 쪽으로 전달하도록 수정해보자.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기