Wake-up-together-TogetUp / togetup-server

AI를 활용한 커뮤니티 기반 미션 알람 서비스, TogetUp!
1 stars 1 forks source link

[FEATURE] 미션 수행 API 처리율 제한 구현 #147

Closed 05AM closed 2 months ago

05AM commented 2 months ago

☀️ 작업 사항

외부 API와 연결되어 있는 미션 수행 API의 처리율 제한을 구현했습니다.

☀️ 참고 사항

bucket4j-spring-boot-starter을 사용하여 자세한 설정은 스프링부트 yml 설정 파일에 작성하였습니다. 설정파일이 지금 레포에 올라가 있지 않아 코드로 공유합니다. 이후로는 중요 환경 변수들을 properties 파일로 따로 관리하고, yml 설정 파일을 형상 관리하는 쪽으로 수정하면 더 좋을 것 같습니다! 제가 해도 좋고, 관심있으시다면 직접 해주셔도 좋을 것 같습니다!

bucket4j:
  enabled: true
  filters:
    - cache-name: mission-rate-limit-buckets
      url: ^/app/mission/([^/]+)/result$
      strategy: first
      http-response-body: "{ \"httpStatusCode\": 429, \"httpReasonPhrase\": \"Too Many Requests\", \"message\": \"You have exhausted your API Request Quota.\" }"
      rate-limits:
        - cache-key: "getHeader('Authorization')"
          execute-condition: "getHeader('Authorization') != null"
          bandwidths:
            - capacity: 5
              time: 1
              unit: minutes
              refill-speed: interval

기본적인 설정은 1분에 토큰 5개를 제공하고, 고정된 시간에 고정된 양의 토큰만 사용할 수 있도록 구현하였습니다.

알람은 1분에 한번만 울리기 때문에 알람 1번에 요청 횟수를 5번으로 제한한다는 의미로 위와 같이 구현하였는데 이에 대한 의견이 궁금합니다!

[요청이 성공적으로 처리된 경우] image 헤더에 x-rate-limit-remaining의 값을 통해서 몇개의 토큰이 남았는지 확인할 수 있고

[토큰이 없어 요청이 거부된 경우] image image 위와 같이 토큰이 소진됐다는 메시지와 함께 헤더에 x-rate-limit-retry-after-seconds이 토큰이 충전될 때까지 남은 시간을 알려줍니다.

[레포 링크] https://github.com/MarcGiffing/bucket4j-spring-boot-starter

[참고 자료] https://www.baeldung.com/spring-bucket4j

05AM commented 2 months ago

모든 요청에 대해 1분에 5개 인가요? 미션 인증 요청에 대해 1 분에 5개 인가요?

미션 인식 요청에 대해서 입니다!

url: ^/app/mission/([^/]+)/result$

위 부분에 해당 api의 path를 명시하였습니다