ADR(Architecture Decision Record) - 결정의 맥락을 결정과 함께 남기기 Notes Tomcat 스레드 고갈 실험에는 “부하는 open 모델이다”라는 문장 옆에 ADR-001 링크가 붙어 있다. 본문은 open 모델을 쓴다는 사실만 말한다. 왜 closed 모델이 아닌지, 그 선택 때문에 결과 표를 어떻게 적어야 하는지는 ADR에 따로 적혀 있다. 이 글은 ADR이 무엇이고, 어떤 형식으로 쓰고, 언제 쓰는지를 정리한다. 예시로 그... 2025/01/22 Notes, Architecture
JMX와 MBean, 그리고 Micrometer가 지표를 얻는 길 - MBean이 없으면 지표는 0이 아니라 없다 Notes 무너지는 Spring 서버 1편에서 측정이 틀어진 첫 번째 원인은 Tomcat 스레드 지표가 아예 없었다는 것이다. /actuator/prometheus에 tomcat_threads_busy_threads가 없었다. 설명은 한 줄이었다. “Micrometer의 Tomcat 바인더는 MBean을 읽는데, server.tomcat.mbeanregistry... 2025/01/11 Notes, Java
세마포어와 permit - 동시에 몇 개까지 들일지를 세는 도구, 그리고 벌크헤드 Notes 무너지는 Spring 서버 1편의 조치는 두 가지였다. 읽기 타임아웃 2초, 그리고 “벌크헤드 permit 20”이다. 업스트림 호출 안에 동시에 들어갈 수 있는 요청 스레드 수를 세마포어로 20개로 묶고, permit을 100ms 안에 못 얻으면 503으로 거절했다. 그 결과 thread dump에서 업스트림 읽기에 있는 스레드가 정확히 20개였다.... 2024/12/27 Notes, Java
thread dump 읽는 법 - 스레드 상태와 스택 프레임, 그리고 RUNNABLE이 CPU를 쓴다는 뜻이 아닌 이유 Notes 무너지는 Spring 서버 1편에서 업스트림 하나가 느려지자 그것을 호출하지도 않는 /api/fast가 죽었다. CPU 사용률은 낮았다. 지표만 보면 서버는 한가했다. 원인을 확정한 것은 thread dump였다. 요청 스레드 200개 전부가 sun.nio.ch.Net.poll에 멈춰 있었다. 이 글은 그 한 줄을 읽기 위해 필요한 것을 처음부터 정리... 2024/12/17 Notes, Java
모델 검사 입문 - TLA+, TLC, 상태 공간, 불변조건, 반례 Notes ParityPay 12편은 이런 상황에서 시작한다. 부하·장애 실험 41종과 통합 시험 328개를 돌렸는데도 “고객은 청구됐는데 결제는 실패로 확정된” 경로를 한 번도 밟지 못했다. 그 경로는 기관이 요청을 받았지만 아직 기록하지 않은 짧은 창 안에서 조회가 두 번 일어나야 드러난다. 시험은 그 순간이 오기를 기다릴 수밖에 없다. 반면 TLC는 같은 ... 2024/12/07 Notes, Programming
Lock-Free와 CAS - 락 없이 공유 변수를 바꾸는 방법과 그 한계 Notes 카카오뱅크 알림 플랫폼 리뷰에 이런 문장이 나온다. 큐를 나누는 시점을 “CAS로 원자적으로 잡고”, 그 구현을 Lock-Free라고 부른다. Kleppmann 분산락 리뷰에서도 ZooKeeper znode 버전을 쓰기 조건에 넣으면 “CAS가 된다”고 적었다. 두 글 모두 CAS와 Lock-Free를 설명 없이 썼으므로, 이 글에서 처음부터 정리한다... 2024/11/28 Notes, Java
JPA 활용 2편 복습: API 응답과 조회 전략을 분리하기 Lecture 엔티티 조회와 DTO 조회를 구분하고 연관관계, 컬렉션 페치 조인, 페이징의 제약을 함께 정리한다. 2024/11/23 Lecture, Spring
프로세스는 왜 멈추는가 - GC, 페이지 폴트, CPU 경합, SIGSTOP, VM 정지와 스스로 알 수 없는 멈춤 Notes Kleppmann의 분산락 글 리뷰는 이런 장면에서 시작한다. 클라이언트 1이 락을 쥐고 파일을 읽는다. 쓰기 직전에 프로세스가 잠깐 멈춘다. 그 사이 lease가 끝나고 클라이언트 2가 락을 쥐고 쓴다. 클라이언트 1이 깨어나 자기 lease가 끝난 줄 모르고 쓴다. 두 쓰기가 겹친다. 이 장면에서 낯선 것은 “프로세스가 멈춘다”는 부분이다. 코드... 2024/11/18 Notes, OS
읽기 수리, 쓰기 수리, 비동기 수리 - 최종 일관성은 누가 언제 맞추는가 Notes Airbnb 결제 멱등성 글 리뷰에는 이런 문장이 나온다. 2PC 없이 최종 일관성을 얻는 흔한 방법이 read repair, write repair, asynchronous repair 셋이고, Airbnb 결제는 셋을 다 쓰며, 그 글은 write repair를 다룬다. 세 단어가 한 문장에 묶여 나오지만 각각이 무엇을 고치는지는 설명이 없다. ... 2024/11/09 Notes, Database
사용자 공간과 커널 공간 - 시스템 콜, 복사, sendfile과 kTLS Notes 두 글에서 같은 경계가 등장한다. TLS 핸드셰이크의 비용은 사용자 공간 TLS 라이브러리로 암호화하면 데이터가 사용자 공간을 지나야 해서 sendfile()을 쓸 수 없고, kTLS가 예외라고 했다. NIO와 이벤트 루프는 힙 버퍼로 IO를 하면 JVM이 다이렉트 버퍼로 한 번 더 복사한다고 했다. 둘 다 “데이터가 어느 공간에 있는가”의 문제다. ... 2024/10/29 Notes, OS