사이드프로젝트 slecs

정산 입금 알림 누락을 정규식·타임아웃 개선으로 해결

목차

문제 상황

이커머스 정산 처리에서 메신저 봇으로 들어오는 입금 알림을 받아 링크를 추출하고 후속 작업을 트리거하는 모듈을 손봤음. 최근 며칠 "분명 알림은 들어왔는데 처리 안 된" 건이 늘어 원인 분석함.

추적해보니 두 가지였음.

  • 링크 캡처 정규식이 메신저측 포맷 변경에 못 따라감
  • 외부 검증 호출 타임아웃이 너무 짧아 피크 시간대에 실패

캡처 로직 정리

원래는 메시지 본문을 한 줄로 가정하고 첫 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

첫 댓글 달아줘.