์ด ํ๋ก์ ํธ๋ ์ด๋ฒคํธ ๊ธฐ๊ฐ ๋์ ์กฐ๊ฑด์ ์ถฉ์กฑํ ์ฌ์ฉ์์๊ฒ ์ ์ฐฉ์์ผ๋ก ์ฟ ํฐ์ ๋ฐ๊ธํ๋ ๊ธฐ๋ฅ์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
๋์์ฑ ์ ์ด์ ๋๊ท๋ชจ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ฒ๋ฆฌ๋์ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ๋น ๋ฅด๊ณ ์ ํํ ์ฟ ํฐ ๋ฐ๊ธ์ ๋ณด์ฅํ๋ฉฐ,
๋๊ท๋ชจ ํธ๋ํฝ ์ํฉ์์๋ ์๋น์ค ํ์ง๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ์ต๋๋ค.
- ๊ธฐ๊ฐ: 2024.10.16 ~
- ์ธ์: 1์ธ
- ์ฃผ์ ๋ชฉํ:
- ๋์ ํธ๋ํฝ ์ํฉ์์๋ ์์ ์ ์ธ ์ฟ ํฐ ๋ฐ๊ธ ์์คํ ์ ๊ณต
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ฐํ ๊ตฌ์กฐ ์ค๊ณ
- API ๋ช ์ธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๋ฐ ์ ์ ํ๋ก์ฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก Springboot 3.3 ๊ณผ Java 17 ๊ทธ๋ฆฌ๊ณ MySQL 8.2๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑ.
- Spring Cloud: MSA ํ๊ฒฝ์์ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฑ์ ์ง์ํ์ฌ ์๋น์ค ๊ฐ ํต์ ๋ฐ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด ์ ํ.
- Redis: ๋๊ท๋ชจ ํธ๋ํฝ์์ ์กฐํ ์ฑ๋ฅ์ ๊ทน๋ํํ๊ธฐ ์ํ ์บ์ฑ์ ํ์ฉํ๊ณ , ์์์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋์์ฑ ์ ์ด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ํ.
- Kafka: ๋ฉ์์ง ์ ์ฅ ๋ฐ ๋ณต์ ๋ก ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ณ , ๋น๋๊ธฐ ๋ฉ์์ง์ผ๋ก ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ํธ๋์ญ์ ๋ถ๋ฆฌ๋ก ํ์ฅ์ฑ๊ณผ ์์ ์ฑ ๊ฐํํ๊ธฐ ์ํด ์ ํ.
- Docker & Docker Compose: ์ปจํ ์ด๋ํ๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์์ ์๋น์ค๋ฅผ ์คํํ๊ณ , ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๊ธฐ ์ํด ์ ํ.
- Spring Cloud Gateway: ํน์ ์์ฒญ์ ๋ํด JWT์ ์ ํจ์ฑ์ ๊ฒ์ฆํด ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ๋ง์ดํฌ๋ก์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ ๋ ์ด์ด๋ฅผ ๊ตฌ์ถ.
- Eureka Server: ์คํ ์ค์ผ์ผ๋ง๋ ์ธ์คํด์ค์ IP๋ฅผ ๊ฒ์ดํธ์จ์ด๊ฐ ์๋์ผ๋ก ์ธ์ํด ๋์ ๋ผ์ฐํ ๊ณผ ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ง์ํ๋๋ก ๋ฑ๋ก ๊ด๋ฆฌ ์์คํ ์ ๊ตฌ์ถ.
- Spring Cloud Config Server: ์ค์ ์ง์ค์ ์ค์ ๊ด๋ฆฌ ์๋ฒ๋ฅผ ๊ตฌ์ถํด ๋ชจ๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์ค์ ์ Git ์ ์ฅ์์ ๊ตฌ์ฑ ํ์ผ๋ก ๊ด๋ฆฌ.
- Redis: ์ฟ ํฐ ์ ๋ณด๋ฅผ ์บ์ฑํด ๋น ๋ฅธ ์๋ต์ ์ ๊ณตํ๊ณ ์์์ ์ฐ์ฐ์ผ๋ก ์ฌ๊ณ ๊ด๋ฆฌ์ ๋์์ฑ ์ ์ด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅ.
- Kafka: ์ฟ ํฐ ์ง๊ธ์ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํด ๋๊ท๋ชจ ํธ๋ํฝ ์ํฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๋ฅผ ๊ฒฝ๊ฐํ๊ณ ์์ฒญ ์์ค์ ๋ฐฉ์งํด ์์ ์ฑ ๋ณด์ฅ.
- Docker & Docker Compose: ๋ชจ๋ ์๋น์ค๋ฅผ ์ปจํ ์ด๋ํํด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์์ผ๋ฉฐ ์๋น์ค ๊ฐ์ ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ๊ตฌํ.
-
ํ์ ์๋น์ค (User Service):
- ํ์ ๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ๋ฑ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๋ด๋น.
-
์ฟ ํฐ ์๋น์ค (Coupon Service)
- ์ฟ ํฐ ๋ฑ๋ก ๋ฐ ์ ๋ณด ๊ด๋ฆฌ์ ๊ด๋ จ๋ ํต์ฌ ๊ธฐ๋ฅ ๋ด๋น.
- Write-Around ํจํด์ ์ฌ์ฉํด ์ฟ ํฐ ๋ฑ๋ก ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ง ์ ์ฅํ๊ณ ์บ์๋ ๊ฐฑ์ ํ์ง ์์.
- Cache Miss ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟ ํฐ ํ ์ด๋ธ์ ์กฐํํด ์ฟ ํฐ ์ ๋ณด๋ฅผ ๋ฐํ.
- Write-Back ํจํด์ผ๋ก ์บ์์ ์ ์ฅ๋ ๋ฐํ๋ ์ฟ ํฐ ์๋์ ์ ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ.
-
์ฟ ํฐ ๋ฐ๊ธ ์๋น์ค (Issue Coupon Service)
- ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ ์ฟ ํฐ ๊ฒ์ฆ ๋ฐ ๋ฐ๊ธ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ๊ธฐ๋ฅ ๋ด๋น.
- Look-Aside ํจํด์ผ๋ก Cache Miss ์ API ์์ฒญ์ผ๋ก ์ฟ ํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌ.
- Redis์ Set ์๋ฃํ์ ์ฌ์ฉํด ์ฟ ํฐ ์ฌ๊ณ ์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ๊ฒ์ฆ.
- ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด Kafka๋ฅผ ํตํด ์ฟ ํฐ ๋ฐ๊ธ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฅธ ์๋น์ค๋ก ์ ๋ฌ.
- ์ฟ ํฐ ์ ๋ณด ์กฐํ
- Look-Aside + Write Around ํจํด์ ์ฌ์ฉํ์ฌ ์ฒ์ ์กฐํ ์ DB์์ ์ฟ ํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ Redis์ ์บ์ฑํ๊ณ ์ดํ์๋ Redis์์ ๋น ๋ฅด๊ฒ ์กฐํ.
- ์ฟ ํฐ ๋ฐ๊ธ ๊ฒ์ฆ
- Redis์
SCARD๋ก ํ์ฌ ๋ฐ๊ธ๋ ์ฟ ํฐ ์๋ฅผ ํ์ธํ๊ณ ,SISMEMBER๋ก ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ๋ฐ๊ธ๋ฐ์๋์ง ํ์ธํ ๋ค,SADD๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ๊ฐ. - Lua ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํด ๋ชจ๋ ์์ ์ ํ๋์ ์์์ ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ Redis์ ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์ ์ด์ฉํด ์์ ๊ฐ ์ถฉ๋๊ณผ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์ง.
- ์ฟ ํฐ ๋ฐ๊ธ
- ์ฟ ํฐ ๋ฐ๊ธ ์์ฒญ ์ ์ฟ ํฐ ๋ฐ๊ธ ์๋ ๋ฐ ์ค๋ณต ๋ฐ๊ธ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ์ฌ ๊ฒ์ฆ ํต๊ณผ ์ ์ฌ์ฉ์์๊ฒ ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ.
- ๊ฒ์ฆ๋ ์์ฒญ์ Kafka๋ก ์ ์ก๋๋ฉฐ, Consumer๊ฐ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํด DB์ ๋น๋๊ธฐ์ ์ผ๋ก ์ ์ฅ.
- ๋๊ท๋ชจ ํธ๋ํฝ ์ํฉ์์์ ์ฑ๋ฅ ํ์ธ
- ์ ์ฐฉ์ ์ด๋ฒคํธ์์ ์งง์ ์๊ฐ ๋ด ๋ค์ ์ฌ์ฉ์์ ์ฟ ํฐ ์ง๊ธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ํธ๋ํฝ ์ฉ๋ ํ์ธ
- ์ด๋น ์์ฒญ ์ฒ๋ฆฌ๋๊ณผ ์์คํ ์ฒ๋ฆฌ ํ๊ณ๋ฅผ ์ธก์ ํ์ฌ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ํ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ ์ต์ํ
- ์ฟ ํฐ ์ง๊ธ ์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ธฐ ์์ ์ง์ค ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ ์ํด ๋ถํ ๋ถ์ฐ ๋ฅ๋ ฅ์ ํ๊ฐ
- ์บ์ฑ ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฑ ์ต์ ํ ๊ธฐ๋ฒ ์ ์ฉ ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ ๋ณํ๋ฅผ ๋ถ์
- ํ๊ท ์๋ต ์๊ฐ ๋จ์ถ
- ์ฟ ํฐ ์ง๊ธ API์ ํ๊ท ์๋ต ์๊ฐ์ ์ธก์ ํ๊ณ , ์ด๋ฅผ ๋จ์ถํ๊ธฐ ์ํ ์ต์ ํ ๋ฐฉ์์ ํจ๊ณผ ๊ฒ์ฆ
- ์ต๋ ํธ๋ํฝ ์ํฉ์์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํ ์๋ต ์๊ฐ ๋ถํฌ ๋ถ์
- ์์คํ
์์ ์ฑ ๊ฐํ
- ๊ทน๋จ์ ์ธ ํธ๋ํฝ ํ๊ฒฝ์์๋ ์ฅ์ , ๋ฐ์ดํฐ ์ ์ค, ์ค๋ณต ์ง๊ธ๊ณผ ๊ฐ์ ์ค๋ฅ ์์ด ์์ ์ ์ผ๋ก ์๋ ์ฌ๋ถ ํ์ธ
- ํ ์คํธ ๋๊ตฌ: Apache JMeter
- ํ
์คํธ ๊ตฌ์ฑ
- Number of Threads (Users): 15,000
- Ramp-up Period (Seconds): 20
- Loop Count: 1
- JWT ๊ด๋ จ ์ฌ์ ์ค์
- ๋์ผ ์ฌ์ฉ์์ ์ค๋ณต ์์ฒญ์ ์ฐจ๋จํ๊ธฐ ์ํด JWT๋ฅผ ์ฌ์ ์ ์์ฑ
- ์์ฑ๋ JWT ํ ํฐ์ CSV ํ์ผ๋ก ์ ์ฅํ์ฌ Apache JMeter์ CSV Data Set Config๋ฅผ ํตํด ๋ก๋
- ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ฒญ ๊ฒ์ฆ ๋ก์ง์ ํฌํจํ ์ค์ฌ์ฉ ํ๊ฒฝ๊ณผ ๋์ผํ ์กฐ๊ฑด์์ ํ ์คํธ๋ฅผ ์ํํ๋ฉฐ, ์์คํ ์ ๋ถํ๋ฅผ ๋ณด๋ค ์ ํํ๊ฒ ์ธก์
- ์ ์ฐฉ์ ์ด๋ฒคํธ์์ ์งง์ ์๊ฐ ๋ด ๋ค์์ ์ฌ์ฉ์๊ฐ ์ฟ ํฐ ์ง๊ธ ์์ฒญ ์ ์ก
- ๊ฒ์ฆ ์ํ ํ, ์ค์ ์ฟ ํฐ์ ์ง๊ธํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์์ ์ ์ํ
- ํด๋น ์์ ์ ์ฟ ํฐ ์ง๊ธ API ๋น์ฆ๋์ค ๋ก์ง ๋ด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ ์์ ์ด ์ง์ค๋๋ฉด์ ๋ถํ๊ฐ ๋ฐ์
| ๊ตฌ๋ถ | ํ๊ท ์๋ต ์๊ฐ (ms) | ์ต๋ ์๋ต ์๊ฐ (ms) | ํ์ค ํธ์ฐจ (ms) | ์ฒ๋ฆฌ๋ (req/sec) |
|---|---|---|---|---|
| ๊ฐ์ ์ | 98 | 1708 | 202.03 | 940.44 |
| ๊ฐ์ ํ | 26 | 1090 | 28.01 | 944.41 |
- ์๋ต ์๋ ๋จ์ถ: ํ๊ท ์๋ต ์๊ฐ 98ms โ 26ms, ์ต๋ ์๋ต ์๊ฐ 1708ms โ 1090ms๋ก ๋จ์ถ.
- ์ฒ๋ฆฌ๋ ์ฆ๊ฐ: ์ด๋น ์ฒ๋ฆฌ๋ 940 req/sec โ 944 req/sec๋ก ์ฆ๊ฐ, ๋๋ ํธ๋ํฝ ์์ ์ ์ฒ๋ฆฌ.
- ์ผ๊ด์ฑ ์๋ ์ฒ๋ฆฌ: ์ฒ๋ฆฌ ์๊ฐ ๋ณ๋ ํญ ๊ฐ์(ํ์ค ํธ์ฐจ 202ms โ 28ms)๋ก ์์ ์ฑ ํฅ์.
- ์ฟ ํฐ ์ ๋ณด์ ๋ํ ๋๊ธฐํ ์ ๋ต: Look-Aside + Wirte-Around ํจํด
- ์ฟ ํฐ ์ฌ๊ณ ์ ๋ํ ๋๊ธฐํ ์ ๋ต: Wirte-Back ํจํด
- Redis Sentinel๋ก ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ ํ์ผ์ค๋ฒ ๊ตฌ์ถ(1) - ๊ธฐ์ ์ ์์ฌ๊ฒฐ์
- Redis Sentinel๋ก ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ ํ์ผ์ค๋ฒ ๊ตฌ์ถ(2) - ๊ธฐ๋ฅ ๊ตฌํ
- ์ฟ ํฐ ์ฌ๊ณ ์ ๋ํ ๋์์ฑ ์ฒ๋ฆฌ (1): INCR ์ปค๋งจ๋
- ์ฟ ํฐ ์ฌ๊ณ ์ ๋ํ ๋์์ฑ ์ฒ๋ฆฌ (2): SET ์๋ฃํ
- ์ฟ ํฐ ์ฌ๊ณ ์ ๋ํ ๋์์ฑ ์ฒ๋ฆฌ (3): SET ์๋ฃํ + Redis Transaction
- ์ฟ ํฐ ์ฌ๊ณ ์ ๋ํ ๋์์ฑ ์ฒ๋ฆฌ (4): SET ์๋ฃํ + Redis Lua Script
- Kafka๋ฅผ ํ์ฉํด ๊ฒ์ฆ ์๋น์ค์ ๋ฐํ ์๋น์ค ๋ถ๋ฆฌ
- [Kafka] Producer Configurations(1) โ Compression & Batch
- [Kafka] Producer Configurations(2) โ Acks & Minimum InโSync Replicas
- [Kafka] Producer Configurations(3) - Idempotence
- [Kafka] Consumer Configurations(1) - Offset Commit Strategy
- [Kafka] Consumer Configurations(2) - Retry & DLT


