배포할 때마다 끊기던 지급 처리 떼어내기
배치가 발행한 지급 이벤트를 웹 서버가 처리하던 구조에서 배포마다 진행 중인 지급이 끊기던 문제를, 상태 기록과 프로세스 통합 두 단계로 나눠 없앤 과정을 적었다.
BACKEND FIELD NOTES
배치가 발행한 지급 이벤트를 웹 서버가 처리하던 구조에서 배포마다 진행 중인 지급이 끊기던 문제를, 상태 기록과 프로세스 통합 두 단계로 나눠 없앤 과정을 적었다.
조회가 분명히 있었는데 로그에는 흔적이 없다는 문의를 따라가다, 완주한 작업만 기록되는 구조라 실패는 아예 존재하지 않는 일이 되고 있었다는 것을 확인한 과정을 적었다.
4년 동안 드러나지 않던 구조 결함이 작업 단가가 오르자 매일 2,000건씩 데이터를 버리기 시작했다. 큐가 가득 차 신용평가 이벤트가 재시도 없이 사라지던 배치에 백프레셔를 넣은 과정을 적었다.
세 서비스에 제각각 구현돼 있던 분산락을 하나로 통일하면서 비정상 종료 회복 시간을 다섯 시간에서 30초로 줄이고, 락 실패 정책을 진입 주체 기준으로 정리한 과정을 적었다.
원금 반영부터 중도상환과 잔액 환급까지 한 흐름에 묶여 있던 배치를 사용자 단위 이벤트로 쪼개고, 재시도해도 중복 환급되지 않도록 처리 순서를 바꾼 과정을 적었다.
트랜잭션이 보장되지 않던 회수 배치를 Java로 옮기면서 외부 출금과 내부 잔액이 어긋나는 경로를 막고, 하루 단위 대사를 따로 세운 과정을 적었다.
서비스가 각자 발송 대행사를 직접 부르고 각자 발송 로직을 들고 있던 구조를 알림톡 서버 하나로 모으면서, 폴백과 캐시와 개발 환경 오발송 방지를 어디에 둘지 정한 과정을 적었다.
ASP 기반 PG를 Spring Boot 모놀리스로 옮기고 1년도 안 돼 다시 셋으로 나눴다. 그 판단이 지금도 맞다고 보는 이유와, 끝내지 못하고 두고 온 것을 적었다.
응답을 못 받아 미확정으로 남은 결제를 결제사 노티가 풀어 주고 있었는데, 그 노티를 보내지 않는 결제사가 있었다. 혹시 몰라 둔 복구 배치를 결제사마다 나눠 만든 과정을 적었다.
설정 서버가 응답하지 않으면 테스트도 부팅되지 않았고, 리포지토리 테스트는 데이터베이스에 이미 들어 있는 값을 쓰고 있었다. 설정을 걷어내고 테스트를 떼어낸 과정을 적었다.