https://medium.com/javarevisited/rest-api-how-to-prevent-duplicate-requests-effectively-d3be88ef7838
구현 아이디어
- 사용자가 API를 호출할 때, 요청 본문(Request Body)에서 특정 데이터를 추출하여 Redis 키를 생성합니다.
- 이 키는 MD5로 해시되어 저장되며, Redis에 키가 이미 존재하는지 여부를 확인합니다.
- 만약 Redis에 키가 존재하면 중복 요청으로 간주하고 오류를 반환합니다.
- 키가 존재하지 않으면 Redis에 새로운 키를 저장하고, 이 키는 일정 시간이 지나면 만료됩니다.
구현 순서
- 특정 필드(예: productId, transactionId)를 기반으로 Redis 키를 생성하고, 필요 시 옵션 값을 추가하여 유연하게 중복 요청을 방지할 수 있도록 합니다.
- 생성된 키는 MD5로 해시하여 저장하고, 키의 유효 시간(예: 40초)을 설정합니다.
- 중복 요청이 발생하면 DuplicationException을 발생시켜 클라이언트에 오류 메시지를 반환합니다.
주요 클래스 및 설명
- PreventDuplicateValidator : 중복 요청 방지를 위한 커스텀 어노테이션. 필드 목록과 키 만료 시간을 설정할 수 있습니다.
- PreventDuplicateValidatorAspect : 어노테이션에 지정된 필드를 기준으로 Redis 키를 생성하고, 중복 요청을 확인하는 로직을 구현합니다.
- Utils : 요청 본문을 추출하고 MD5 해시를 생성하는 유틸리티 클래스입니다.
- HandleGlobalException : 중복 요청 발생 시 던져진 DuplicationException을 처리하여 클라이언트에 적절한 오류 메시지를 반환합니다.
테스트
- Postman을 사용하여 API 요청을 보냅니다. 첫 번째 요청은 성공적으로 처리되고 Redis에 키가 저장됩니다.
- 두 번째로 동일한 요청을 보내면 Redis에 키가 이미 존재하므로 중복 요청으로 처리되고 오류 메시지가 반환됩니다.
결론
- 중복 요청 방지를 위해 어떤 필드를 사용할지 신중히 선택해야 합니다.
- 키의 만료 시간을 비즈니스 요구사항에 맞게 조정할 필요가 있습니다.
- 성능 최적화를 위해 MD5 해시 사용 여부를 고려해야 합니다.
반응형
'emotional developer > detect-pattern' 카테고리의 다른 글
Throttling Design Pattern to Handle an Extreme Load (0) | 2024.10.10 |
---|---|
E-commerce Platform like Amazon (0) | 2024.10.08 |
Pessimistic Locking in Distributed Systems (0) | 2024.10.08 |