Skip to content

Commit

Permalink
[Feat]: 캐시로직 누락 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
bayy1216 committed Aug 17, 2024
1 parent 4333217 commit 76c8fa8
Showing 1 changed file with 19 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,33 @@ class NovelQueryService(
val cache: List<NovelAndScore>? =
novelRankingCacheStore.getNovelIdRankingByPage(days = days, size = size, page = page)

if(cache != null){ // 캐시가 존재하면 캐시를 반환 early return
if (cache != null) { // 캐시가 존재하면 캐시를 반환 early return
return readOnly {
val novels = novelReader.findNovelsByIdsIn(cache.map { it.novelId })
return@readOnly novels.map { NovelModel.Main.from(it)() }
}
}

// 스케줄링 노드의 실패로 인해 캐시가 없는경우(방어로직)
// 혹은 최근 기간동안 event가 하나도 없어서 스코어링 novel 이 없는 경우
val localLockCheckNum = lockCheckNum
// A. 스케줄링 노드의 실패로 인해 캐시가 없는경우(방어로직)
// B. 최근 기간동안 `event`가 하나도 없어서 스코어링 `novel`이 없는 경우
// -> 실시간으로 스코어링을 조회하여 캐시를 저장한다.
// API 서버간의 분산락은 사용하지 않는다 (복잡성을 줄이기 위해)
return cacheUpdateLock.withLock {
log.warn("NovelScoringUseCase trigger by cache miss (days: $days)")
if (localLockCheckNum != lockCheckNum) { // 다른 스레드가 먼저 캐시를 업데이트 했을 경우
novelRankingCacheStore.getNovelIdRankingByPage(days = days, size = size, page = page)?.let {
val novelIds = it.map { novelAndScore -> novelAndScore.novelId }
return@withLock readOnly {
val novels = novelReader.findNovelsByIdsIn(novelIds)
return@readOnly novels.map { NovelModel.Main.from(it)() }
}
}
}

lockCheckNum += 1 // lock 내부이므로 AtomicInt 필요하지 않음
log.warn("NovelScoringUseCase trigger by cache miss (days: $days, lockCheckNum: $lockCheckNum)")
val scoresByOrder = novelScoringUseCase(days = days) // TX BLOCK
if(scoresByOrder.isEmpty()){ // 스코어링 결과가 없으면 early return
if (scoresByOrder.isEmpty()) { // 스코어링 결과가 없으면 early return
return@withLock emptyList()
}

Expand All @@ -62,8 +74,9 @@ class NovelQueryService(

}

companion object{
companion object {
private val cacheUpdateLock = ReentrantLock()
private var lockCheckNum = 0
private val log = org.slf4j.LoggerFactory.getLogger(this::class.java)
}

Expand Down

0 comments on commit 76c8fa8

Please sign in to comment.