
분산락과 낙관적 락을 사용한 데이터 정합성 지키기보상 트랜잭션을 사용한 데이터 정합성 유지하기 블로그 글에서 주문 비즈니스 로직에서 분산 트랜잭션을 처리 시스템을 구축했다.특히 상품 서비스에서 재고를 관리하고 있으며, 다수의 사용자가 동시에 한정 수량의 상품을 구매할 경우 UPDATE inventory SET quantity = quantity - 1와 같은 단순 쿼리만으로는 경쟁 조건(Race Condition)이 발생해 데이터 정합성이 쉽게 깨질 수 있다. 따라서 이커머스에서 재고의 정확성은 곧 서비스 신뢰도와 직결되므로, 정합성을 보장하기 위한 아키텍처 설계와 동시에 제어 전략이 필수적이다.이를 해결하기 위해 상품 서비스에서 일반적으로 비관적 락(Pessimistic Lock)과 낙관적 락(Opti..

보상 트랜잭션을 사용한 데이터 정합성 유지MSA 환경에서 모놀리식 아키텍처와 크게 다른 점은 트랜잭션의 복잡성이라고 할 수 있다. 모놀리식 아키텍처에서는 여러 서비스가 하나의 애플리케이션 안에 포함되어 단일 데이터베이스 내에서 ACID(Atomicity, Consistency, Isolation, Durability) 특성을 가진 로컬 트랜잭션으로 모든 작업을 처리할 수 있다. 이는 서비스 간 호출이 내부 메서드 호출로 이루어지기 때문에 트랜잭션 범위 관리가 쉽고 분산 시스템 환경에 비해 구현이 쉽다는 장점이 있다.MSA 환경에서는 각 서비스가 자신의 데이터베이스를 가진다. 또한, 서비스 간 호출이 네트워크를 통해 이루어지기 때문에 모놀리식 아키텍처와 달리 분산 트랜잭션 상황이 발생한다. 따라서 사용자가..

Spring WebFlux + Spring Security GitHub - f-lab-edu/idoluContribute to f-lab-edu/idolu development by creating an account on GitHub.github.com위 사이드 프로젝트는 이벤트 루프 기반 Netty 위에서 동작하는 Spring WebFlux를 사용하여 구현하고 있다. 따라서 Spring Security MVC에서는 기본적으로 서블릿(기본 구현체: 톰캣) 기반으로 한 요청당 하나의 스레드가 할당되어 처리되지만, Spring Security WebFlux는 MVC 스펙과 달리 한 요청에 여러 스레드가 할당되어 처리될 수 있기 때문에 리액티브 방식을 지원하는 스펙을 통해 구현해야 한다. Spring Sec..

Reactive StreamsThe purpose of Reactive Streams is to provide a standard for asynchronous stream processing with non-blocking backpressure.출처: reactive-stream-jvm githubReactive Streams는 비동기 데이터 스트림을 Non-blocking 방식으로 처리하면서, 백프레셔(Backpressure)를 지원하는 표준으로 Publisher는 Subscriber에게 비동기적으로 이벤트를 전달한다. Reactive Streams를 구현한 구현체로 RxJava, Reactor, Akka Streams, Java 9 Flow API 등이 있다. Reactive Streams 구성 ..

DispatcherServlet vs DispatcherHandlerDispatcherServlet에서 Spring MVC의 핵심 구성 요소로 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller) 패턴을 기반으로 동작하는 서블릿이다. 그러면 DispatcherHandler는 무엇일까? DispatcherHandler는 Spring WebFlux에서 DispatcherServlet처럼 요청을 처리하는 역할을 하는 비동기(reactive) 프론트 컨트롤러이다. 둘을 자세히 비교해보자. DispatcherServletDispatcherServlet도 부모 클래스에서 HttpServlet을 상속받아서 사용하고, 모든 경로(urlP..

NettyNetty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로 고성능의 네트워크 프로그래밍을 지원하기 위해 이벤트를 활용해 비동기적으로 최소한의 리소스로 많은 연결을 처리할 수 있다. Spring 5.0에서 도입된 리액티브 프로그래밍 모델을 기반으로 동작하는 Spring WebFlux도 서버 구현을 위한 다양한 옵션을 제공하지만, Netty를 기본적으로 사용하는 서버 엔진이다.Netty가 어떻게 이벤트 루프를 통해 각 I/O 작업(예: HTTP 요청, 응답)을 비동기적으로 처리하는지 알아보자. Blocking I/O vs Non-Blocking I/O네티는 Java NIO 기반의 고성능 네트워크 프레임워크이다. Java NIO의 Channel과 Selector를 사용하여 비동기, 논블로킹을 ..

JPA회사에서 Spring Data JPA와 QueryDSL을 사용하고 있다... Spring Data JPA와 QueryDSL을 공부하기 전 JPA에 대해 알아보고자 한다. MyBatis와 달리 JPA이 무엇이고, JPA를 사용함으로써 얻을 수 있는 장점과 사용 시 주의사항들에 대해서 살펴보자. SQL 중심적인 개발의 문제점과 대안자바를 사용하는 이유 중 하나인 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공하여 객체 모델링으로 저장할 수 있다. 하지만 MyBatis와 같은 SQL 중심의 개발은 SELECT, INSERT, UPDATE, DELETE의 무한 반복과 위 사진처럼 객체의 필드가 테이블에 맞추어 모델링되므로 의존적이..

nGrinder를 사용한 성능 테스트: 비관적 락 vs 분산 락 분산 환경에서는 비관적 락과 분산 락의 성능이 비교해보려고 한다. 비관적 락과 분산 락 비즈니스 로직 성능 테스트를 위해 두 비즈니스 로직을 똑같게 만들기 위해서 상품을 조회한 후 재고를 차감할 후 있는지 확인한 후 가능하다면 재고를 차감시킬 수 있도록 구현했다. 비관적 락과 분산 락 로직 차이 SELECT * FROM product WHERE id = #{id} SELECT * FROM product WHERE id = #{id} FOR UPDATE 가장 먼저, 상품을 조회했을 때 비관적 락은 SELECT ... FOR UPDATE를 통해서 조회한 레코드에 대해 배타락을 획득하는 반면, 분산 락은 애플리케이션 단에서 락을 획득하고 반납하기..

MySQL Replication 데이터베이스를 사용하고 운영할 때 가장 중요한 두 가지 요소는 확장성(Scalability)과 가용성(Availability)이다. 이 두 가지 요소를 위해 가장 일반적으로 사용되는 기술인 MySQL 복제는 소스 서버의 데이터를 하나 이상의 레플리카 서버로 복제하여 읽기 작업을 분산시켜 성능을 향상시키는 것을 말한다. 원본 데이터를 가진 서버를 소스(Source) 서버, 복제된 데이터를 가지는 서버를 레플리카(Replica) 서버라고 부른다. 소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생하며, 레플리카 서버에서는 이러한 변경 내역을 소스 서버로부터 전달받아 자신이 가지고 있는 데이터에 반영함으로써 소스 서버에 저장된 데이터와 동기화시킨다. 복제 장점 복제를 통..
- Total
- Today
- Yesterday
- NeXTSTEP
- Java
- mdcfilter
- 구름톤 챌린지
- sql
- 트랜잭션
- spring session
- Redisson
- nginx configuration
- redis session
- 분산 락
- 람다
- Synchronized
- nginx
- TDD
- postgresql
- jvm 메모리 구조
- 넥스트스탭
- EKS
- annotation
- spring webflux
- Kafka
- pessimistic lock
- transaction
- 카프카
- 낙관적 락
- 구름톤챌린지
- 비관적 락
- socket
- mysql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |