본문 바로가기
반응형

전체 글785

MVCC(Multi Version Concurrency Control)가 뭐지? MVCC란?MVCC는 동시성을 높이면서 락을 최소화하기 위해 나온 기술 입니다.즉, 여러 트랜잭션이 동시에 데이터를 읽고 쓰는데 서로 방해 없이 처리되도록 하려고 나온 개념 입니다.MVCC가 나온 이유왜 나왔나??? 데이터베이스에서 여러 트랜잭션이 동시에 같은 데이터를 조회/수정할 때 충돌이 발생 합니다.문제1) 쓰기 lock 때문에 읽기 작업이 막힘누군가가 update하면 row에 lock을 걸어서 다른사람은 select를 못합니다.읽기 처리량(read throughput)이 심각하게 떨어집니다.데이터베이스 병목이 발생 합니다.문제2) 동시성이 낮음업데이트가 많은 테이블은 항상 락 경합(lock contention)때문에 대기상태가 늘어납니다.그래서 해결책으로 MVCC가 나오게 됩니다.이 기술의 기본 .. 2025. 11. 28.
DelayQueue란? (feat. Java표준, Redis) Blocking Queue&Delayed Queue세상에나 마상에나!Queue는 우리가 보통 pub/sub을 하는 블로킹 큐(Blocking Queue)와 블로킹 지연큐(Delay Queue) 2가지가 있습니다.Blocking Queue데이터가 Queue에 들어오는 즉시 Consumer가 가져갑니다.Queue가 비어 있으면 Consumer는 새로운 항목이 들어올 때까지 자동으로 대기(Blocking) 합니다.보통 Producer–Consumer 패턴, 작업 큐, 비동기 처리 등에 사용합니다.Delayed Queue(=지연 큐, DelayQueue)Queue에 항목이 들어왔더라도, 각 객체에 설정된 지연시간(Delay Time)이 지나야만 Consumer가 가져갈 수 있습니다.아직 지연시간이 남았다면 Co.. 2025. 11. 24.
이렇게 하면 되는건가? 지하철에서 끄적이다.. 못푼 문제가 있어서..지하철에서 끄적이다가 방법이 생각났다.정확한 답인지는 모르겠으나..아이디어는 계속 생각하는 사람만이 얻을수 있다!! 당연한건 없는데 당연하게 어디에 담아서 로직처리를 해야한다고 생각을 했다.이미 문제에 답을 줬는데도 말이다..반성 뽀인트! 2025. 11. 21.
이벤트 소싱(Event Sourcing)이란? 상태 자체를 저장하지 말고, 상태가 만들어진 사건(Event)의 흐름을 저장하는 방식DB 테이블에 현재값(Current State) 만 저장하는 게 아니라,그 값이 만들어지기까지의 이벤트(명령의 결과)를 계속 쌓아두는 구조이벤트1: UserCreated(id=1)이벤트2: PointAdded(+100)이벤트3: PointAdded(+50)이벤트4: PointUsed(-30)이벤트5: PointAdded(+20)위의 이벤트들을 순서대로 재생(Replay)하면 현재상태(point=140)을 계산할 수 있음. Command → Event Store(이벤트 저장) → Read Model(Mongo/Elasticsearch) 업데이트 ↑ .. 2025. 11. 18.
CQRS(=Command Query Responsibility Segregation)를 알아보자! 명령(Write)과 조회(Read)의 책임을 분리한다.왜 써야하지?제 경험으로는 장애가 한번 발생 했었는데 알람이 엄청나게 왔었습니다.상황은 어디에선가 엄청나게 호출을 하고 있었고 로그를 보니 사내에서 제공하는 Spark와 Hadoop을 지원하는 곳에서 호출을 하고 있었습니다.즉, 읽기 트래픽이 폭증하면서 Akka와 HBase RegionServer의 리소스(CPU, IO, 네트워크, 쓰레드, GC)가 읽기 때문에 많이 사용하고 있었고 그 결과 쓰기 요청들이 타임아웃/에러로 이어진 상황 이였습니다.하필 뉴스 컬렉션이라서..민감한 부분이였습니다. ㅠㅠ 한가지 문제로 인해 쓰기가 문제가 된것은 아닐것 입니다.Akka 자원 경쟁HBase RegionServer 자원 경쟁Data size도 커서 네트워크 문제 .. 2025. 11. 14.
코테준비) 간단 DFS를 풀어보자! 코딩테스트...준비하지 않으면 못풉니다ㅋㅋㅋ차근차근 준비를 해보아요!!! DFS : 너비 우선 탐색, 쭉~~따라가는 스타일!! 그래프 완전 탐색재귀함수로 구현, 스택자료구조 이용시간복잡도 : O(V + E) V : 노드 수E : 엣지 수 아래에서 N이 노드, M이 엣지 = O(1000 + 1000*(1000-1)/2) 1억정도 안넘으면 오케이!백준(연결 요소의 개수)https://www.acmicpc.net/problem/11724문제아래의 포맷으로 시작!! import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws Exception { BufferedR.. 2025. 11. 12.
Backoff Retry와 DLQ(Dead Letter Queue) 차이? 사용법? Backoff Retry와 DLQ 둘 다 재시도를 할 수 있는 친구들 입니다.무슨 차이가 있고 언제 사용하면 좋은지 알아보고 사용하면 좋을것 같습니다.Backoff Retry는 처리 실패시 일정 시간 대기(Backoff) 후 재시도하는 메커니즘 입니다.예를 들면 네트워크 지연이나 일시적인 장애(DB lock, 외부 api timeout) 같은 복구 가능한 오류에 사용 됩니다.동작 흐름Consumer → 메시지 처리 실패 → 1초 대기 → 재시도 → 또 실패 → 3초 대기 → 재시도 → 또 실패 → 10초 대기 → 재시도 → 성공 or DLQ 이동포인트재시도 간격을 점점 늘려서 시스템 부하를 방지 합니다.사용 예시kafka Consumer / 외부 API 호출 실패 시 재시도DLQ는여러번 재시도 했음.. 2025. 11. 11.
Redis에서 TTL이 expired(만료)되면 메모리에 데이터는 아직 있다? 없다? 동료들과 커피마시면서 이야기가 나온 내용인데 궁금해서 찾아보았습니다.정답은?! TTL 만료 != 즉시 메모리 해제Redis 메모리에는 존재하지 않는것 처럼 취급되지만 사실상 실제 메모리에서 삭제되는 것은 아니다!Redis는 TTL이 지난 키를 두 가지 방식으로 제거!1) Active Expiration(주기적으로 스캔) : Redis가 주기적으로 메모리를 스캔해서 만료된 키들을 삭제 serverCon이라는 내부에서 돌아가는 타이머 루프를 통해 스캔하고 제거하여 메모리를 관리 합니다. 2) Lazy Delete(게으른 만료) : 클라이언트가 GET/SET 등 키를 조회/갱신하려고 할 때 즉, 직접 접근 할 때 내부에서 만료체크를 하고 삭제를 진행 합니다. TTL이 만료된 key가 바로 삭제 되.. 2025. 11. 6.
동시성(Concurrency) 모델&스케줄링 모델(feat. ForkJoinPool) 2025.08.16 - [역량 UP!/Architecture] - C10K 문제(C10k Problem)란 무엇인가?Concurrency Models 5가지동시성 모델설명대표 기술Thread-based여러 스레드가 공유 메모리 사용Java Threads, ThreadPool, Spring MVCEvent-driven (이벤트 루프 기반)1개 또는 소수 스레드가 이벤트를 감지하고 처리Node.js, Redis, Netty, NginxMessage-passing / CSP공유 메모리 X, 채널로만 통신Go Goroutine + channelActor Model모든 게 Actor, 메시지로만 통신Akka, ErlangReactive StreamsNon-blocking + BackpressureWebFlux, .. 2025. 11. 4.
Blocking&non-Blocking 그리고 Sync&Async 이해하기! 개념을 쉽게 이해해보자!Blocking과 Non-BlockingCPU / 쓰레드 레벨의 개념Sync와 AsyncApplication(메소드 호출 흐름) 개념Blocking / Non-Blocking = 쓰레드와 CPU의 관계BlockingI/O 작업(Disk, Network)을 기다리는 동안 쓰레드가 멈춤CPU가 놀고 있음(idle 상태)CPU를 낭비! 일해야하는데 일하지 않고 놈!Non-BlockingI/O 요청 후 즉시 리턴, 나중에 완료되면 알려줌나중에 누가??하드웨어 I/O는 OS커널이 감지하고 알려줌어플리케이션 레벨은 EventLoop or ThreadPool이 Callback을 실행하며 알려 줌이것때문에 특징을 헷깔릴 수 있음주의!Non-Blocking + Async(Callbak) 조합!.. 2025. 11. 3.
GC(Garbage Collection)에 대해 알아봅시다! https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-2.html#jvms-2.5Run-Time Data AreasThe pc RegisterJVM StackHeapMethod AreaRun-Time Constant(상수) PoolNative Method Stacks이 영역들 중에 GC(Garbage Collection)가 일어나는 영역은 Heap 영역 입니다.역으로 말하면 나머지 영역은 GC 대상이 아니라는 이야기!클래스 로더 서브 시스템클래스나 인터페이스를 JVM으로 로딩하는 기능을 수행1) Bootstrap ClassLoader : JVM 자체 제공, jdk핵심 클래스 로드 (/lib)2) Extentions ClassLoader : 확장 라이브러리 .. 2025. 10. 31.
Redis Single Thread, 싱글인데 왜 빠르지?? MSA 아키텍처에서 Redis가 싱글쓰레드를 이용해서 처리가 되기 때문에 원자성(atomic)보장! 즉, 데이터 정합성이 깨지지 않습니다!그래서 커머스 같은 곳에서는 재고처리를 Redis로 하는데..그런데 말입니다! 잘나가는 커머스는 대용량 트래픽 일텐데 이걸 버텨낸다?? 싱글쓰레드인데? 왜 성능이 좋은지 살펴보도록 하겠습니다. Redis의 성능적 비밀은? Multiplexing / Event Loop사실 아니 어떻게 싱글쓰레드가 대용량 트래픽을 받는다는거지? 라는 의문이 생겨서 찾아보게 되고 포스팅을 하게 되었습니다.알고봤더니 다이렉트로 싱글 쓰레드가 받아서 처리하는 구조가 아니였습니다!!위 그림의 I/O Multiplexing을 살펴봅시다!1) 클라이언트 : A,B,C 클라이언트가 동시에 Redis .. 2025. 10. 28.
대용량 데이터 처리 시 고려사항 대량 데이터 처리 시 고려사항은 단순히 빠르게 처리해야한다가 아니다. 아래의 5가지로 나눠볼수 있다.성능(Performance), 안정성(Stability), 정합성(Consistency), 확장성(Scalability), 데이터 품질(Data Quality)성능(Performance)대용량을 처리하는 프로세스는 아래 참고!2025.08.21 - [역량 UP!/Architecture] - 용어정리) OLTP, OLAP란?2016.09.28 - [OS/Linux&Unix] - BATCH, OLTP,OLAP,DW 정의Data의 특성에 맞게 처리를 해주면 됩니다.3가지 영역으로 보면Infra : Server를 늘려주거나(Scale-out), 네트워크(LB), CDN, Cache DB : 데이터 저장 구조라고 .. 2025. 10. 26.
Saga Pattern(outbox pattern) 좀 더 보기! 2025.10.24 - [역량 UP!/Architecture] - MSA에서 분산 트랜잭션 처리는?(Saga+outbox)위 내용을 토대로 아키텍처를 설계했는데Saga pattern중 오케스트레이션 말고 코레오그래피의 흐름을 따라가며 좀 더 보자!1) Outbox 테이블CREATE TABLE outbox ( id BIGINT PRIMARY KEY AUTO_INCREMENT, aggregate_type VARCHAR(40) NOT NULL, -- "ORDER","INVENTORY","PAYMENT" aggregate_id VARCHAR(64) NOT NULL, -- ex) orderId event_type VARCHAR(60) NOT NULL, -.. 2025. 10. 24.
MSA에서 분산 트랜잭션 처리는?(Saga+outbox) 내가 몰랐던 MSA의 특징?마이크로서비스를 하는 목적은? 개발하는 속도가 빠릅니다.조직으로 보면 하나의 서비스를 가지는 조직은 UI specialists, middleware specialists, DBAs이 모두 모여있는 조직 입니다.커뮤니케이션이 유연하고 빨라서 개발속도가 빠릅니다.즉, 기술적인 아키텍처만 변경하는게 중요한게 아니라조직의 구조나 조직의 의사결정방향, 조직의 개발문화 스타일이 변경되야 성공할 수 있습니다.그림 출처 : https://martinfowler.com/articles/microservices.htmlConway's law(콘웨이의 법칙)소프트웨어 아키텍처의 구조는 소프트웨어를 만드는 팀의 구조를 따라간다. 서비스의 세분화는?서비스화는 크게(모놀리스) 시작하며 분할(MSA) .. 2025. 10. 24.
18) ENS Project - 발주파일 변경 요청 요구사항지인이 업체별로 발주파일을 전달 하는데 반드시 양식에 맞춰서 보내야하는 업체가 있다고 함.귀찮으니 만들어달라고 요청이 들어옴!개발일정넉넉잡아 2시간! 카페로 출똥!개발애월언니 발주 시스템 추가범위 : 프론트/백엔드 수정!애월언니 계정 로그인 시에만 해당 메뉴가 보이도록 함!매핑체크// 업체받는분 받는분전화 받는분전화2(없으면 공란) 수화주주소 수량 보내는분 보내는분분전화 보내는분전화2(없으면 공란) 보낸분주소 물품명 배송메세지 물품크기// 네이버스토어결제일 옵션정보 수량 수취인명 구매자명 수취인연락처1 구매자연락처 통합배송지 최종 상품별 총 주문금액 배송메세지 상품주문번호 배송방법(구매자 요청) 상품종류 배송방법 택배사 송장번호 발.. 2025. 10. 10.
코테대비 문법정리 HashMap생성// HashMap 만들기Map map = new HashMap();값 추가map.put("apple", 3); // apple → 3 저장map.put("banana", 5); // banana → 5 저장map.put("apple", 10); // apple → 10 (덮어쓰기)값 읽기int v = map.get("apple"); // 10Integer x = map.getOrDefault("orange", 0); // 없으면 기본값 0boolean hasKey = map.containsKey("apple"); // true/false값 삭제map.remove("apple");map.clear(); // 모든 키·값 삭제반복// 1) 키 기준for (String key :.. 2025. 9. 18.
Codility Lesson 참고 투포인터/슬라이딩 윈도우 레슨15: https://app.codility.com/programmers/lessons/15-caterpillar_method/해시맵/배열 카운팅 기본(FrogRiverOne, MissingInteger)레슨4: https://app.codility.com/programmers/lessons/4-counting_elements/누적합·슬라이딩윈도우 (PassingCars)레슨5: https://app.codility.com/programmers/lessons/5-prefix_sums/스택( Brackets )레슨7: https://app.codility.com/programmers/lessons/7-stacks_and_queues/DP (MaxSliceSum)레슨9: htt.. 2025. 9. 18.
아마존의 사업개발 방법, Working backwards 거꾸로 일하기! 아마존의 거꾸로 일하기 프로세스!오래전에 언급된 프로세스인데 뭔지 궁금해서 찾아보았습니다.거꾸로 일하기는 제품에 대한 아이디어에서 시작합니다.즉, 고객의 시점에서 시작 합니다.1. 당신의 고객은 누구인가?2. 고객의 문제는 무엇이며 어떻게 해결할 것인가?3. 주요 고객이 얻는 이익은 무엇인가?4. 고객의 니즈를 어떻게 채워줄 것인가?5. 고객 경험은 어떠해 보이는가?고객검토를 거쳐서 처음으로 하는 일이 내부 보도자료를 만드는 것 입니다.보도 자료 작성 / FAQ 작성 / 시각화보도자료 작성(Press Release)를 하다보면 마치 이미 사업이 진행된 것 처럼새로운 제품/서비스가 출시 된 것처럼 글을 작성하는 것 입니다.내용을 작성하다보면 자연스럽게 아이디어가 구체화되고 어떤 부분이 부족한지 알수 있습니.. 2025. 9. 11.
Codility Test 너무 간만에 문제를 풀어봅니다ㅋㅋ온라인 직무테스트 링크를 보니 Codility가 있어서 찾아보니 아래처럼 프로그래머스처럼 기업이 사용하는 코테 사이트가 있었습니다.coding test site : https://app.codility.com/programmers/특징으로는 영어로 문제가 나옵니다!문제1) A binary gap - Find longest sequence of zeros in binary representation of an integer.// you can also use imports, for example:// import java.util.*;// you can write to stdout for debugging purposes, e.g.// System.out.println(".. 2025. 9. 11.
Akka Classic ask Flow(Future/Promise)+ Distributed Data(feat. CRDT) Akka classic에서 소스를 보다보면 붕~뜬 느낌이 들곤 합니다.마치 Springframework에서도 내부적으로 동작하는 것들이 많은데(ex. DispatcherServlet) 이것을 알지 못하면 이해가 어렵습니다.그러므로 Akka 프레임워크에서 내부적으로 동작하는 액션을 파악해야합니다.1. Client가 Akka HTTP를 통해 접근2. 메시지가 들어오고 Route를 통해 어떤 Actor에게 보낼지 결정 합니다.3. Route핸들러에서 서비스 Actor에 메시지를 보냅니다. 3.1 ask(Future의 리턴이 있는) 메소드를 사용하게 되면 4. Akka는 내부적으로 Future를 리턴 시킵니다. 5. 또한 내부적으로 한쌍인 비어있는 promise와 replyTo Actor를 메시지에 담아.. 2025. 9. 4.
반응형