Gateway 캐시를 안전하게 무효화하기
Gateway 캐시를 빠르게 유지하면서도, 지운 값이 다시 살아나는 레이스를 줄인 과정을 정리했습니다.
Gateway 캐시를 빠르게 유지하면서도, 지운 값이 다시 살아나는 레이스를 줄인 과정을 정리했습니다.
도구 호출마다 따로 생기던 차감 요청을 한 번의 실행으로 묶어 Redis 락 대기를 줄였습니다.
즉시 막아야 하는 검사와 나중에 확인해도 되는 검사를 나눠 응답 지연과 검사 누락을 함께 줄였습니다.
토큰과 서버 세션을 요청 앞단에서 확인해 서비스마다 다른 인증 결과가 나오지 않게 했습니다.
락이 만료된 뒤 이전 요청이 새 락을 지우지 않도록 소유자를 확인하고 Redisson으로 바꿨습니다.
ZIP 생성이 끝나기 전에 응답이 닫히던 원인을 찾아 다운로드와 전체 조회 흐름을 고쳤습니다.
인덱스를 사용하고도 실제 테이블을 많이 다시 읽으면 느려지는 이유를 실행 계획과 함께 살펴봅니다.
같은 격리 수준에서도 조회 방식과 인덱스에 따라 잠기는 범위가 달라지는 과정을 설명합니다.
일반 SELECT가 현재 값 대신 과거 버전을 읽는 과정을 read view와 undo log로 풀어냅니다.
실행 계획을 고르는 MySQL과 실제 데이터를 읽고 쓰는 InnoDB의 역할을 나눠 봅니다.
메시지 저장과 알림 전송 사이에 상태를 남겨 실패한 알림을 다시 찾고 보낼 수 있게 했습니다.
IDENTITY 전략에서 INSERT가 묶이지 않는 이유와 대량 저장을 JDBC로 분리한 기준을 정리합니다.
두 서버가 함께 재시작되지 않도록 한 대씩 배포하고 상태를 확인한 뒤 다음 서버로 넘어가게 했습니다.
느린 조회가 커넥션을 오래 잡아 다른 API까지 30초씩 기다리게 된 과정을 추적했습니다.
서비스 코드와 JPQL에 흩어진 조회 조건을 QueryDSL로 모아 읽고 바꾸기 쉽게 만들었습니다.
관계 테이블을 기준으로 DB 카운트와 Redis 캐시가 어긋났을 때 다시 맞추는 방법을 정리했습니다.
Merge, Squash, Rebase가 커밋 기록과 리뷰, 롤백에 어떤 차이를 만드는지 비교합니다.
일부 필드만 보낸 요청이 기존 값까지 null로 덮어쓰는 이유와 변경 감지 방식을 비교합니다.
소스가 바이트코드로 바뀌고 클래스 로딩과 JIT, GC를 거쳐 실행되는 흐름을 따라갑니다.