전체 글 462

DB 데이터 동시성 이슈 해결법

목차작성 계기동시성 이슈의 원인해결책 (1) - 물리적 DB 1개 사용해결책 (2) - DB간의 동기화 (MQ)해결책 (3) - Kafka + 물리적 DB 1개 사용1. 작성 계기Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)의 강의를 듣고 인상 깊은 내용을 정리 중이다.현업에서는 Master DB 1대 Slave DB 1대로 레플리카구조로 이루어진 프로젝트가 대부분이다.만약 동일 서비스에 Master DB가 여러대일때의 상황을 고려해본 적이 별로 없다.(레플리카에 대한 설명은 클러스터링, 레플리카, 그리고 샤딩 게시글에서 확인해보자.)강의를 통해 학습했으니 내용을 정리해보자.2. 동시성 이슈의 원인해당 프로젝트에서는 USER SERVICE 에서 ORDER SERVICE API를 ..

🖥️ CS/DB 2024.11.13

동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (2)

동기, 비동기, 그리고 Batch에서 사용되는 thread의 지식을 정리한 글 입니다.내용이 긴 관계로 part를 나누어 업로드합니다.부족한 부분, 또는 잘못된 부분이 있으면 피드백을 남겨주시면 감사드리겠습니다. 🙆🏻‍♀️🙇🏻‍♀목차ThreadPoolExecutor의 가용 스레드를 최대로?내장형 Tomcat(WAS)의 가용 스레드를 최대로?Batch의 thread-pool은 다를까?결론참고 자료1. ThreadPoolExecutor의 가용 스레드를 최대로?ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)/*corePoolSize = 최초 ..

[마이크로서비스 아키텍처 구축] 6. 분산 트랜잭션

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차DB 트랜잭션분산 트랜잭션 - 2PC문제점 1 - 격리성 위배문제점 2 - 원자성을 지키기 어려움분산 트랜잭션, 그냥 안된다고 하라사가 (SAGA) 패턴사가 실패 모드사가 롤백롤백을 줄이기 위해 워크플로 단계를 재정렬사가 패턴 구현오케스트레이션형 사가코레오그래피형 사가혼합 (+ 분산 트레이싱)무엇을 사용해야 할까?사가 vs 분산 트랜잭션부록 - DB 분산 트랜잭션1. DB 트랜잭션기존 Monolithic에서 한 번에 동시에 2개의 데이터를 변경했을 경우,1개의 DB로 그림 6-1에서 단일 트랜잭션을 유도할 수 있다.그러나 MSA 분산환경에서는 그림 6-2 처럼 서로 다른 DB에 데이터가 적재되고, 이는 동일 트랜잭션 내에서 트랜잭션의 ..

IntelliJ에서 Gradle Build가 실패할 때 해결책

가끔 Gradle 프로젝트를 IntelliJ로 불러올 때 Gradle이 정상작동하지 않을 때가 있다.build에 실패한 로그라도 남으면 좋을텐데, 저렇게 밑도 끝도 없이 failed만 나올 때가 있다.향로님의 IntelliJ에서 Gradle 프로젝트가 작동안될때에 언급된 해결책을 시도했으나, 잘 해결되지 않았다.그러다가 발견하게된 해결책을 공유한다.먼저 좌측 패키지 구조에서 보이는 .idea 디렉토리를 제거하자.직접 패키지 위치를 찾지 않고 아래와 같이 터미널에서 명령어를 통해서도 제거가 가능하다.// 프로젝트의 루트 디렉토리에서 명령어를 입력하자rm -rf ./.idea그런 다음 File > Project Structure에 들어가보자.좌측의 Module로 들어간 다음, 만약 현재 프로젝트가 그대로 잔..

ThreadPoolExecutor vs ThreadPoolTaskExecutor

목차ThreadPoolExecutor (from Java)(1) Executors.newFixedThreadPool(2) Executors.newCachedFixedThreadPool(3) Custom ThreadPoolExecutorThreadPoolTaskExecutor (from Spring)정리Java의 ThreadPoolExecutor에 대한 전반적인 내용은 pompitzz님의 Java의 ThreadPoolExecutor, Spring의 ThreadPoolTaskExecutor를 참고했다.1. ThreadPoolExecutor (from Java) ThreadPoolExecutor는 자바 표준 라이브러리(java.util.concurrent)에서 제공하는 기본적인 thread-pool 구현체Ja..

[마이크로서비스 아키텍처 구축] 5. MSA 마이크로서비스 통신 구현 (2)

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차MSA에서 DRY와 코드 재사용의 위험서비스 디스커버리DNS동적 서비스 레지스트리1. MSA에서 DRY와 코드 재사용의 위험개발자라면 DRY(Don't Repeat Yourself), 즉, 반복하지 말라는 약어를 종종 듣게된다.동일한 작업을 수행하는 코드 라인이 많으면 코드 베이스가 필요 이상으로 커져 파악하기 어려워지며,동작을 변경하려고 할 때 해당 동작이 시스템의 많은 곳에 복제되어있다면 변경할때 누락되기 쉽다.때문에 DRY는 재사용할 수 있는 코드를 만들도록 유도한다.중복된 코드를 모아 추상화한 다음, 여러 곳에서 호출할 수 있으며, 아마도 어디에서나 사용할 수 있는 공유 라이브러리를 만드는 단계까지 갈 수도 있다.라이브러리를 통..

[마이크로서비스 아키텍처 구축] 5. MSA 마이크로서비스 통신 구현 (1)

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차MSA 서비스간 통신 종류원격 프로시저 호출 RESTGraphQL메시지 브로커중단 변경 관리하기락스텝 배포 (lockstep deployment)호환도지지 않는 마이크로서비스 버전의 공존기존 인터페이스 에뮬레이션무엇이 최선일까?극단적 조치1-1. MSA 서비스간 통신 종류 - 원격 프로시저 호출 (Remote Procedure Call)로컬 호출을 통해 어딘가에 있는 원격 서비스를 실행(RPC)하는 기술을 말한다.일반적으로 RPC 기술은 직렬화 프로토콜에 투자한다는 의미이며, RPC 프레임워크는 데이터가 직렬화 되거나 역직렬화 되는 방법을 정의한다.대표적으로 gRPC가 있으므로 이를 중점으로 설명한다.gRPC는 프로토콜 버퍼 (아래 코..

private 필드에 ReflectionUtils로 값을 셋팅해서 테스트 코드 작성

private 필드가 있는 클래스 @RequiredArgsConstructor @Service public class TestEventService { private final SomeClient someClient; @Value("${test.event.key}") private String key; @Value("${test.event.sequence}") private String sequence; 위와 같이 Service 클래스에 private 접근 제어자로 선언된 필드가 있었다.@Value 어노테이션을 통해 빌드 환경별 고유 값을 가져오고 있는 상황이다.어느 환경에서도 불변의 값이 아닌 환경에 따라 다른 값을 가져오는 상황이다보니, 유닛 테스트를 작성하는데 애로사항..

[마이크로서비스 아키텍처 구축] 4. MSA 마이크로서비스 통신 방식

해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.목차프로세스 내부에서 프로세스 사이로(1) 프로그램, 프로세스, 스레드의 관계(2) 왜 프로세스 간 호출의 오버헤드가 더 클까?(3) 인터페이스 변경(4) 에러 처리MSA 통신 방식 동기 대 비동기이벤트 기반 통신1. 프로세스 내부에서 프로세스 사이로(1) 프로그램, 프로세스, 스레드의 관계1. 프로그램이 구동되면 메모리에 올라간다.2. 메모리에 올라간 프로그램의 상태를 프로세스라고 한다.3. 이때 프로세스 내에서 실행되는 여러 흐름의 단위가 '스레드'이다.Monolithic에선 프로세스 내부에서 호출이 이루어졌다면 MSA에선 프로세스 사이로 네트워크릍 통해 통신이 이루어짐프로세스 내부 호출이 일어날 때, 런타임은 호출의 영향을 줄이려고..

동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (1)

동기, 비동기, 그리고 Batch에서 사용되는 thread의 지식을 정리한 글 입니다. 내용이 긴 관계로 part를 나누어 업로드합니다. 부족한 부분, 또는 잘못된 부분이 있으면 피드백을 남겨주시면 감사드리겠습니다. 🙆🏻‍♀️🙇🏻‍♀️목차서두thread와 thread-poolThreadPoolExecutor와 Connector참고 자료0. 서두일반적으로 java를 사용하는 spring boot에서 동기 방식의 API 콜이 한 번 호출되고 결과값이 반환될 때 까지 thread 1개가 필요된다.비동기로 호출 될 경우, 비동기로 호출되는 메서드의 개수 만큼 thread이 더 필요된다.그렇다면 이왕이면 더 큰 값의 thread-pool을 설정하면 되지 않을까? 그런 호기심에서 thread pool에 ..