MSA에서 분산 트랜잭션 관련해서 한번 알아보자. 서비스를 만들때 요즘 많이들 MSA 지향하고 기존 모놀리틱 아키텍처에서 MSA 로 전향해 나아가고 있다.MSA로 만들때 가장 힘든것 중에 하나는 분산 트랜잭션 관리이다.기존 모놀리틱 아키텍처에서는 DB의 ACID(Atomicity, Consistency, Isolation, Durability)로 특성을 이용하여 트랜잭션을 보장하지만, MSA는 각 서비스 별로 DB가 있으니까 일관성을 유지해주는 것이 다소 번거롭고 어렵기도 하다. 문제를 정의해보자각 마이크로 서비스를 거쳐 데이터의 일관성을 어떻게 유지해 줄 것인가? 사례) 주문을 생성할때, 고객의 예치금을 차감해야 하고, 배송을 접수해야 한다. - 주문 서비스, 고객 서비스, 배송 서비스로 세개의 마이크..
낙관적 락 (Optimistic Lock) 트랜잭션 대부분은 충돌이 발생하지 않을 것이라고 낙관적으로 접근하는 방식 어플리케이션 레벨에서 Lock 을 건다. 데이터를 읽는 시점에 Lock을 걸지 않고, 수정을 하려고 할때 데이터가 변경되었는지 확인하고 데이터를 변경을 시도한다. @Version JPA의 @Version 어노테이션을 제공하고 있다. 엔티티가 수정될때 마다 자동으로 버전을 증가 시키며, 커밋을 하기 전에 엔티티의 버전과 DB의 버전이 같은지 확인을 한다. 버전이 다르면 OptimisticLockException 을 발생 시킨다. 지원하는 타입은 long, Long int, Integer, short, Short, timestamp @Version private Integer version; ..
Webflux 가 성능이 좋다고 하는데, 얼마나 성능이 좋은지 알아보도록 하자. Webflux는 비동기 논 블록킹 방식이므로 Webmvc의 멀티 스레드 방식보다 성능이 우수하다. 적은 리소스로 더 많은 트래픽을 처리가 가능하다. 여기서 좀 헷갈리는 내용을 정리하고 넘어가자 동기-비동기, 블록킹-논블록킹의 차이점은 과연 무엇인가? 동기와 비동기 = 함수가 바로 리턴되는지 여부 블록킹과 논블록킹 = 백그라운드 작업 여부를 확인하는가 여부 동기-블록킹 방식은 함수를 호출하면 백그라운드 작업이 완료되었는 계속 확인하고 완료되면 함수가 리턴되는 구조이고 비동기-논 블록킹 방식은 함수를 호출하고 백그라운드 작업이 끝났는지 확인하지 않고 리턴을 하고 바로 다른 작업을 한다. 백그라운드 작업의 종료 여부는 이벤트로 수..
스프링의 웹플럭스에는 Flux와 Mono 라는 Reactive Streams Publisher 의 구현체가 있다. Flux 와 Mono 는 두 종류의 발행 방식이 있는데, Cold 과 Hot 방식이 존재한다. Cold sequences subscribe 할때 마다, 매번 새로운 데이터를 발행하고 동작하는 방식이다. 그리고 subscribe 를 하기 전에는 동작하지 않는다. Webflux 에서는 일반적으로 Cold 방식으로 동작한다. 먼저 Mono 로 예를 들어 보자. Mono body = httpGet(); body.subscribe(s -> log.info("Subscriber 1 : " + s.length())); body.subscribe(s -> log.info("Subscriber 2 : " +..
Webflux 란? Webflux를 먼저 이해하려면, reactive streams 를 먼저 이해해야 한다. reactive streams 란? reactive-streams.org 에서는 다음과 같이 정의하고 있다. Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. 대충 해석하면 "논블로킹(Non-blocking) 백프레셔(back pressure)를 이용한 비동기 데이터 처리의 표준이다" Reactive Streams 배경 2013년에 Netflix와 Pivotal, Lightbend의 엔지니어들이 처음 개발하기 시작하였고, Net..
Spring Boot 2.0부터 HikariCP로 Default Connection Pool로 변경되었습니다. 아래 그림을 보면 바뀐 이유를 알수가 있다. (빠르다) GitHub Page https://github.com/brettwooldridge/HikariCP Spring Boot 를 사용하면, Gradle or Maven에 별도로 설정할 필요는 없다. spring-boot-starter-data-jpa 에 dependency에 걸려 Default로 hikariCP가 설정된다. application.yml에서 hikariCP datasource 설정을 해보겠다. spring: datasource: type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql:..