K8S에서 JVM 앱 운영하기 (1) — 클러스터 구조와 Probe
이 글은 K8S에서 JVM 앱 운영하기 시리즈의 첫 번째 글이다. 클러스터 구조와 Probe ← 현재 글 Graceful Shutdown과 HPA Warmup CPU Throttling과 메모리 한계 동작 CPU/Memory 동작 차이와 OOM 문제를 이해하려면, K8S가 JVM 앱을 배포·실행·종료하는 전체 라이프...
이 글은 K8S에서 JVM 앱 운영하기 시리즈의 첫 번째 글이다. 클러스터 구조와 Probe ← 현재 글 Graceful Shutdown과 HPA Warmup CPU Throttling과 메모리 한계 동작 CPU/Memory 동작 차이와 OOM 문제를 이해하려면, K8S가 JVM 앱을 배포·실행·종료하는 전체 라이프...
들어가며 1편에서 Consumer Group·Offset·파티션의 실제 동작을 다뤘다. 이번 글에서는 컨슈머가 그룹에서 쫓겨나는 원인, 리밸런싱 프로토콜의 단계별 동작, 그리고 장애를 최소화하는 개선 전략을 정리한다. 리밸런싱이란? Consumer Group 내의 파티션-컨슈머 매핑을 재조정하는 과정이다. 다음 상황에서 발생한다: 컨슈...
들어가며 이 글에서는 Consumer Group·Offset·파티션의 실제 동작 방식을 코드와 다이어그램으로 정리한다. 예제 코드는 Reactor Kafka + Kotlin Coroutines 기반의 상품 인덱싱 컨슈머를 사용한다. 파티션이란? 카프카에서 토픽(Topic)은 메시지를 분류하는 논리적 채널이다. 그리고 파티션(Partition)...
Application Cache 토폴로지 Local Cache 다이어그램은 Server1, Server2, Server…n 각각이 내부에 독립적인 Cache와 App을 가진 구조를 보여준다. ┌─Server1─┐ ┌─Server2─┐ ┌─Server..n┐ │ Cache │ │ Cache │ │ Cache │ │ A...
Write Strategies (쓰기 전략) Write Around 다이어그램의 흐름: 쓰기: App ──1:WRITE──▶ DB (캐시를 거치지 않고 DB에 직접 기록) 읽기 (캐시에 있을 때): App ──2:READ(exists)──▶ Cache ──▶ 반환 읽기 (캐시에 없을 때): App ──3-1:READ FROM DB(no...
들어가며 이 글에서는 캐시가 존재하는 이유와 캐시 교체 정책, 읽기 전략까지 정리해보려 한다. 컴퓨터 메모리 계층 구조 (Hierarchy of Computer Memory) 다이어그램은 피라미드 형태로 컴퓨터의 저장 장치를 위(빠른 것)에서 아래(느린 것) 순으로 배치한다. 계층 속도 용량 ...
들어가며 프로덕션에서 간헐적으로 500 에러가 올라왔다. 500 Server Error for HTTP GET "/api/products/123" 로그를 열어보면 NoSuchElementException인데, 비즈니스 코드가 한 줄도 없다. 전부 Reactor 내부 스택이다. java.util.NoSuchElementException at...
들어가며 이전 글에서 상품 서비스가 RC를 채택한 이유를 다뤘다. 대량 재고를 청크 단위로 나눠서 병렬 처리한다는 이야기도 했다. 그런데 왜 굳이 청크로 나눠야 할까? 한 번에 100만 건을 UPDATE하면 안 되는 걸까? 이 질문에 답하려면 MySQL이 데이터를 변경할 때 내부에서 어떤 일이 일어나는지 알아야 한다. 핵심은 두 가지 로그다. ...
배경 MySQL InnoDB의 기본 격리수준은 REPEATABLE READ(RR)이다. 하지만 상품 서비스는 READ COMMITTED(RC)를 사용한다. # HikariCP 커넥션 초기화 시 RC 설정 spring: datasource: connection-init-sql: SET SESSION TRANSACTION ISOLATION ...