정산 입금 알림 누락을 정규식·타임아웃 개선으로 해결
목차
문제 상황
이커머스 정산 처리에서 메신저 봇으로 들어오는 입금 알림을 받아 링크를 추출하고 후속 작업을 트리거하는 모듈을 손봤음. 최근 며칠 "분명 알림은 들어왔는데 처리 안 된" 건이 늘어 원인 분석함.
추적해보니 두 가지였음.
- 링크 캡처 정규식이 메신저측 포맷 변경에 못 따라감
- 외부 검증 호출 타임아웃이 너무 짧아 피크 시간대에 실패
캡처 로직 정리
원래는 메시지 본문을 한 줄로 가정하고 첫 URL만 잘라냈는데, 최근 들어 링크 앞뒤로 줄바꿈/공백/이모지가 끼어서 들어오기 시작함. 정규식이 못 잡는 구간이 생김.
| 케이스 | 이전 | 변경 후 |
|---|---|---|
| 단일 라인 URL | OK | OK |
| URL 앞 공백 다수 | 실패 | OK |
| URL 뒤 줄바꿈 + 본문 | 잘못된 매칭 | OK |
| zero-width 문자 삽입 | 실패 | OK (normalize) |
String normalized = raw.replaceAll("\\p{Cf}", "")
.replaceAll("\\s+", " ")
.trim();
Optional<String> link = URL_PATTERN.matcher(normalized)
.results()
.map(MatchResult::group)
.findFirst();
zero-width(\p{Cf}) 제거 안 하면 눈에 안 보이는 문자 때문에 디버깅하다 미쳐버림. 한 번 당해봤음.
타임아웃 조정
검증용 외부 호출 타임아웃이 3초였는데, 피크 시간 P99가 5~6초까지 튐. 그 구간이 통째로 실패로 떨어졌음.
- 연결 타임아웃: 1초 유지 (네트워크 끊김은 금방 판단)
- 응답 타임아웃: 3초 → 8초
- 재시도 횟수: 2회 그대로 (더 늘리면 큐 적체)
배포 후 관측 수치.
| 지표 | 이전 | 이후 |
|---|---|---|
| 타임아웃 실패율 | 5.1% | 0.3% |
| 평균 처리 시간 | 1.4s | 1.7s |
| 누락 클레임 | 일 8건 | 0건 |
평균 처리 시간이 0.3초 늘긴 했지만, 정산 누락 0건이 압도적으로 큼.
회고
- 정규식은 외부 입력 포맷이 안 바뀐다는 가정으로 짜면 반드시 깨짐
- 타임아웃은 P50 아니라 P99 기준으로 잡고, 재시도 횟수와 묶어서 결정해야 함
- 가장 큰 교훈은 "보이지 않는 문자"의 존재. 텍스트 처리 코드는 normalize 단계 무조건 깔아두기로 함
다음
댓글 0
첫 댓글 달아줘.