๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ์๊ฐ์๋ ์ฝ์ํธ ์์ฝ ์๋น์ค์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ฌ ์๋๋ฆฌ์ค์ ์กฐํ API ์ค ์บ์ฑ์ ์ ์ฉํ ๋ถ๋ถ์ ๋ํด ๊ณ ๋ฏผํด ๋ณด๊ณ , ๊ธฐ์กด RDB์์ ์๋๋๊ณ ์๋ ๋๊ธฐ์ด ๋ก์ง์ Redis๋ก ์ด๊ดํ๋ ๊ณผ์ ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ ์บ์ฑ ์ ํ ํ ์คํธ ๊ฒฐ๊ณผ ๋น๊ต๋ฅผ ํตํด ์ผ๋ง๋ ์ฑ๋ฅ์ด ๊ฐ์ ๋๋์ง๋ ์ฒดํฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์บ์ ์ ์ฉ ๊ธฐ์ค
์ฐ์ ์บ์๋ฅผ ์ ์ฉํ ๋ ๊ณ ๋ คํด์ผ ํ ๊ธฐ์ค์ ์๋์ ๊ฐ์ต๋๋ค.
1. ์กฐํ ๋น์ฉ์ด ๋์์ง
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ์บ์ฑ์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
2. ์ผ๋ง๋ ์์ฃผ ์กฐํ๋๋์ง
๋ฐ๋ณต์ ์ธ ์์ฒญ์ด ๋ง์ ๊ฒฝ์ฐ ์บ์๋ฅผ ํ์ฉํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
3. ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ด์๊ฐ ์๋์ง
์บ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์บ์๋ ๋ฐ์ดํฐ์ ์๋ณธ ๋ฐ์ดํฐ ๊ฐ์ ์ ํฉ์ฑ์ ์ ์งํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์บ์๋ฅผ ์ ์ ํ ๊ฐฑ์ ํ ์ ์๋ค๋ฉด ์บ์ฑ์ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์บ์ ์ ์ฉ์ ๊ณ ๋ คํ ๋๋ ์บ์ ํํธ์จ
์ด ๊ฐ์ฅ ์ค์ํ ์์์
๋๋ค. ๋์ ํํธ์จ์ ์ ์งํ๋ ๊ฒ์ด ์บ์ฑ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๋ฅผ ์ค์ด๊ณ , ์์คํ
์ ์๋ต ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ ์๊ฐ ์์ต๋๋ค.
์กฐํ API ๋ณ ๋ถ์
ํ์ฌ ์ฝ์ํธ ์์ฝ ์๋น์ค์๋ ๋ค์ํ ์กฐํ API๊ฐ ์กด์ฌํฉ๋๋ค. ๊ฐ API์ ๋ํ ๋ถ์๊ณผ ์บ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ๋จํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ฝ์ํธ ์ ๋ณด ๋ฐ ๋ ์ง ๋ชฉ๋ก ์กฐํ API โ
ํน์ ์ฝ์ํธ์ ์ ๋ณด์ ์์ฝ ๊ฐ๋ฅํ ๋ ์ง๋ฅผ ์กฐํํ๋ API์ ๋๋ค.
- ์กฐํ ๋น์ฉ : ๋ฐ์ดํฐ ์์ด ํฌ๊ณ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์กฐํ ๋น์ฉ์ด ํฝ๋๋ค.
- ์กฐํ ๋น๋ : ์ฌ์ฉ์๋ค์ด ์ฝ์ํธ๋ฅผ ๊ฒ์ํ ๋ ์์ฃผ ์์ฒญ๋๋ API์ ๋๋ค.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ : ๋ ์ง ์ ๋ณด๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์์ ์บ์ฑ ์ ์ฉ์ด ์ ๋นํฉ๋๋ค. ๋ค๋ง, ๋ ์ง๋ณ ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ฏ๋ก ์์ฝ ๊ฐ๋ฅ ์ข์ ์๋ฅผ ๋๊ธฐํํ๋ ์ค์ผ์ค๋ง ์ฃผ๊ธฐ์ ๋ง์ถฐ ์ ํฉ์ฑ์ ๋ง์ถ ์ ์์ต๋๋ค.
2. ๋๊ธฐ์ด ์ํ ์กฐํ API โ
์ฌ์ฉ์๊ฐ ๋๊ธฐ์ด์์ ๋ช ๋ฒ์งธ์ ์์นํด ์๋์ง๋ฅผ ํ์ธํ๋ API์ ๋๋ค.
- ์กฐํ ๋น์ฉ : ๋๊ธฐ์ด ์์ ์ ๋ณด ์กฐํ ์์ฒด๋ ๊ฐ๋ฒผ์ฐ๋, ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค.
- ์กฐํ ๋น๋ : ๋๊ธฐ ์ค์ธ ์ฌ์ฉ์๊ฐ ์์ฃผ ์กฐํํ์ง๋ง, ํญ์ ์ต์ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ : ์ค์๊ฐ ์ ๋ณด๊ฐ ํ์ํ์ฌ ์บ์ฑ์ ์ ์ฉํ ๊ฒฝ์ฐ ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. ์ข์ ์ํ ์กฐํ API โ
ํน์ ์ฝ์ํธ ๋ ์ง์ ์ข์ ์ ๋ณด๋ฅผ ์กฐํํ๋ API์ ๋๋ค.
- ์กฐํ ๋น์ฉ : ์ข์ ์ํ๋ ๋ณต์กํ ์ ๋ณด์ด๋ฏ๋ก ์กฐํ ๋น์ฉ์ด ๋น๊ต์ ํฝ๋๋ค.
- ์กฐํ ๋น๋ : ์ข์ ์ํ๋ ์์ฝ์ด ์งํ๋ ๋ ์์ฃผ ์กฐํ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ : ์์ฝ์ด ์์ฃผ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ ํฉ์ฑ ์ ์ง๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
4. ์์ก ์กฐํ API โ
ํน์ ์ฌ์ฉ์์ ํ์ฌ ์์ก์ ์กฐํํ๋ API์ ๋๋ค.
- ์กฐํ ๋น์ฉ : ์์ก ์กฐํ ์์ฒด๋ ๊ฐ๋จํ์ฌ ๋น์ฉ์ด ํฌ์ง ์์ต๋๋ค.
- ์กฐํ ๋น๋ : ์ฌ์ฉ์๊ฐ ์ถฉ์ ๋๋ ๊ฒฐ์ ์ ํ๋ก ์์ ์ ์์ก์ ์์ฃผ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ : ์์ก ์ ๋ณด๋ ์ค์๊ฐ์ฑ์ด ์๊ตฌ๋ ์ ์์ง๋ง, ์ถฉ์ /๊ฒฐ์ ์ ์บ์๋ฅผ ์ ์ ํ ๊ฐฑ์ ํ๋ค๋ฉด ์บ์ฑ์ ์ ์ฉํ ์๋ ์์ต๋๋ค.
์ด API ์ค, ์ฝ์ํธ ์ ๋ณด ๋ฐ ๋ ์ง ๋ชฉ๋ก ์กฐํ๋ ๋ฐ์ดํฐ ์์ด ํฌ๊ณ ๊ฐฑ์ ์ฃผ๊ธฐ๊ฐ ๋น๊ต์ ๋๋ฆฌ๋ฉฐ ๋์ผํ ์์ฒญ์ด ๋ฐ๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์บ์ฑ ์ ์ฉ์ ํ์์ฑ์ด ํฌ๋ค๊ณ ์๊ฐ๋ฉ๋๋ค. ๋ฐ๋ฉด ๋๊ธฐ์ด ์ํ ์กฐํ, ์ข์ ์ํ ์กฐํ๋ ์ค์๊ฐ์ฑ์ ์๊ตฌํ๊ณ ์์ก ์กฐํ๋ ๋น์ฉ์ด ๋น๊ต์ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ์บ์ ์ ์ฉ ๋์์ ๋ฃ์ง ์์์ต๋๋ค.
๋ค๋ง, ๋๊ธฐ์ด ์ํ ์กฐํ๋ Redis๋ก ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์บ์ฑ์ด ์๋์ด๋ ๋น ๋ฅธ ์กฐํ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
์บ์ ์ ํ ์ฑ๋ฅ ๋น๊ต
์บ์ ์ ์ฉ ์ ํ์ ์ฑ๋ฅ์ ๋น๊ตํ๊ธฐ ์ํด Grafana์ k6๋ฅผ ํ์ฉํ์ฌ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ, ์บ์ ์ ์ฉ ์ ์๋ ํ๊ท 1.56, ์ต๋ 10์ ํ์ฑ ์ปค๋ฅ์ ์ด ์์์ง๋ง, ์บ์ ์ ์ฉ ํ์๋ ํ์ฑ ์ปค๋ฅ์ ์ด 0์ผ๋ก ์ค์ด๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ง์ ์ ์ธ ์์ฒญ์ด ๊ฑฐ์ ์์์ต๋๋ค. ๋ํ, ๋์ ์์ฒญ์ด ๋ง์ ๋ ํ ์ฌ์ด์ฆ์ ํ๊ณ์ ๋๋ฌํด ๋๊ธฐ ์ปค๋ฅ์ ์ด ๋ฐ์ํ๋ ๊ฒ๊ณผ ๋น๊ตํด, ์บ์ ์ ์ฉ ํ์๋ ๋๊ธฐ ์ปค๋ฅ์ ์ด ์์์ต๋๋ค.
์บ์ ์ ์ฉ ํ, ๋์ผ ์๊ฐ ๋ด ์์ฒญ ์ฒ๋ฆฌ๋์ด ์ํญ ์ฆ๊ฐํ์ผ๋ฉฐ, ์๋ฒ์ ๋จ๊ฑด ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ๋ ์งง์์ง ๊ฒ์ ํ์ธํ์ต๋๋ค.
์๋๋ ์ฃผ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฝํ ํ์ Grafana ๊ฒฐ๊ณผ ์บก์ณ์ ๋๋ค.
ํญ๋ชฉ | ์บ์ ์ ์ฉ ์ | ์บ์ ์ ์ฉ ํ |
HikariCP ํ์ฑ ์ปค๋ฅ์ (ํ๊ท ) | 1.56 | 0.0 |
HikariCP ํ์ฑ ์ปค๋ฅ์ (์ต๋) | 10.0 | 0.0 |
HikariCP ๋๊ธฐ ์ปค๋ฅ์ (ํ๊ท ) | 0.222 | 0.0 |
HikariCP ๋๊ธฐ ์ปค๋ฅ์ (์ต๋) | 2.0 | 0.0 |
API ์์ฒญ ์ (ํ๊ท ) | 183.0 | 198.0 |
API ์์ฒญ ์ (์ต๋) | 453.0 | 486.0 |
HTTP ์์ฒญ ์ง์ ์๊ฐ (ํ๊ท ) | 14.1 | 13.08 |
HTTP ์์ฒญ ์ง์ ์๊ฐ (์ต๋) | 264.95 | 182.45 |
ํ ์คํธ ๊ฒฐ๊ณผ ( ์บ์ ์ ์ฉ ์ )
ํ ์คํธ ๊ฒฐ๊ณผ ( ์บ์ ์ ์ฉ ํ )
์ด๋ฅผ ํตํด ์บ์ฑ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ต ์๊ฐ์ ๋จ์ถ์ํค๋ ๋ฐ ๊ธฐ์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๋๊ธฐ์ด ๋ก์ง์ RDB์์ Redis๋ก ์ด๊ด
๊ธฐ์กด์ ๋๊ธฐ์ด ๋ก์ง์ RDB๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌํ๊ณ ์์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ค์๊ฐ ์ฑ๋ฅ์ ์๊ตฌํ๋ ๋๊ธฐ์ด ์์คํ ์ ์ ํฉํ์ง ์์์ผ๋ฉฐ, ๋์ฉ๋ ํธ๋ํฝ ์ฒ๋ฆฌ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์ ๋ถํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ๋๊ธฐ์ด ๋ก์ง์ Redis๋ก ์ด๊ดํ์์ต๋๋ค.
Redis๋ก ์ด๊ดํ๋ฉด์ ActiveToken(์์ฝ ๊ฐ๋ฅ ํ์ฑ ํ ํฐ)๊ณผ WaitingToken(๋๊ธฐ ํ ํฐ)์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉํฅ์ ์ค์ ํ์์ต๋๋ค. ๊ฐ ๋๊ธฐ/ํ์ฑ ํ ํฐ์ ์ฝ์ํธ ์ค์ผ์ค ID๋ฅผ Key๋ก ๊ฐ์ง๋ ZSet
(Sorted Set)์ผ๋ก ๊ด๋ฆฌํ์์ต๋๋ค.
์ด๋ฅผ ํตํด, WaitingToken์์๋ ZRANK
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ O(log(N))
์ ์๊ฐ๋ณต์ก๋๋ก ์์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๋ํ ActiveToken์์๋ Score์ ๋ง๋ฃ ์๊ฐ์ ๊ธฐ๋กํ์ฌ ZREMRANGEBYSCORE
๋ช
๋ น์ด๋ก ๋ง๋ฃ๋ ํ ํฐ์ ๋น ๋ฅด๊ฒ ์ญ์ ํ ์ ์์ต๋๋ค.
๋ ๊ฐ ํ ํฐ์ ๋ณ๋์ Hash
๊ตฌ์กฐ๋ก ์ ์ฅํ์ฌ, ํ ํฐ์ key๋ก ์ฌ์ฉํ๊ณ value์๋ ์ค์ผ์ค ID, ์ํ๊ฐ, ๋ง๋ฃ์ผ์๋ฅผ ์ ์ฅํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํน์ ํ ํฐ์ ๋ํ ์กฐํ ์ ๋ฐ์ดํฐ ์ ๊ทผ ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์์ต๋๋ค.
์ฝ๋ ๋ณ๊ฒฝ์ ์ผ๋ก๋ ๊ธฐ์กด JPA๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง์ RedisTemplate๋ฅผ ์ฌ์ฉํ ๋ก์ง์ผ๋ก ๋ณ๊ฒฝํ์์ผ๋ฉฐ, ๋ง๋ฃ ์๊ฐ ๊ด๋ฆฌ์ ์ํ ๋ณ๊ฒฝ ์ญ์ Redis๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฆฌํฉํฐ๋ง ํ์์ต๋๋ค.
์๋๋ ํ ํฐ ๋ฐ๊ธ ์ RedisTemplate
์ ์ฌ์ฉํ์ฌ Redis์ ์ ์ฅํ๋๋ก ๋ณ๊ฒฝํ ์ฝ๋ ์์์
๋๋ค.
@Repository
class WaitingQueueRedisRepository(
private val redisTemplate: RedisTemplate<String, Any>,
) : WaitingQueueRepository {
companion object {
const val WAITING_TOKEN_PREFIX = "WaitingToken"
const val ACTIVE_TOKEN_PREFIX = "ActiveToken"
const val TOKEN_INFO_PREFIX = "TokenInfo"
}
override fun addWaitingQueue(waitingQueue: WaitingQueue): WaitingQueue {
// 1. WaitingToken ์ ์ฅ
redisTemplate.opsForZSet().add(
"$WAITING_TOKEN_PREFIX:${waitingQueue.scheduleId}",
waitingQueue.token,
System.currentTimeMillis().toDouble(),
)
redisTemplate.expire("$WAITING_TOKEN_PREFIX:${waitingQueue.scheduleId}", Duration.ofHours(1))
// 2. TokenInfo ์ ์ฅ
val key = "$TOKEN_INFO_PREFIX:${waitingQueue.token}"
val fields =
mapOf(
"scheduleId" to waitingQueue.scheduleId.toString(),
"status" to waitingQueue.status.name,
)
redisTemplate.opsForHash<String, String>().putAll(key, fields)
redisTemplate.expire(key, Duration.ofHours(1))
return waitingQueue
}
/* ... */
}
๋ง์น๋ฉฐ
์ฝ์ํธ ์์ฝ ์๋น์ค์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์กฐํ API์ ์บ์ฑ์ ์ ์ฉํ๊ณ , ๋๊ธฐ์ด ๋ก์ง์ Redis๋ก ์ด๊ดํ๋ ๊ณผ์ ์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค. ์บ์ฑ์ ํตํด ๋ฐ๋ณต์ ์ธ ์กฐํ ์์ฒญ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , Redis๋ฅผ ํ์ฉํ์ฌ ๋๊ธฐ์ด ๋ก์ง์ ์ค์๊ฐ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์์ต๋๋ค. ์ด๋ฒ ๊ณผ์ ์ ํตํด ์บ์ฑ์ ์ ์ฉํ๋ ๊ธฐ์ค๊ณผ Redis๋ฅผ ํ์ฉํ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ์ ํ ๋๋ก ์ถํ์ ์ค๋ฌด์ ์ ์ฉํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
'๐ป ๊ฐ๋ฐ > ๐ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋น์ค ํ์ฅ์ ์ํ ํธ๋์ญ์ ๋ถ๋ฆฌ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค๊ณ (5) | 2024.11.15 |
---|---|
๋์์ฑ ์ฒ๋ฆฌ ์ฝ๊ฒ ์ดํดํ๊ธฐ (synchronized, reentrantLock) (0) | 2024.09.29 |
Spring Security ๋ด๋ถ ํ๋ฆ ์ดํดํ๊ธฐ (0) | 2024.02.13 |
์คํ๋ง ๋ถํธ์ OpenAI Whisper API ์ ์ฉํ๊ธฐ (0) | 2023.08.24 |