01 / 문제
긴급 신고 기능을 구현하던 중, 외부 SMS 서비스에 장애가 발생하면 신고 데이터 저장까지 실패해 핵심 사고 기록을 잃을 수 있는 문제를 발견했습니다.
02 / 선택과 실행
신고는 먼저 저장하고, SMS는 따로 다시 시도하기
신고를 먼저 저장하고 SMS는 별도로 호출·재시도하도록 분리했습니다. 주행 데이터 수집과 실시간 알림을 연결했습니다.
03 / 결과와 배움
SMS 장애가 핵심 신고 기록을 롤백시키지 않도록 구현했습니다.
실시간 서비스는 속도와 함께 장애 시 무엇을 남길지도 설계해야 합니다. 중복 발송과 최종 실패 상태는 별도로 관리해야 합니다.
기술 설명과 구현 기록
저장과 발송의 완료 시점이 달라져 중복 발송 방지와 최종 실패 상태를 별도로 관리해야 했습니다.
간단 아키텍처
위험 감지와 주변 운전자 알림
- 01Carla주행 시뮬레이션 데이터
- 02IoT / Kinesis수집과 스트림 전달
- 03Flink위험 이벤트 분석
- 04Redis / STOMP여러 Pod의 알림 전달
긴급 신고 · 핵심 기록과 외부 알림을 분리
- 01신고 요청핵심 사고 정보
- 02신고 저장 완료DB 기록을 먼저 확정
- 03SMS 발송저장 성공 후 외부 API 호출
- 04재시도 대기실패 상태 기록 · 재발송
구현 중 마주한 문제
119 신고 즉시성 및 실패 차단
발생한 상황
단일 트랜잭션 내에서 신고 저장과 문자가 묶여 있어 외부 SMS API 장애 발생 시 DB 신고 건까지 전량 롤백되는 위협을 발견했습니다.
바꾼 부분
트랜잭션을 독립 레이어로 분리하고, SMS 발송 실패 시 비동기 큐 대기 및 재시도 Fallback을 도입하여 SMS 실패가 핵심 신고 DB 저장을 롤백시키지 않도록 처리했습니다.
WebSocket 연결 끊김 복구
발생한 상황
토큰 만료 및 네트워크 무선 흔들림 시 소켓이 끊어진 후 연결이 복구되지 않는 문제가 발생했습니다.
바꾼 부분
재연결 횟수 지수 백오프(Exponential Backoff)와 토큰 갱신 시점을 분리한 복구 핸들러를 구성했습니다.