캐시는 저장보다 삭제가 어렵다: 무효화 경로를 통합한 과정
서로 다른 runtime의 설정 cache key 중 한쪽만 삭제돼 stale 위젯이 남은 문제를 공통 key builder와 ID 단위 invalidation으로 해결했습니다.
종료 세션 캐시가 625MiB까지 자랐다: 장기 연결의 메모리 누수
장기 Engine WebSocket의 종료 세션 Map이 누적된 원인을 찾아 명시적 disconnect, 비활성 TTL과 generation token으로 회수한 장애 분석입니다.
WebSocket 재연결이 장애를 키우지 않게 하는 방법
짧은 open/close 반복에서 backoff가 계속 초기화되던 문제를 안정 연결 시간, exponential backoff, jitter와 오류 분류로 완화한 사례입니다.
Node.js WebSocket Gateway로 세션을 멀티플렉싱하는 구조
여러 client 연결을 Gateway가 받고 하나의 장기 Engine WebSocket으로 전달한 뒤 sessionId로 응답을 되돌리는 실시간 시스템 구조를 설명합니다.
짧은 Markdown 한 줄이 Node.js를 멈추게 한 ReDoS 대응
Markdown parser의 정규식 backtracking 문제를 exact version pin, 격리된 timeout 테스트와 HTML 출력 호환성 회귀로 해결한 보안 패치 사례입니다.
Spot 선점 이벤트를 장애 에피소드로 묶어 알림하기
개별 Spot 선점과 Pod 영향을 시간 구간 episode로 상관 분석하고 Slack 메시지 한 건을 계속 갱신해 알림 소음을 줄인 운영 패턴입니다.
GKE Audit Log를 현재 상태로 투영하는 이벤트 시스템
Pod·Node lifecycle Audit Log를 UID와 발생 시각 기준으로 reduce해 중복, 순서 역전과 이름 재사용을 견디는 현재 상태를 만드는 방법입니다.
Cloud Build 요청자와 결과를 Slack 메시지 하나로 추적하기
Cloud Build 상태와 CreateBuild Audit Log를 Build ID로 합쳐 중복·순서 역전에도 Slack 메시지 한 건으로 수렴시키는 이벤트 설계입니다.
하나의 도메인에서 Web과 API를 나누는 GCLB Path Routing
기존 도메인과 URL 계약을 유지하면서 GCLB URL Map, Backend Service와 NEG로 Web/API workload를 단계적으로 분리한 과정을 정리합니다.
사용 중인 컨테이너 이미지를 지우지 않는 Docker 정리 전략
Artifact Registry 정리 전에 Kubernetes workload가 참조하는 tag와 digest를 보호하고, 조회 실패 시 삭제를 중단하는 fail-closed 운영 패턴을 설명합니다.
개발 서버에서 PM2 reload가 Pod를 죽였다: 순간 메모리와 OOMKilled
개발 서버에서 빠른 확인을 위해 PM2 reload를 실행하자 구·신 Node.js 프로세스의 메모리가 겹쳐 OOMKilled가 발생한 사례입니다. 운영은 이미지 재배포 방식으로 이 경로를 사용하지 않습니다.
고가용성을 단순화했다: Valkey Sentinel을 제거한 이유
Spot 선점 뒤 Sentinel의 primary 인식과 replication이 갈라진 경험을 바탕으로, 단일 Standard Valkey를 선택한 조건과 포기한 것을 정리합니다.