DB만 사용할 때는 들어오는 데이터와 나가는 데이터가 크게 다르지 않습니다. 하나의 서버가 하나의 상태를 관리하고 있기 때문입니다.모든 요청은 동일한 저장소를 바라보고, 하나의 진실(Source of Truth)이 존재합니다. 하지만 서비스의 규모가 커지는 순간 상황은 달라집니다. 트래픽을 감당하기 위해 서버를 늘리고, 응답 속도를 개선하기 위해 Redis를 도입하고, 비동기 처리를 위해 Kafka를 붙입니다.그리고 그 순간부터 우리는 불편한 사실과 마주하게 됩니다. 어떤 곳에는 최신 데이터가 있고, 어떤 곳에는 아직 반영되지 않은 값이 있습니다. 어떤 요청은 성공했는데, 다른 곳에서는 여전히 이전 상태를 반환합니다. 데이터의 불일치는 사라지지 않았습니다. 오히려 더 자주, 더 복잡한 형태로 나타납니다...
502 게이트웨이를 없애보자. (이론편)배포를 진행하게 되면 일정 시간 동안 딜레이가 발생합니다.현재 화면은 배포 전 상태이며, localhost인 이유는 로컬 환경에서 배포를 진행했기 때문입니다.문제는 배포가 완료되는 과정에서 잠시b-programmer.tistory.com무중단 배포에는 대표적으로 세 가지 방법이 있습니다. Rolling, Blue-Green, Canary 방식입니다. Rolling 배포는 인스턴스를 하나씩 교체하는 방식으로, 서비스 중단 없이 배포가 가능하다는 장점이 있습니다. 하지만 배포 과정에서 구버전과 신버전이 동시에 존재할 수 있어 버전 불일치 문제가 발생할 수 있습니다. 이러한 문제를 보완하기 위해 등장한 방식이 Blue-Green 배포입니다. 기존 환경과 새로운 환경을 동..
도커를 학습하면서 가장 어렵게 느껴졌던 부분이 무엇이냐고 묻는다면, 저는 단연 네트워크라고 말할 것 같습니다.Dockerfile은 컨테이너가 실행될 환경을 정의하는 파일이고, Docker Compose는 여러 개의 컨테이너를 하나의 서비스처럼 구성해주는 도구입니다. Volume은 컨테이너의 데이터를 영속적으로 저장하기 위해 호스트와 연결되는 저장 공간으로 이해하고 있습니다.이처럼 각 요소의 역할은 비교적 명확하게 정리할 수 있었지만, 도커 네트워크는 개념을 아는 것과 실제로 이해하는 것 사이에 간극이 있었습니다.'도커 안에 네트워크를 만든다'는 것은 알고 있었지만,왜 굳이 네트워크를 분리해야 하는지언제 기본 bridge를 쓰고, 언제 사용자 정의 네트워크를 써야 하는지컨테이너들은 어떻게 서로를 찾고 통신..
배포를 진행하게 되면 일정 시간 동안 딜레이가 발생합니다.현재 화면은 배포 전 상태이며, localhost인 이유는 로컬 환경에서 배포를 진행했기 때문입니다.문제는 배포가 완료되는 과정에서 잠시 동안 502 Bad Gateway 오류가 발생한다는 점입니다.이는 프록시 서버가 백엔드 서버와 원활하게 통신하지 못하고 있음을 의미합니다.일정 시간이 지나야 정상적으로 서비스가 동작하며, 새로고침을 해야 변경된 화면을 확인할 수 있습니다.지금 보고 있는 화면은 Swagger이기 때문에 크게 문제가 없어 보일 수 있습니다.하지만 이 상황을 실제 운영 중인 사용자 UI라고 가정해보겠습니다.수백, 수천 명이 동시에 서비스를 이용하는 상황에서 배포가 이루어지고, 그 순간마다 502 오류가 발생한다면 어떻게 될까요?상품을..
read-only일때 replica 사용하게 하기master-slave 구조 이해하기DB에서 master-slave 형태로 변경하다는 뜻은 읽기 전용과 쓰기 전용을 분리한다는 의미입니다.최근에는 master-slave라는 용어보다는 primary-replica라는 용어로 더 많이 사용이b-programmer.tistory.com위 글에서 @Transactional(readOnly = true)인 경우에는 replica를 사용하게 하고, 그렇지 않은 경우에는 primary DB를 사용하게 코드를 작성하였습니다.public class RoutingDataSource extends AbstractRoutingDataSource { @Override protected @Nullable Object deter..
분산락이 무엇인지 학습 하고, 직접 적용하는 시간을 가져봤습니다. 분산락은 도대체 무엇일까?이전에도 Lock에 대해 학습을 진행한적이 있었습니다. DB락 부터, 낙관 락, 비관 락에 대해 학습을 진행하였죠. RDB vs Nosql크게 DB에는 2가지 종류가 존재합니다. SQL을 사용하는 RDB와 SQL도 사용하는 Nb-programmer.tistory.com 분산락을 적용해보자!분산락은 도대체 무엇일까?이전에도 Lock에 대해 학습을 진행한적이 있었습니다. DB락 부터, 낙관 락, 비관 락에 대해 학습을 진행하였죠. RDB vs Nosql크게 DB에는 2가지 종류가 존재합니다. SQL을 사b-programmer.tistory.com저는 ShedLock과 Redis 두 가지 모두 적용할 수 있도록 다음과 ..
EDA(Event Driven Architecture)가 MQ나 이벤트 리스너를 통해 동작한다는 것은 알고 있었습니다. 하지만 "어느 상황에서 사용해야 하는가?"에 대해서는 명확하게 정리되어 있지 않았습니다. 단순히 도메인 간 의존성을 줄이기 위한 구조 정도로만 이해하고 있었던 것 같습니다. 그러나 공부를 하다 보니, EDA는 단순한 비동기 처리 구조가 아니었습니다. 처리량 문제, 데이터 정합성 문제, 데이터 모델링 문제 등분산 환경에서 발생하는 다양한 문제를 해결하기 위한 설계 방식이었습니다. 특히 흥미로웠던 점은, 각각의 문제에 따라 적용되는 아키텍처 패턴이 달랐다는 점입니다. Competing Consumer, Saga, Transactional Outbox, Event Sourcing 등 단순히 ..
분산락은 도대체 무엇일까?이전에도 Lock에 대해 학습을 진행한적이 있었습니다. DB락 부터, 낙관 락, 비관 락에 대해 학습을 진행하였죠. RDB vs Nosql크게 DB에는 2가지 종류가 존재합니다. SQL을 사용하는 RDB와 SQL도 사용하는 Nb-programmer.tistory.com이전 장에서 분산락이 무엇인지 학습했습니다. 그런데 왜 분산락을 써야 하는가에 대해서는 아직 완전히 납득이 되지 않았습니다.제가 이해한 분산락은, 여러 인스턴스에서 같은 공유 자원에 대한 임계영역이 동시에 실행되지 않도록 보장하는 메커니즘입니다.그렇다면 이런 질문이 남습니다. 왜 우리는 "동시에 실행되는 것"을 막아야 할까요?이번 장에서는 이 질문에 집중해보려고 합니다. DB 락과 Redis 락을 직접 적용해보면서,..
이전에도 Lock에 대해 학습을 진행한적이 있었습니다. DB락 부터, 낙관 락, 비관 락에 대해 학습을 진행하였죠. RDB vs Nosql크게 DB에는 2가지 종류가 존재합니다. SQL을 사용하는 RDB와 SQL도 사용하는 NoSql(NoSql이 왜 Nosql인지에 대해 sql을 안써서 noSql이다 아니다 Not only sql의 약자라 그렇다라는 말들이 존재합니다. 안 중b-programmer.tistory.com 당신의 동시성 테스트가 원하는 결과가 나오지 않는 이유TL;DR: 낙관락과 비관락을 고르는 기준에 대해 설명합니다.배경그 전에도 낙관락, 비관락을 해봤기때문에 금방할 줄 알았다.하지만 아니었다. 어디서 부터 문제 였을까?생각하기에는 비관락을 사b-programmer.tistory.com하지..
이전에도 JVM관련해서 글을 작성한적이 있습니다. JVM 겉핥기java를 학습하게 되면 어떤것이 중요할까?객체지향도 중요하지만, java가 어떤것인지도 굉장히 중요하다.그니까 java가 어떤식으로 코드를 읽는지 그런것도 중요하다는거다.물론 나는 "코딩만 하b-programmer.tistory.com [면접 준비] JVM이란?서론드디어 2차 프로젝트가 끝이 났다. 이번에도 테스트를 진행하지 못했다. 무엇이 문제였을까?도커도 하지못했고 문서화도 하지 못했다. 원래 다른 공부도 병행하면서 해야 되는데 시간이 없b-programmer.tistory.com [면접공부] java - jvm(2)자바를 공부하면서 제일 중요하다고 생각하는 부분이 JVM이라고 생각하다.그렇다고 그전에 작성한 글을 똑같이 작성하는 건 아..
카프카나 레빗 MQ같은 MQ시스템들을 학습하다보면 브로커라는 개념이 등장합니다. 인터넷에 브로커를 검색해보니 판매자와 구매자 사이에서 정보를 교환하고 중개하여 수수료를 받는 개인 또는 법인이라고 합니다. 그렇다는 이야기는 메시지를 발송하는 프로듀서와 메시지를 수신하는 컨슈머사이에서 중개하는 역할을 담당하는걸로 추정이 되어집니다. 그렇다면 어째서 메시지 브로커라는게 필요할까요? 이것에 초점을 맞춰서 학습해봅시다.만약에, 메시지 브로커가 존재하지 않는다면?조금 단순하게 생각해보면 이런 구조입니다.OrderService → InventoryService주문이 들어오면 재고를 바로 차감합니다. 이게 제일 직관적이고 이해하기도 쉽습니다.그런데 이 구조는 생각보다 위험합니다. 재고 서비스가 느리면 주문도 같이 느려..
master-slave 구조 이해하기DB에서 master-slave 형태로 변경하다는 뜻은 읽기 전용과 쓰기 전용을 분리한다는 의미입니다.최근에는 master-slave라는 용어보다는 primary-replica라는 용어로 더 많이 사용이 됩니다.이것을 왜 사용하b-programmer.tistory.comprimary-replica 구조를 이해해보고 설정까지 해보았습니다. 하지만 현재 앱에서는 master만 사용하고 있습니다. 쓰기 부분은 primary로 읽기 부분을 replica로 어떻게 할 수 있을까요?YMAL 설정기존에는 다음과 같이 단일 DataSource로 구성되어 있었습니다.datasource: mysql-jpa: main: driver-class-name: com.mysql...