Skip to content

Commit 4230d4e

Browse files
committed
perf: RateLimiter의 토큰량이 충분할때는 contribution을 즉시 업데이트 하도록 수정한다
1 parent c18175e commit 4230d4e

3 files changed

Lines changed: 17 additions & 8 deletions

File tree

src/main/kotlin/org/gitanimals/core/ratelimit/RateLimitable.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ interface RateLimitable {
88

99
fun <T> acquire(limitPercent: Double = 0.0, action: suspend (RateLimit?) -> T): T
1010

11+
fun findRateLimit(): RateLimit?
12+
1113
fun update(rateLimit: RateLimit)
1214

1315
data class RateLimit(

src/main/kotlin/org/gitanimals/render/infra/VisitedEventListener.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.gitanimals.render.infra
22

33
import org.gitanimals.core.IdGenerator
44
import org.gitanimals.core.filter.MDCFilter.Companion.TRACE_ID
5+
import org.gitanimals.core.ratelimit.RateLimitable
56
import org.gitanimals.render.app.ContributionApi
67
import org.gitanimals.render.app.IdentityApi
78
import org.gitanimals.render.domain.UserService
@@ -10,6 +11,7 @@ import org.rooftop.netx.api.*
1011
import org.rooftop.netx.meta.SagaHandler
1112
import org.slf4j.LoggerFactory
1213
import org.slf4j.MDC
14+
import org.springframework.beans.factory.annotation.Qualifier
1315
import org.springframework.context.event.EventListener
1416
import org.springframework.dao.CannotAcquireLockException
1517
import org.springframework.scheduling.annotation.Async
@@ -21,6 +23,7 @@ class VisitedEventListener(
2123
private val userService: UserService,
2224
private val contributionApi: ContributionApi,
2325
private val identityApi: IdentityApi,
26+
@Qualifier("inmemoryGithubRateLimiter") private val rateLimiter: RateLimitable,
2427
) {
2528

2629
private val logger = LoggerFactory.getLogger(this::class.simpleName)
@@ -35,8 +38,10 @@ class VisitedEventListener(
3538

3639
logger.info("[VisitedEventListener] Increase visit to user. username: \"$username\"")
3740

38-
if (userService.isContributionUpdatedLongAgo(username).not()) {
39-
return
41+
rateLimiter.findRateLimit()?.let { rateLimit ->
42+
if (rateLimit.getRemainPercentage() <= 50.0 && userService.isContributionUpdatedLongAgo(username).not()) {
43+
return
44+
}
4045
}
4146

4247
val currentYear = ZonedDateTime.now(ZoneId.of("UTC")).year

src/main/kotlin/org/gitanimals/supports/ratelimit/InmemoryGithubRateLimiter.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,23 @@ class InmemoryGithubRateLimiter(
7070
}
7171
}
7272

73-
override fun update(rateLimitable: RateLimitable.RateLimit) {
73+
override fun findRateLimit(): RateLimitable.RateLimit? = rateLimit
74+
75+
override fun update(rateLimit: RateLimitable.RateLimit) {
7476
synchronized(lock) {
7577
this.rateLimit?.let {
76-
if (it.requestedAt <= rateLimitable.requestedAt) {
77-
this.rateLimit = rateLimitable
78+
if (it.requestedAt <= rateLimit.requestedAt) {
79+
this.rateLimit = rateLimit
7880
}
7981
} ?: run {
80-
this.rateLimit = rateLimitable
82+
this.rateLimit = rateLimit
8183
}
82-
if (rateLimitable.getRemainPercentage() < 20.0) {
84+
if (rateLimit.getRemainPercentage() < 20.0) {
8385
val message = """
8486
:warning: Warning!
8587
Remaining token quota is below 20%.
8688
---
87-
$rateLimitable
89+
$rateLimit
8890
""".trimIndent()
8991

9092
slackSender.send(githubTokenChannel, message)

0 commit comments

Comments
 (0)