java

1. 들어가며현재 개발 중인 지역 기반 소셜 커뮤니티의 "소 모임" 서비스에서 인원이 제한된 모임에 참가자를 승인하는 기능을 제공하고 있습니다.서비스의 핵심은 정해진 인원 내에서만 사용자를 승인해야 한다는 점이였습니다. 로컬 환경에서의 단일 요청 테스트는 문제가 없었지만, 실제 운영 환경과 유사한 동시성 테스트를 진행하던 중 정합성 문제를 발견했습니다.오늘은 선착순 승인 시스템에서 발생한 Race Condition(경쟁 상태) 문제와 이를 분석한 과정을 공유해 드리려고 합니다. 2. 문제 상황: 정원을 초과한 승인모임 서비스의 비즈니스 로직은 간단합니다. 현재 승인된 인원이 정원보다 적을 때만 모임 주최자가 승인을 수행합니다.하지만 부하 테스트 도중, 정원을 조과하여 승인이 이루어지는 현상을 목격했습니다..
"이벤트 있다" 사이드 프로젝트는 지역 기반 커뮤니티 플랫폼으로, 사용자들이 게시글이나 모임을 작성할 때 지역을 선택해야 합니다.한국의 행정구역 데이터는 다음과 같은 특징이 있습니다. 계층 구조: 시/도 -> 시/군/구 -> 읍/면/동 (3단계)데이터 크기: 총 18,695개의 지역 (시/도 16개 + 시/군/구 264개 + 읍/면/동 18,695개)변경 빈도: 연 1~2회 (행정구역 개편 시에만)조회 빈도: 매우 높음 (모든 게시글/모임 작성 시)Region Entity 설계 🔽더보기더보기더보기더보기@Entity@Table(name = "regions")@Getter@NoArgsConstructor@AllArgsConstructor@Builderpublic class Region { @Id ..
문제 상황증상서울시 축제 데이터 지오코딩 중 간헐적으로 좌표값이 null로 저장되는 현상 발생디버깅 모드에서는 정상 작동하나, 일반 실행 시 API 요청이 실패하여 Optional.empty()를 반환데이터는 존재하는 것을 확인(JSON) 형식 재현 조건데이터 1: "강서시니어스타운 B1 송도아트홀" → 지오코딩 결과 없음 (예상된 동작)데이터 2: "인사동 한국미술관 2층 전시관" → 지오코딩 성공하나 저장 실패 실행 방식데이터 1데이터 2상태일반 실행null(정상)null(비정상실패디버깅 모드null(정상)좌표 저장(정상)성공 환경 및 기술 스택사용기술언어: Java 17+HTTP 클라이언트: RestClientAPI: Nomination OpenStreetMap Geocoding API제약사항: R..
Fixed Window, Sliding Window Log, Sliding Window Counter 방식의 처리율 제한 알고리즘을 구현해보았습니다.이번에는 토큰 버킷(Token Bucket) 방식을 실제 구현 코드와 함께 정리해보겠습니다.Token Bucket Rate Limiter는 뭘까?토큰 버킷은 일정한 속도로 토큰을 버킷에 충전하고, 각 요청마다 토큰을 소모하는 방식입니다.버킷이 가득 찰 때까지 토큰이 축적되므로 일시적인 과도한 트래픽을 허용하면서, 장기적인 평균 처리율을 보장하는 특징이 있습니다.17:00 [5개] -> 3개 요청 -> [2개] 남음17:01 [2개] -> 1개 충전 -> [3개] -> 2개 요청 -> [1개]17:02 [1개] -> 1개 충전 -> [2개] -> 5개 요청 -..
슬라이딩 윈도우 로그 처리율 제한에 대해서 정리하려고 합니다.Sliding Window Log Rate Limiter는 뭘까?Fixed Window(고정 윈도우)와 달리 고정된 시간 구간이 아닌 현재 시점을 기준으로 과거 N분간의 요청 기록을 실시간으로 추적하는 방식 입니다. 5분 슬라이딩 윈도우 예시는 다음과 같습니다. 현재 시각이 09:03:30 이라면09:03:30 기준으로 08:58:30 ~ 구간의 요청들을 확인해서09:04:00이 되면 08:59:00 ~ 09:04:00 구간으로 윈도우를 슬라이딩합니다. 동작원리마찬가지로 사이드 프로젝트에서 슬랙 알림 중복 발송 방지를 위해 사용하였습니다.Fixed Window의 문제점들을 해결하기 위해 개선된 방식을 적용했습니다. ConcurrentHashMa..
이 글에서는 Fixed Window Rate Limiter의 동작 원리와 마주칠 수 있는 3가지 핵심 문제점을 정리해두려고 합니다. Fixed Window Rate Limiter가 뭘까?한글 말 뜻으로는 고정된 윈도우 처리율 제한 입니다. 이해하기 쉬울 정도의 예상된 동작을 유추할 수 있습니다. 5분 간격의 윈도우했다고 가정00시 00분 ~ 00시 04분 59초 -> 윈도우 100시 05분 ~ 00시 09분 59초 -> 윈도우 2~.. 동작 원리사이드 프로젝트에서 사용한 케이스는개발에서 개발자가 만든 런타임 예외를 설정하고, 이 예외가 발생한다면 슬랙으로 알림이 올 수 있도록 설정할 때, 같은 예외 같은 로깅 레벨의 예외가 발생했을 경우에 중복으로 알림을 발송하지 않도록 제한을 걸어둘 때 사용하였습니다...
솜사탕코튼
'java' 태그의 글 목록