- ๋๊ท๋ชจ ์์คํ
์ ๋ณธ์ง
- ๋ฌธ์ ์ํฉ ยท ์ ์
- ๊ธฐ์ ์ ยท ๋น๊ธฐ์ ์ ์๊ตฌ์ฌํญ
- CAP ์ ๋ฆฌ
- ๊ฐํ ์ผ๊ด์ฑ vs. ์ต์ข ์ผ๊ด์ฑ
- ๋ณ๋ชฉ์ ์๋ณ ์ ๋ต
- ์ฅ์ ์ ํ ๋ฐฉ์
- ํธ๋ํฝ ํน์ฑ์ ๋ฐ๋ฅธ ์ค๊ณ ์ ๋ต
- ์ฝ๊ธฐ ยท ์ฐ๊ธฐ ํธ๋ํฝ์ด ๋น๋์นญ์ ์ธ ์ํฉ์ ์ค๊ณ
- CQRS
- ์บ์ ์ ๋ต
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- Projection ์ค๊ณ ์ ๋ต
- ์ํคํ
์ฒ์ ์ ํ
- ๋ชจ๋๋ฆฌ์ vs. MSA
- ๋ฐ์ดํฐ ๊ณ์ธต ์ค๊ณ
- RDB | MySQL
- ์คํค๋ง ์ค๊ณ
- ์ธ๋ฑ์ฑ ์ ๋ต
- ์ค๋ฉ ์ ๋ต
- ๋ถ์ฐ ํ๊ฒฝ์์์ ์ ์ผ์ฑ ๋ณด์ฅ
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
- In-Memory | Redis
- ์บ์ฑ ๋์ ๋ฐ์ดํฐ ์ ์
- ๊ณ ๋ ค์ฌํญ
- ๊ตฌํ
- RDB | MySQL
- Message Broker | Kafka
- ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ญํ
- ๋ฉ์์ง ๋ธ๋ก์ปค์ ํ์์ฑ
- ์ ์ก ๋ณด์ฅ ์์ค
- Transactional Outbox ๊ตฌํ
- ์ ํฉ์ฑ ์ ๋ต
- Consumer ๋ฉฑ๋ฑ์ฑ ์ค๊ณ
- ํธ๋ํฝ์ด ์์ธกํ ์ ์๊ฒ ์ฆ๊ฐํ ์ ์์.
- ์ผ๋ถ ๊ธฐ๋ฅ์๋ง ๋ถํ๊ฐ ์ง์ค๋ ์ ์์.
- ํน์ ์๋น์ค์ ์ฅ์ ๊ฐ ๋ค๋ฅธ ์๋น์ค์ ์ํฅ์ ์ค ์ ์์.
- ๋ฐ์ดํฐ์ ๊ท๋ชจ๊ฐ ๋จ์ผ ์ฅ๋น์ ํ๊ณ๋ฅผ ์ด๊ณผํจ.
- Connection ์ ์ ํ.
- IOPS ์ ํ.
- SPOF.
- API ์กฐํฉ ๋น์ฉ ์ฆ๊ฐ.
- ๊ณ ๊ฐ์ฉ์ฑ
- SLA ์ถฉ์กฑ.
- ์ฅ์ ๋ฐ์ ์ ์๋ ๋ณต๊ตฌ ๊ฐ๋ฅ.
- replication, failover ์ ๋ต.
- ํ์ฅ์ฑ
- ํธ๋ํฝ ์ฆ๊ฐ์ ๋ฐ๋ผ ์ํ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅ.
- Stateless ๊ธฐ๋ฐ ์ค๊ณ.
- ์ค๋ฉ ์ ๋ต ์๋ฆฝ
- ๋ณต์ก์ฑ ํต์
- ๋ง์ดํฌ๋ก์๋น์ค ๊ฒฝ๊ณ ๋ช ํํ.
- ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ์ฑ ์์ ๋ถ๋ฆฌ.
- ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ฅผ ์ด์ฉํ์ฌ ์ํ ์ฐธ์กฐ, ๋ฐํ์ ์์กด์ฑ ์ ๊ฑฐ.
- ์กฐ์ง ๊ท๋ชจ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ์ ์ ์ง.
- ์ผ๊ด์ฑ
- ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ผ๊ด์ฑ ์์ค์ ๋ค๋ฅด๊ฒ ์ ์งํ ์ ์์.
- ์ฝ๊ธฐ ยท ์ฐ๊ธฐ ๋ถ๋ฆฌ
- CQRS.
- Query Model ๊ตฌ์ฑ.
- Redis ์บ์ฑ.
- ๋น๋๊ธฐ ๋ฉ์์ง
- ๋ฉ์์ง ๋ฐํ ๋ณด์ฅ.
- ์๋น์ค ๊ฐ ์ง์ ์์กด์ฑ ๊ฐ์.
- ์ฅ์ ์ ํ ์ฐจ๋จ.
- ์ต์ข ์ผ๊ด์ฑ ๋ณด์ฅ.
- ๋ฐ์ดํฐ ํ์ฅ ์ ๋ต
- Horizontal Sharding.
- ๋ถ์ฐ PK ์ ๋ต.
- ๋์์ฑ ์ ์ด
- ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ดํ์ ๋ฐฉ์ ์ค ์ ํ.
- ๋น๊ด์ ๋ฝ.
- ๋๊ด์ ๋ฝ.
- ๋น๋๊ธฐ ์ง๋ ฌํ ์ฒ๋ฆฌ.
- ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ดํ์ ๋ฐฉ์ ์ค ์ ํ.
- ์บ์ฑ ์ ๋ต
- ๋๋ฉ์ธ์ ๋ฐ๋ผ ๋ฐฐ์น ์ฒ๋ฆฌ์ ์ฉ.
- ๋๋ฉ์ธ์ ๋ฐ๋ผ Cache-Aside ์ ์ฉ
- TTL ํ์ฉ.
- Cache Stampede ์ ์ดํ ๊ฒ.
๋ถ์ฐ ์์คํ ์ ์ดํ์ ์์ฑ์ ์ ๋ถ ์จ์ ํ ์ถฉ์กฑ์ํฌ ์ ์์. ์ถ๊ฐ์ ์ผ๋ก, Partition Tolerance์ ๊ฒฝ์ฐ, ๋คํธ์ํฌ ๋จ์ ์ด ์ธ์ ๋ ์ง ๋ฐ์ํ ์ ์๋ ์์คํ ์ ํน์ฑ์ ๊ณ ๋ คํ ๋, ์์คํ ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ์๋ถ๊ฐ๊ฒฐํ ํน์ฑ์. Consistency์ Availability ์ค ๋๋ฉ์ธ ํน์ฑ์ ๋ง์ถฐ ์กฐ์ ํ ํ์๊ฐ ์์.
- ์ ํ๋ ์ฐ๊ธฐ๊ฐ ๋ชจ๋ ํํ ์ฝ๊ธฐ์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋จ. | ๊ฐํ ์ผ๊ด์ฑ
- ์ฌ์ฉ์๋ ํญ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์.
- ์ผ๋ถ ๋ ธ๋์ ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ์์คํ ์ ๊ณ์ ์๋ตํด์ผ ํจ.
- ๋ชจ๋ ์์ฒญ์ ๋ํด ์๋ต์ ๋ฐํํจ.
- ๋คํธ์ํฌ์ ๋จ์ ์๋ ์์คํ ์ด ๋์ํด์ผ ํจ.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋, ๋ฉ์์ง์ ๋ฐํ๊ณผ ์ค์ ํธ๋์ญ์ ์ด ์์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ๋จ์ ์ํฉ์์๋ ์ต์ข ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์ค๊ณ๊ฐ ํ์ํจ.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์๋ ๋ฉ์์ง์ ๋ฐํ๊ณผ DB์ ํธ๋์ญ์ ์ด ์์์ฑ์ ๊ฐ์ง์ง ์์.
- ๋คํธ์ํฌ ์ ์ค์ด ๋ฐ์ํ ๊ฒฝ์ฐ, ๋ฉ์์ง์ ๋ฐํ ๋๋ DB์ ํธ๋์ญ์ ์ด ์คํจํ์ฌ ์์คํ ๊ฐ ๋ถ์ผ์น๊ฐ ์ผ๊ธฐ๋จ.
- ๋คํธ์ํฌ ์ฅ์ ์ํฉ์์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๋ฉ์์ง๋ฅผ ์ต์ข ์ ์ผ๋ก ์ ๋ฌํ๋(At-least-once delivery) ์ค๊ณ๊ฐ ํ์์ ์ | ์ต์ข ์ผ๊ด์ฑ
- Prepare Phase
- Coordinator๊ฐ ๋ชจ๋ Participant์๊ฒ ์ค๋น ์ํ๋ฅผ ์ฟผ๋ฆฌํจ.
- Participant๋ ๋ก์ปฌ ํธ๋์ญ์ ํ, ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ์ ์๋์ง ํ์ธํ๊ณ Lock.
- ์ค๋น๊ฐ ๋์์ ๊ฒฝ์ฐ Yes, ์๋๋ฉด No.
- Commit Phase
- ๋ชจ๋ Participant๊ฐ Yes๋ผ๊ณ ์๋ตํ ๊ฒฝ์ฐ, Coordinator๊ฐ Commit ๋ช ๋ น์ ๋ด๋ฆผ. ๋จ ํ๋๋ผ๋ No, ๋๋ Timeout์ด ๋ฐ์ํ ๊ฒฝ์ฐ Rollback.
- Participant๋ Coordinator์ ๋ช ๋ น์ ๋ฐ๋ผ ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํจ.
- ๋ชจ๋ ๋ณด๊ณ ๊ฐ ์๋ฃ๋๋ฉด ํธ๋์ญ์ ์ด ์ข ๋ฃ๋จ.
- Coordinator๊ฐ SPOF๋ก ๊ธฐ๋ฅํจ.
- ์๋ต ์๋๊ฐ ๋ฆ์ผ๋ฉฐ, ์์คํ ์ ๊ฐ์ฉ์ฑ์ด ๋ฎ์์ง.
- ์ธํ๋ผ ๋จ์์์ ์ง์ ํ์ํจ.
- Lock ์ ์ ์๊ฐ์ด ๋์ด๋จ.
- ์๋ฒ๊ฐ ์ด๋ฒคํธ ๋งค๋์ ๋ก ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ธฐ ์ด์ ์, ์๋ฒ๊ฐ DB์ Outbox ํ ์ด๋ธ์ ์ด๋ฒคํธ ์ ์ก ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
- Message Relay | common:outbox-message-relay
- ๋ณ๋์ Message Relay ํ๋ก์ธ์ค๊ฐ Outbox ํ ์ด๋ธ์ ํด๋งํ์ฌ ์ด๋ฒคํธ ๋งค๋์ ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ค.
- ์ด๋ฒคํธ๊ฐ ๋ฐํ๋์์ ๊ฒฝ์ฐ, ํด๋น ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
- Transaction Log Tailing(CDC)
- DB๊ฐ ๊ฐ ํธ๋์ญ์ ์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ค. ๋ณ๋์ ์์ด์ ํธ๊ฐ ๋ก๊ทธ๋ฅผ ์ถ์ ํ๋ค๊ฐ Outbox ํ ์ด๋ธ์ ๋ก๊ทธ๊ฐ ๊ธฐ๋ก๋ ๊ฒฝ์ฐ, ๊ฐ์งํ๊ณ ์คํํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋จ์์์ ๊ตฌํ์ด ๊ฐ๋ฅํจ.
- 2PC ๊ธฐ๋ฒ์ ๋นํ์ฌ, ์๋ต์๋๊ฐ ์ฐ์ํ๊ณ ๊ฐ์ฉ์ฑ์ด ๋์ | ์ต์ข ์ผ๊ด์ฑ
- ์ด๋ฒคํธ์ ๋ฐํ๊ณผ Consumer๊ฐ ์ฒ๋ฆฌํ๊ธฐ๊น์ง ์ง์ฐ์ด ๋ฐ์ํ ์ ์์.
- ๋ชจ๋ ๋ฉ์์ง์ ์ต์ ํ ๋ฒ์ ๋ฐํ์ ๋ณด์ฅํจ.
- ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ธํ ์ค๋ณต๋ฐํ์ด ๋ฐ์ํ ์ ์์ด Consumer ์ธก์์ ๋ณ๋์ ๋ฉฑ๋ฑ์ฑ ์ค๊ณ๊ฐ ํ์ํจ.
- ์ ํ๋ฆฌ์ผ์ด์ ๋จ์์ ๊ตฌํ์ด ๊ฐ๋ฅํจ.
- DB๋ก๋ถํฐ ๋ ๋ฆฝ์ ์.
- ๋ฉ์์ง๋ฅผ ์์ ๋กญ๊ฒ ๊ตฌ์ฑํ ์ ์์.
- DB์ ์ง์์ ์ธ ๋ถํ๋ฅผ ์ ๋ฐํจ.
- ์ค์๊ฐ์ฑ ๋ฎ์.
- ์๋น์ค ๋ด๋ถ์ ์ธ ์์์ฑ ยท ์ ํจ์ฑ ์ฒดํฌ.
- ๋คํธ์ํฌ ์ ์ค ์ํฉ์์๋ At-least-once ๋ฐํ์ ๋ณด์ฅํ์ฌ ์ต์ข ์ผ๊ด์ฑ ๋ณด์ฅ.
- Redis๋ฅผ ์ฃผ ์ ์ฅ์๋ก, RDB๋ฅผ ๋ฐฑ์ ์ผ๋ก ํ์ฉ.
- ๊ณ ๋น๋ ์ฐ๊ธฐ ์์ ์ผ๋ก ์ธํ Write-Back + ๋ฐฐ์น ์ ๋ต.
- ์ ํฉ์ฑ๋ณด๋ค ์์คํ ๊ฐ์ฉ์ฑ๊ณผ ์๋ต ์๋๋ฅผ ์ฐ์ ์ํ์ฌ ์ฝ๊ฐ์ ์ค์ฐจ ํ์ฉ.
- ๊ฐ์ค์น ๊ธฐ๋ฐ ์ค์ฝ์ด๋ง ์ ์ฉ.
- ์ค์๊ฐ JOIN ๋์ , ๋น๋๊ธฐ ์ด๋ฒคํธ ์๋น๋ฅผ ํตํ ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ.
- ์ฐ๊ธฐ ์๋ฃ ํ, ๋ชจ๋ ์ฝ๊ธฐ๋ ์ต์ ๊ฐ์ ๋ฐํํด์ผ ํจ.
- ์ฐ๊ธฐ ์๋ฃ ํ, ์ดํ์ ๋ชจ๋ ์ฝ๊ธฐ์ ๋ํด ์ ์ฉ๋จ.
- ๋ฝ, ๋๊ธฐํ ๋น์ฉ ๋ฐ์.
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅ.
- ์ฑ๋ฅ์ ์ ํ์ํค๊ณ , ํ์ฅ ๋น์ฉ ์ฆ๋.
- ๋ถ์ฐ ํ๊ฒฝ์์ ๊ตฌํ ๋์ด๋๊ฐ ๋์.
- ์ผ์์ ์ธ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ฅผ ํ์ฉํ๊ณ , ์๊ฐ์ด ์ง๋๋ฉด ์๋ ดํจ.
- ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์ฆ์ ์์ ๋์ง ์์์๋ ์์.
- ๋น๋๊ธฐ ๊ธฐ๋ฐ.
- ํ์ฅ์ฑ์ด ๋๊ณ , ๊ฐ์ฉ์ฑ์ด ๋์.
- ๋คํธ์ํฌ๊ฐ ๋จ์ ๋ ์ํฉ์์ ์ ๋ฆฌํจ.
- ์ผ์์ ์ผ๋ก ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ณ , ์ค๊ณ๊ฐ ๋ณต์กํด์ง ์ ์์.
| ๋๋ฉ์ธ | ์ผ๊ด์ฑ ์์ค | ์ฌ์ |
|---|---|---|
| ๊ฒ์๊ธ ์์ฑ | ์์คํ
์ฐจ์์ ์ต์ข
์ผ๊ด์ฑ. ๋ค๋ง, ์๋น์ค ๋ด๋ถ์ ์ผ๋ก๋ ๊ฐํ ์ผ๊ด์ฑ ๋ณด์ฅํจ. |
์๋น์ค ๋ด๋ถ์ ์ผ๋ก๋ @Transactional ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์ฌ DB์ ์ง์ ํต์ ํ๋, ์กฐํ๋ ๋ณ๋์ ์๋น์ค๊ฐ ๋ด๋นํ์ฌ(ํ์ ) ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋์ง ์์ ์ ์์. ์กฐํ ๊ด์ ์์๋ Transactional Outbox ํจํด์ผ๋ก ์ต์ข ์ผ๊ด์ฑ ๋ณด์ฅํจ. |
| ์ข์์ | ์์คํ
์ฐจ์์ ์ต์ข
์ผ๊ด์ฑ. ๋ค๋ง, ์๋น์ค ๋ด๋ถ์ ์ผ๋ก๋ ๊ฐํ ์ผ๊ด์ฑ ๋ณด์ฅํจ. |
์๋น์ค ๋ด๋ถ์ ์ผ๋ก๋ @Transactional ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์ฌ DB์ ์ง์ ํต์ ํ๋, ์กฐํ๋ ๋ณ๋์ ์๋น์ค๊ฐ ๋ด๋นํ์ฌ(ํ์ ) ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋์ง ์์ ์ ์์. ์กฐํ ๊ด์ ์์๋ Transactional Outbox ํจํด์ผ๋ก ์ต์ข ์ผ๊ด์ฑ ๋ณด์ฅํจ. |
| ์กฐํ์ | ์ต์ข
์ผ๊ด์ฑ, ๋ค๋ง, ์กฐํ ์์ ์ Redis ์ค์๊ฐ์ผ๋ก ์ฐธ์กฐํจ. |
์กฐํ์ ํน์ฑ์ ์ฐ๊ธฐ ๋น๋๊ฐ ๋งค์ฐ ๋์ ์ฝ๊ธฐ ๋ชจ๋ธ์ ํฌํจํ ๊ฒฝ์ฐ ์บ์ ๋ฌดํจํ ๋น์ฉ์ด ๊ณผ๋คํ๋ฏ๋ก, Redis๋ฅผ ์ง์ ์ฐธ์กฐํจ. |
| ์ธ๊ธฐ๊ธ | ์ต์ข ์ผ๊ด์ฑ | ์ฌ๋ฌ ๋๋ฉ์ธ์ ์ด๋ฒคํธ๋ฅผ ์๋นํ์ฌ ์ค์ฝ์ด๋ง์ ์ํํ๋ฏ๋ก ๋ฐ์ดํฐ ๋ฐ์์ ์ง์ฐ ๋ฐ์. |
@Transactional์ด๋ ธํ ์ด์ ์ ํตํด ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํต๊ณ ์ ๋ฐ์ดํธ(์นด์ดํธ), Outbox ๊ธฐ๋ก์ ํ๋์ ์์์ ์์ ์ผ๋ก ๋ฌถ์.- ArticleLikeService ๋ฑ์์ ๋น๊ด์ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋์ผ ์์์ ๋ํ ๊ฒฝํฉ ๋ฐ์ ์์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๊ฐ์ ํจ.
- ์ด๋ฒคํธ ๋ฐํ์ ์ธ๋ถ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์๋ ๋ก์ปฌ DB์ Outbox ํ ์ด๋ธ์ ์์ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ์ ์์์ฑ์ ํ๋ณดํจ.
- AFTER_COMMIT ์์ ์ ์ฆ์ ๋ฐํ๊ณผ ์ค์ผ์ค๋ฌ๋ฅผ ํตํ ๋ฏธ๋ฐํ ๋ฐ์ดํฐ ์ฌ์ฒ๋ฆฌ๋ฅผ ํตํด, ๋คํธ์ํฌ ์ฅ์ ์ํฉ์์๋ At-least-once์ ๋ณด์ฅํจ.
- ์๋ฒ์ ์ฐ์ฐ๋ ๊ณผ๋ค.
- JSON ์ง๋ ฌํ ยท ์ญ์ง๋ ฌํ ๋น์ฉ ๋์ .
- ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง.
- ์บ์ ๋ฏธ์ค ์ฆ๊ฐ.
- GC ๋น๋ ์ฆ๊ฐ.
- ๊ณผ๋ํ ๊ฐ์ฒด ์์ฑ.
- ์ฆ์ DB ํธ์ถ.
- ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํธ์ถ.
- ์ธ๋ถ API ํธ์ถ.
- ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์๋ ์ฟผ๋ฆฌ.
- ์ง๊ณ ์ฟผ๋ฆฌ ๊ณผ๋ค.
- Full Table Scan
- ๋งค ์์ฒญ๋ง๋ค UPDATE ์ฟผ๋ฆฌ ๋ฐ์.
- ๋ค์์ ๋ ธ๋์์ ๋์ผํ ํ์ ๋ํ ์ ๊ทผ ๋ฐ์.
- SELECT GROUP BY, ORDER BY, LIMIT ์ ์ฟผ๋ฆฌ ๋ฐ์.
- ๋๋์ ๋ฐ์ดํฐ ์ค์บ.
- ๋์คํฌ I/O ์ง์ค.
- ์ค๋ณต ๋ฐฉ์ง ๋ก์ง ํ์ํจ.
- ํธ๋์ญ์ ์ถฉ๋.
- ์ธ๋ฑ์ค ์ค๊ณ์ ๋ฐ๋ผ ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ.
- CPU ์ฌ์ฉ๋ฅ .
- ๋ฉ๋ชจ๋ฆฌ ๋ถํ.
- DB ์ปค๋ฅ์ ์.
- SLOW QUERY ๋ก๊ทธ.
- TPS ยท QPS ์ธก์ .
- ์๊ณ์ ํ์ .
- ํน์ API์ ๋ํ ์๋ต ์ง์ฐ.
- ํ์์์ ๋ฐ์ ๊ตฌ๊ฐ.
- ์์ธ ๋น๋.
A -> B -> C
- C์ ์ฅ์ ๊ฐ A, B์๊ฒ๋ก ์ ํ๋จ.
- C์ ์ฅ์ ๊ฐ ์์คํ ์ ์ฒด์ ์ฅ์ ๋ก ์ด์ด์ง.
- DB ์๋ต ์ง์ฐ.
- ์ธ๋ถ API ์ง์ฐ.
- ์ฐ๋ ๋ ๋ธ๋กํน ์ฆ๊ฐ.
- ์ปค๋ฅ์ ์ด ๋ฐํ๋์ง ์์ ๊ฒฝ์ฐ, ๋๊ธฐ ์์ฒญ์ด ์ฆ๊ฐํด ๊ฐ์ฉ์ฑ์ด ์ ํ๋จ.
- ๋จ์ผ DB
- ๋จ์ผ ์บ์ ์๋ฒ
- ๊ณตํต ๋ฉ์์ง ๋ธ๋ก์ปค
- ํ ์ง์ ์ ์ฅ์ ๊ฐ ์ ์ฒด ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ๊ฒ ๋จ.
- ๋ฉ์ธ ํ์ด์ง์ ๋ก๋ฉ ์ง์ฐ.
- DB ๋ถํ ์ฆ๊ฐ.
- ์ ์ฒด ์กฐํ API์ ์ํฅ์ ์ค.
- ํธ๋์ญ์ ๊ฐ ๋์ผํ ํ์ ๋ํ ๋ฝ ๊ฒฝํฉ.
- DB ์ปค๋ฅ์ ๋๊ธฐ ์ฆ๊ฐ.
- ์ ์ฒด API ์๋ต์๋ ์ ํ.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ.
- ๋ฉ์์ง ํ ํ์ฉ.
- ์ธ๋ถ ํธ์ถ์ ๋ํ ํ์์์์ ์ค์ .
- ๋ฌดํ ๋๊ธฐ ๋ฐฉ์ง.
- ์ฝ๊ธฐ ยท ์ฐ๊ธฐ ๋ถ๋ฆฌ. -> CQRS
- ๊ธฐ๋ฅ ๋จ์์ ๋ถ๋ฆฌ.
- ์กฐํ ์์ฒญ > ์ฐ๊ธฐ ์์ฒญ.
- ๋์ผ ๋ฐ์ดํฐ์ ๋ํ ๋ฐ๋ณต ์กฐํ ๋น๋ ๋์.
- ์กฐํ ์์ฒญ์ด ์ผ๋ถ ๋ฐ์ดํฐ์ ๋ํด ์ง์ค๋จ.
- ๋จ์ผ DB์ ๋ํ ๋ถํ ์ง์ค.
- ์ฐ๊ธฐ ๋ฝ์ด ์ฝ๊ธฐ ์ง์ฐ์ผ๋ก ๋ํ๋จ.
- ํ์ฅ ๋ณต์ก๋ ๋์.
- Redis ๊ธฐ๋ฐ Cache-Aside ์ ๋ต ์ ์ฉ.
- DB I/O ๊ฐ์.
- ์๋ต ์๋ ๊ฐ์ .
- ์บ์ ๋ฌดํจํ ์ ๋ต ํ์.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ณ ๋ ค ํ์.
- ์กฐํ์
- ์ธ๊ธฐ๊ธ
- ํต๊ณ์ฑ ๋ฐ์ดํฐ -> ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋น์ ๊ทํํ์ฌ ์บ์ฑ.
- Command: ์ํ๋ฅผ ๋ณํ์ํค๋ ์์ฒญ(์ฐ๊ธฐ)
- Query: ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์์ฒญ(์ฝ๊ธฐ) -> ๋ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์ค๊ณ.
- ์ ๊ทํ ์ ์ง.
- ํธ๋์ญ์ ์ค์ฌ ์ค๊ณ.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ ์ฐ์ .
- ์กฐํ๊ฐ ์ฆ์ ๋ฐ์ดํฐ์ ๋ํ ๋น์ ๊ทํ ์ ์ฉ.
- ์ง๊ณ ๋ฐ์ดํฐ ํฌํจ.
- ์ฝ๊ธฐ ยท ์ฐ๊ธฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅ.
- ๋ณต์ก๋๊ฐ ๊ฐ์ํจ.
- ์ฅ์ ๊ฐ ์ ํ๋๋ ๋ฒ์๊ฐ ์ถ์๋จ.
- ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ ์ ์์.
- ๊ตฌํ ์์ ๋ณต์ก๋ ์ฆ๊ฐ.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ ํ์ํจ.
- ์ต์ข ์ผ๊ด์ฑ ๊ณ ๋ ค ํ์.
- ์ฝ๊ธฐ ํธ๋ํฝ์ด ์๋์ ์ผ๋ก ๋์ ๊ฒฝ์ฐ.
- ์ง๊ณ ์กฐํ๊ฐ ์ฆ์ ๊ฒฝ์ฐ.
๋ฐ์ดํฐ์ ์ฌ๋ณธ์ ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต์ ์ ์ฅํ์ฌ ๋์คํฌ I/O๋ฅผ ์ค์ด๊ณ , ์๋ต์๋๋ฅผ ๊ฐ์ ํ์ฌ ์ฝ๊ธฐ ํธ๋ํฝ์ผ๋ก ์ธํ ๋ณ๋ชฉ์ ์ํํ๋ ์ ๋ต.
- DB ๋ถํ ๊ฒฝ๊ฐ.
- ์๋ต ์๋ ๊ฐ์ .
- ๋ณ๋ชฉ ์ํ.
- Hot-Data ๋ฐ๋ณต์กฐํ ์ต์ ํ.
- ๋์ผํ ๊ฒ์๊ธ์ ๋ํ ๋ฐ๋ณต ์กฐํ ๋น๋ ๋์.
- ๋ณ๊ฒฝ ๋น๋ ๋ฎ์.
- ํ์ด์ง ๋จ์๋ก ๋ฐ์.
- ์ธ๊ธฐ ๊ฒ์๊ธ์ ๋ํ ์ง์ค ํธ๋ํฝ ๋ฐ์.
- ID ๋ชฉ๋ก๊ณผ, ๊ฐ๋ณ ๊ฒ์๊ธ์ ์บ์ฑํ์ฌ ํ์ด์ง ์ฌ์ด์ฆ์ ๋ณ๊ฒฝ, ๋ฌดํ์คํฌ๋กค ๋ฐฉ์์๋ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์์.
- ์ค์๊ฐ์ฑ ๋ฎ์.
- ๋ฐ๋ณต ์กฐํ ๋น๋ ๋์.
- ์ง๊ณ ์ฟผ๋ฆฌ(GROUP BY, ORDER BY)๋ ๊ธฐํ ์๋น์ค์ ์ง์์ ์ธ I/O ์ ๋ฐํ์ฌ DB ๋ถํ๋ฅผ ๋์ ์ํด.
- ์บ์ ์กฐํ.
- ์์ ๊ฒฝ์ฐ, DB ์กฐํ.
- ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅ.
- ์๋ต ๋ฐํ.
- ๊ฒ์ํ ์กฐํ์ ํ์ฉ.
- ๊ตฌํ์ด ๋จ์ํจ.
- ํ์ํ ๋ฐ์ดํฐ๋ง ์บ์๋จ.
- ์บ์ ๋ฏธ์ค ์, DB ๋ถํ ๋ฐ์.
- ๋ฌดํจํ ์ ๋ต ์ถ๊ฐ ํ์.
๋ฐ๋ณต์ ์ธ ์ฐ๊ธฐ๋ฅผ ์บ์ํ๊ณ , ๋ฐฐ์น ๋จ์๋ก DB์ ์ ์ฅ. ์กฐํ์ ์ง๊ณ์ ํ์ฉ.
- ์ฐ๊ธฐ ์ฑ๋ฅ ํฅ์.
- DB ๋ถํ ๊ฐ์.
- ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ.
- ์ผ์์ ์ธ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฐ์.
์ผ์ ์๊ฐ ํ, ์๋์ผ๋ก ์บ์๋ฅผ ์ญ์ ํจ.
- ๋จ์ํ๊ณ , ์์ ํจ.
- ๋ง๋ฃ ์งํ์ ํธ๋ํฝ์ด ์ง์ค๋ ๊ฒฝ์ฐ, ๋์๋ค๋ฐ์ ์ธ DB ์ ๊ทผ ๋ฐ์ํจ.
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ๊ด๋ จ๋ ์บ์๋ฅผ ๊ฐฑ์ ํจ.
- ์ผ๊ด์ฑ ์ ์ด ๊ฐ๋ฅ.
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ ๊ณผ ์บ์ ๋ณ๊ฒฝ ์์ ์ ๋๊ธฐํ์ํฌ ์ ์์.
- TTL ์์กด๋ ์ ํ ๊ฐ๋ฅ.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ณต์ก๋.
๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ๋งค๊ฐ๋ก, ์๋น์ค ๊ฐ์ ์ํ ๋ณํ๋ฅผ ๋ฐํ(Publish), ๊ตฌ๋ (Subscribe)ํ์ฌ ์ ํํ๊ณ , ์ด๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์์คํ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ์ค๊ณ ์ ๋ต.
- ์๋น์ค ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ํ๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง(์: ๊ฒ์๊ธ์ ์ ์ฅ)๊ณผ ์๋น์ค๊ฐ ํต์ ํ๋ฉฐ ๋ฐ์ํ๋ ๋ถ๊ฐ์ ์ธ ์์ (์: ์กฐํ ๋ชจ๋ธ ๊ฐฑ์ , ์ง๊ณ)์ ๋ถ๋ฆฌํ์ฌ ์๋ต์๋๋ฅผ ๊ฐ์ ํจ.
- ์ง์ ์ ์ธ API ํธ์ถ์ ์ ๊ฑฐํ๊ณ , ์ด๋ฒคํธ๋ฅผ ํตํด ๋์จํ๊ฒ ๊ฒฐํฉํ์ฌ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ ๋ฆฝ์ ์ธ ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํจ.
- Consumer ์๋น์ค์ ์ฅ์ ๊ฐ Producer ์๋น์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋ณดํธํจ.
- ๋น์ฆ๋์ค ๋ก์ง์ DB ๋ณ๊ฒฝ๊ณผ ์ด๋ฒคํธ ๋ฐ์ดํฐ ์ ์ฅ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด ๋ฐ์ดํฐ ์ ์ค์ ์ฐจ๋จ.
- ํธ๋ํฝ ํญ์ฆ ์ ์ด๋ฒคํธ๋ฅผ Kafka์ ์ ์ฌํ์ฌ Consumer๊ฐ ์์ ์ ์ฒ๋ฆฌ ์๋์ ๋ง์ถฐ ์๋นํ๊ฒ ํจ์ผ๋ก์จ ์์คํ ์์ ์ฑ ์ ์ง.
- ๋ฐํ๊ณผ ์๋น ์ฌ์ด ์๊ฐ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์์ ์ธ์งํ๊ณ , ๋๋ฉ์ธ ํน์ฑ์ ๋ฐ๋ผ ๋ฐ์ํ ๊ฒ.
- MessageRelay์ ์ฌ์๋๋ก ์ธํด ๋์ผํ ์ด๋ฒคํธ๊ฐ ์ค๋ณต ์์ ๋ ์ ์์ผ๋ฏ๋ก, Consumer ์ธก์์ ๋ฉฑ๋ฑ์ฑ ์ค๊ณํ ๊ฒ.
์ปค๋งจ๋ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ์ ์ต์ ํ๋ ๊ตฌ์กฐ๋ก ๋ณํํ ๊ฒ. ์๋ต ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋น์ ๊ทํํ์ฌ ์ ์ฅํด ๋ค๋ฅธ ์๋น์ค๋ก์ JOIN์ ์ต์ํํ๊ณ , ํ๋ก๊ทธ๋๋จธ์ ํธ์์ฑ์ ์ฆ๋ํจ.
| ์ข ๋ฅ | ํ๋/ ๋ฉ์๋๋ช | ์์ธ |
|---|---|---|
| Long | articleId | * ์ดํ Article ํด๋์ค ํ๋ |
| String | title | `` |
| String | content | `` |
| Long | boardId | `` |
| Long | writerId | `` |
| LocalDateTime | createdAt | `` |
| LocalDateTime | modifiedAt | `` |
| Long | articleCommentCount | ArticleCommentCountRepository๋ก๋ถํฐ fetchํ ์ข์์ ์. |
| Long | articleLikeCount | ArticleLikeCountRepository๋ก๋ถํฐ fetchํ ๋๊ธ ์. |
| ํฉํ ๋ฆฌ ๋ฉ์๋ | create | Kafka๊ฐ ์์ฑํ ์ด๋ฒคํธ, ๋๋ DB์์ fetchํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ArticleQueryModel์ ์์ฑํ๋ ํฉํ ๋ฆฌ ๋ฉ์๋. |
| Setter | updateBy | Kafka๊ฐ ์์ฑํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ArticleQueryModel์ ๊ฐฑ์ ํ๋ ๋ฉ์๋. |
- ์กฐํ์ ์ญ์ ์กฐํ ๋ชจ๋ธ ์์ฑ์ ํ์ํ์ง๋ง,
- ์ค์๊ฐ์ฑ์ด ๋์ผ๋ฉฐ,
- Redis๋ฅผ ์ฃผ ์ ์ฅ์๋ก ์ฐ๊ธฐ ๋๋ฌธ์, ์๋น์ค ๋จ์์ ์ง์ ๊ฒฐํฉํ๋ ํํ๋ก ์ค๊ณํจ.
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํ ๋ชจ๋ธ์ด ์๋. ์ธ๋ถ์์ ๊ฐ์ ์กฐ์ํ ์ ์๊ฒํ ๊ฒ.
DB์ ์คํค๋ง ๋ณ๊ฒฝ๊ณผ ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ ๋ถ๋ฆฌํ ๊ฒ.
์กฐํ API์ ๋ง์ถฐ ์ค๊ณํ ๊ฒ.
ํ์ํ ๋ฐ์ดํฐ๋ ๋ฏธ๋ฆฌ ํฌํจํ ๊ฒ.
๋๊ธ์, ์ข์์์, ์กฐํ์ ๋ฑ์ ์ง๊ณ๊ฐ์ ๋ฏธ๋ฆฌ ํฌํจํ ๊ฒ.(* ๋ณ๋์ฑ์ด ํฐ ๋ฐ์ดํฐ๋ ๋ชจ๋ธ์์ ์ ์ธํ๊ณ , ์ค์๊ฐ ๋ณํฉ ๋ฑ์ ์ฌ์ฉํ ์ ์์.)
- ์ฐ๊ธฐ ์, ์กฐํ ๋ชจ๋ธ์ ์ฆ์ ์ ๋ฐ์ดํธํจ.
- ๊ฐํ ์ผ๊ด์ฑ.
- ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ๋ ์ ์์.
- ์ด๋ฒคํธ๋ฅผ ์๋นํ ๋ค, ์กฐํ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํจ.
- ์ต์ข ์ผ๊ด์ฑ.
- ์ฝ๊ธฐ ์ฑ๋ฅ ์ต์ ํ.
- DB ๋ถํ ๊ฐ์.
- API ๊ตฌ์กฐ ๋จ์ํ.
- ๋ฐ์ดํฐ ์ค๋ณต ์ฆ๊ฐ.
- ๋๊ธฐํ ๋ณต์ก๋ ์ฆ๊ฐ.
- ์ผ์์ ์ธ ๋ถ์ผ์น ๋ฐ์ ๊ฐ๋ฅ.
์์คํ ์ ๊ท๋ชจ, ํ์ ๊ตฌ์กฐ, ๋๋ฉ์ธ ๋ณต์ก๋์ ๋ฐ๋ผ ๋น์ฉ ๋๋น ์ต์ ์ ํจ์จ์ ๋ผ ์ ์๋ ์ํคํ ์ฒ๋ฅผ ์ ํํด์ผ ํจ. ๋ณธ ํ๋ก์ ํธ์์๋ ํ์ฅ์ฑ, ๋๋ฉ์ธ ๊ฐ ๊ฒฉ๋ฆฌ๋ฅผ ์ํด MSA๋ฅผ ์ฑํํจ.
- ๊ฐ๋ณ ์๋ฒ์ CPU, Memory, Disk ์ฑ๋ฅ ์ฆ๊ฐ.
- ๋ณ๋์ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์์.
- ๋ฌผ๋ฆฌ์ ์ธ ํ๊ณ ์กด์ฌํจ.
- ์๊ณ์ ์ดํ๋ถํฐ๋ ๋น์ฉ ๋๋น ํจ์จ์ด ๊ธ๊ฒฉํ ๊ฐ์ํจ.
- ์๋ฒ ์์ ํก์ ์ธ ์ฆ๊ฐ๋ฅผ ํตํด ์ฒ๋ฆฌ๋์ ํ์ฅํจ.
- Load Balancer์ ๊ฐ์ ๋ณ๊ฐ์ ๋๋ฐ์ด์ค๋ฅผ ํตํด ํธ๋ํฝ์ ๋ถ์ฐํจ.
- ์ถ๊ฐ์ ์ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ด ํ์์ ์ผ๋ก ์๋ฐ๋จ.
- ๋น์ฉ ๋๋น ํจ์จ์ด Scale-Up ์ ๋ต๋ณด๋ค ์ฐ์ํจ.
- ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋จ์ผ ์ฝ๋ ๋ฒ ์ด์ค์ ์์.
- ๊ฐ๋ฐ ยท ๋ฐฐํฌ๊ฐ ๊ฐ๋จํจ.
- ํน์ ์ปดํฌ๋ํธ์ ๋ถ๋ถ์ ์ธ ํ์ฅ์ด ๋ถ๊ฐ๋ฅํจ.
- ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋จ.
- ํน์ ์ปดํฌ๋ํธ์ ์ฅ์ ๊ฐ ์์คํ ์ ์ฒด๋ก ์ ํ๋จ.
- ๊ธฐ๋ฅ ๋จ์๋ก ์๋น์ค๋ฅผ ๋ถ๋ฆฌํจ.
- ์๋น์ค ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํจ.
- ํน์ ์๋น์ค๋ง ๊ฐ๋ณ์ ์ผ๋ก ํ์ฅํ ์ ์์.
- ๋คํธ์ํฌ ๋น์ฉ์ด ์ฆ๊ฐํจ.
- ๋ถ์ฐ ํธ๋์ญ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.
- ํ ์คํธ ยท ์ด์ ๋ณต์ก์ฑ์ด ํฌ๊ฒ ์ฆ๊ฐํจ.
- ํน์ ๊ธฐ๋ฅ์ ํธ๋ํฝ์ด ์ง์ค๋ผ, ํด๋น ๋ชจ๋๋ง ์ถ๊ฐ ์์์ด ํ์ํ ๊ฒฝ์ฐ.
- ๋จ์ผ ์ฝ๋ ๋ฒ ์ด์ค ๋ด์์, ๋ชจ๋ ๊ฐ ์ฐธ์กฐ๊ฐ ์ฝํ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๊ณ , ์์ ์์ ์ด ์๊ธฐ์น ๋ชปํ ๋ถ์์ฉ์ ๋ง๋๋ ๊ฒฝ์ฐ.
- ๋ค์์ ๊ฐ๋ฐ ํ์ด ์๋ก์ ๋ฐฐํฌ์ฃผ๊ธฐ์ ๊ฐ์ญ๋ฐ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํด์ผํ๋ ๊ฒฝ์ฐ.
- ๋น์ฆ๋์ค ๋ชจ๋ธ์ด ๊ณ ์ฐฉํ๋์ง ์์ ์๋น์ค ๊ฐ์ ๊ฒฝ๊ณ๊ฐ ๋ถ๋ถ๋ช ํ ์ํฉ์์๋, ๋ถ์ฐ ์์คํ ์ ๋ณต์ก์ฑ์ด ์์ฐ์ฑ์ ์ ํดํจ.
- ๋ถ์ฐ ํ๊ฒฝ์ ๋ชจ๋ํฐ๋ง, ๋ก๊ทธ ์ถ์ , CI/CD ์ธํ๋ผ๊ฐ ๋ฏธ๋นํ ๊ฒฝ์ฐ ์ด์ ๋น์ฉ์ด ํฌ๊ฒ ์์นํจ.
- ๋จ์ผ ์๋ฒ์ Scale-Up๋ง์ผ๋ก ๋์ฒํ ์ ์๋ ๊ท๋ชจ์์๋ MSA ๋์ ์ ์ด๋๋ณด๋ค ์ค๋ฒํค๋๊ฐ ๋ ํผ.
- ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ธฐ์ค์ผ๋ก ์์ง๋๊ฐ ๋์ ๊ธฐ๋ฅ์ ํ๋์ ์๋น์ค๋ก ๋ฌถ์.
- ๊ฒ์๊ธ, ๋๊ธ, ์ข์์, ์กฐํ์๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ์๋น์ค๋ก ํ์ ํ์ฌ ๋ฐ์ดํฐ์ ๋ก์ง์ ๊ฒฉ๋ฆฌํจ.
- ๋ฐ์ดํฐ ์ฐ์ฌ๋ก ์ธํ ์กฐํ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด article-read์ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ ์๋น์ค๋ฅผ ๋ณ๋๋ก ๋์ด ๊ฒฝ๊ณ๋ฅผ ์ต์ ํํจ.
| ์๋น์ค | ์ญํ |
|---|---|
service:article |
๊ฒ์๊ธ ์๋ช ์ฃผ๊ธฐ ์ ์ด |
service:comment |
๋๊ธ ๊ณ์ธต๊ตฌ์กฐ ์ ์ ยท ๋น์ฆ๋์ค ๋ก์ง |
service:like |
์ข์์ ์ค๋ณต๋ฐฉ์ง ์ ์ด ยท ๋น์ฆ๋์ค ๋ก์ง |
service:view |
Redis ์ค์ฌ ์กฐํ์ ๋ฐฐ์น ์ฒ๋ฆฌ |
service:hot-article |
์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ๋ฐ HotArticleScoreUpdater ์ค์ฝ์ด๋ง |
service:article-read |
CQRS Read ์ ์ฉ ์๋น์ค |
- ๊ฐ ์๋น์ค๋ ์์ ๋ง์ด ์ ์ดํ ์ ์๋ ์ ์ฉ ์ ์ฅ์๋ฅผ ๊ฐ์ ธ์ผ ํจ. ํ ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ๊ทผํ๋ ๊ฒ์ ๊ฒฐํฉ๋๋ฅผ ๋์ด๋ฏ๋ก ์ง์ํจ.
- ๋๋ฉ์ธ ํน์ฑ์ ๋ฐ๋ผ view ์๋น์ค๋ ๊ณ ์ฑ๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด Redis์ RDB๋ฅผ ๋ณํํ๊ณ , article-read๋ ํ๋ก์ ์ ๋ชจ๋ธ์ ์ํด Redis๋ฅผ ์ฃผ ์ ์ฅ์๋ก ์ฌ์ฉํ๋ ๋ฑ ์๋น์ค๋ณ ์ต์ ์ ์คํ์ ์ ํํ ์ ์์.
- ๋ถ๋ฆฌ๋ DB ๊ฐ์ ์ผ๊ด์ฑ์ MessageRelay์ Kafka๋ฅผ ํ์ฉํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ต์ข ์ผ๊ด์ฑ์ผ๋ก ํด๊ฒฐํจ.
- ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ์์ ํ ์ ๊ฑฐํ๊ธฐ ์ํด ๊ฒ์๊ธ, ๋๊ธ, ์ข์์ ๋ฑ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ํ ๋นํจ.
- ๋ถ์ฐ ํ๊ฒฝ์์์ ์ ์ผ์ฑ ๋ณด์ฅ ๋ฐ ์๊ฐ ์ ์ ๋ ฌ์ ์ํด ๋ชจ๋ ์ฃผ์ ์ํฐํฐ์ ๊ธฐ๋ณธํค(PK)๋ก Snowflake๋ฅผ ์ฑํํจ. ์ด๋ Auto-increment์ ๋ณด์ ์ทจ์ฝ์ฑ๊ณผ UUID์ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๋ฅผ ๋์์ ํด๊ฒฐํจ.
- ๊ณ ๋น๋ ์กฐํ๊ฐ ๋ฐ์ํ๋ ๊ฒ์๊ธ ๋น ๋๊ธ ์, ์ข์์ ์ ๋ฑ์ ์ํฐํฐ ๋ด์ ํ๋๋ก ๋์ง ์๊ณ BoardArticleCount, ArticleLikeCount ๋ฑ ๋ณ๋ ํต๊ณ ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํจ. ์ด๋ ๋ฉ์ธ ํ ์ด๋ธ์ ์ฐ๊ธฐ ์ ๊ธ(Write Lock) ๊ฒฝํฉ์ ์ค์ด๊ธฐ ์ํจ์.
- V1: ๋ถ๋ชจ ๋๊ธ ID๋ฅผ ์ฐธ์กฐํ๋ ์ ํ์ ์ธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌํ.
- V2: CommentPath ์ํฐํฐ๋ฅผ ๋์ ํ์ฌ ๋๊ธ์ ๊ณ์ธต ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์ด ๋ฑ์ผ๋ก ๊ด๋ฆฌ, ๋ณต์กํ ํธ๋ฆฌ ๊ตฌ์กฐ ์กฐํ ์ฑ๋ฅ์ ์ต์ ํ.
- PK๋ก Snowflake๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฐ์ดํฐ ์ฝ์ ์ ์๊ฐ ์์ผ๋ก ์ ๋ ฌํจ. ์ด๋ ์ฝ์ ์ ์ธ๋ฑ์ค ํ์ด์ง ๋ถํ ์ ์ต์ ํ๊ณ ์ฐ๊ธฐ ์ฑ๋ฅ์ ๋ณด์กดํจ.
- ์ง๊ณ ์ฟผ๋ฆฌ ๋ฐ์ ์, ์ค์ ๋ฐ์ดํฐ ํ์ด์ง์ ์ ๊ทผํ์ง ์๊ณ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค ํ์ฉํ ์ ์๋๋ก ์ธ๋ฑ์ค ๊ตฌ์ฑ.
- ํ์ด์ง ๋ฒํธ๊ฐ ๋ค๋ก ๊ฐ์๋ก ๋ฐ์ํ๋ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด PageLimitCalculator๋ฅผ ํ์ฉํ์ฌ ์ค์บ ๋ฒ์๋ฅผ ์์๋ก ์ ํํจ.
- ๋ฌดํ ์คํฌ๋กค ๊ตฌํ, lastArticleId๋ฅผ ์กฐ๊ฑด์ ์ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ค ์์ ํ์ฌ ์์น๋ถํฐ ์ฆ์ ์ค์บ์ ์์ํ๋๋ก ์ค๊ณํ์ฌ ์ผ์ ํ ์กฐํ ์ฑ๋ฅ์ ํ๋ณดํจ.
- ์ข์์ ์ค๋ณต ์ฌ๋ถ ํ์ธ(findByArticleIdAndUserId)์ ์ํด articleId์ userId๋ฅผ ๋ฌถ๋ ์ ๋ํฌ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ฌ ๊ฒ์ ๋ฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ์๋๋ฅผ ๋์.
- ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์กฐํ ์ฑ๋ฅ์ ์ํด boardId์ articleId ์กฐํฉ์ ๋ํ ์ธ๋ฑ์ค ๊ณ ๋ ค.
๋ฐ์ดํฐ ๊ท๋ชจ๊ฐ ๋จ์ผ ์ฅ๋น์ ์ ์ฅ ์ฉ๋, ์ฒ๋ฆฌ ์ฑ๋ฅ(IOPS)๋ฅผ ์ด๊ณผํ๋ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๋ถ์ฐ ์ ๋ต.
- ํ ๋จ์ ๋ถ๋ฆฌ.
- ๋์ ํ์ฅ์ฑ.
- JOIN, ํธ๋์ญ์ ๋ณต์ก๋ ๋์.
- ์ด ๋จ์ ๋ถ๋ฆฌ.
- ํ์ฅ์ฑ์ด ์ด์ ์์ ์ํด ์ ํ๋จ.
- Range ๊ธฐ๋ฐ -> ๋ฒ์ ์กฐํ ์ ๋ฆฌํจ. ๋ฐ์ดํฐ๊ฐ ์ ๋ฆด ์ ์์.
- Hash ๊ธฐ๋ฐ -> ๊ท ๋ฑ ๋ถ์ฐ. ๋ฒ์ ์กฐํ์ ๋ถ๋ฆฌํจ.
๋ถ์ฐ ํ๊ฒฝ์์ DB์ ์ ์ ๋ฐํ์ ์คํจํ ๋ฉ์์ง๊ฐ ๋จ์ ์์ผ๋ฉฐ, ๋ณต์์ MessageRelay ์ธ์คํด์ค๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ, ๋ฐํ ์์
์ ์ค๋ณต์ ๋ฐฉ์งํ๊ณ ๋ถํ๋ฅผ ๋ถ์ฐํจ. | Load Balancer
- ์ค๋ ์ฝ๋๋ค์ดํฐ |
MessageRelayCoordinator- ๋ถ์ฐ ํ๊ฒฝ์์
MessageRelay๊ฐ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ์ค๋ณต ์ฒ๋ฆฌํ์ง ์๋๋ก ์ธ์คํด์ค๋ณ ์ฒ๋ฆฌ ๋ฒ์๋ฅผ ํ ๋นํจ. assignShards()๋ฉ์๋๋ฅผ ํตํด ํ๋ก์ธ์ค ๋ณ๋ก ์ค๋๋ฅผ ์ง์ ํ์ฌ ์์คํ ์ ์ฒ๋ฆฌ๋์ ์ ํ์ ์ผ๋ก ํ์ฅํ ์ ์์.- 3์ด๋ง๋ค
ping()๋ฉ์๋๋ฅผ ํตํด ๊ฐ ์ธ์คํด์ค์APP_ID, ํ์์คํฌํ๋ฅผ ๊ฐฑ์ ํจ. - 9์ด๊ฐ ์๋ต์ด ์๋ ์ธ์คํด์ค๋ ์๋์ผ๋ก ๋ชฉ๋ก์์ ์ ๊ฑฐ๋จ.
- ๋ถ์ฐ ํ๊ฒฝ์์
- ์ค๋ ๊ธฐ๋ฐ ํด๋ง ๋ฐ ์ฒ๋ฆฌ |
MessageRelay@TransactionalEventListener(phase=TransactionPhase.BEFORE_COMMIT)์ด๋ ธํ ์ด์ ์ ์ด์ฉํด, ๊ฐ๊ฐ์ ์๋น์ค๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ, ๊ฐ ์๋น์ค์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ด๋ฒคํธ์ ์ ์ฅ์ ์์ํํจ.@Async("messageRelayPublishEventExecutor") @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)์ด๋ ธํ ์ด์ ์ ํ์ฉํด, ํด๋ง์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ๋ฉ์์ง๋ฅผ ๋ฐํํ ๋ค, ๏ฟฝKafka๋ก ์ ์กํ๊ณ ์ญ์ ํจ.- ์ ๊ฒฝ๋ก๋ก ๋ฐํ๋ ๊ฒฝ์ฐ, ์ดํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค๊ฐ ์์ ์ด ์์ฐํ ๋ฉ์์ง๋ฅผ ์ง์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
AssignShard๋ฅผ ํ ๋น๋ฐ์ง ์๊ณ ์ฆ์ ์ฒ๋ฆฌํจ. - ์ ๊ฒฝ๋ก๋ก ๋ฐํ๋์ง ๋ชปํ ๊ฒฝ์ฐ,
publishPendingEvent()์ฐ๋ ๋๋ฅผ ์ด์ฉํ์ฌ At-least-once delivery๋ฅผ ๋ณด์ฅํจ. ์ด ๊ฒฝ์ฐ, ์ฌ๋ฌMessageRelay๊ฐ ๊ณต๋์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์AssignShard๋ฅผ ํ ๋น๋ฐ์ ์ฒ๋ฆฌํจ.
- ์ ๊ฒฝ๋ก๋ก ๋ฐํ๋ ๊ฒฝ์ฐ, ์ดํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค๊ฐ ์์ ์ด ์์ฐํ ๋ฉ์์ง๋ฅผ ์ง์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
์ํฐํฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํจ.
MessageRelay๋ Kafka๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋, shardKey๋ฅผ ๋ฉ์์ง ํค๋ก ์ฌ์ฉํจ.- ๋์ผํ shardKey๋ฅผ ๊ฐ์ง ๋ฉ์์ง๋ ๋์ผํ Kafka ํํฐ์
์ ์ ์ฌ๋๋ฏ๋ก, Consumer๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์์๋๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ์ฌ ์ต์ข
์ผ๊ด์ฑ์ ์ ํฉ์ฑ์ ๋์.
- ๋จ,
publishPendingEvent()์ค์ผ์ค๋ฌ๋ก ๋ฐํ๋ ๋ฉ์์ง์ ๊ฒฝ์ฐ, ์์๊ฐ ์ด๊ธ๋ ์ ์์.
- ๋จ,
| ์ํฐํฐ | ์ค๋ ํค | ์ฌ์ |
|---|---|---|
| service:article:Article, BoardArticleCount |
boardId | ๊ฐ๋ณ Article์ Board ๋จ์๋ก ์กฐํ๋๊ธฐ ๋๋ฌธ์, ๊ฒ์ํ ๋จ์๋ก ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํจ. |
| service:comment:CommentV2, ArticleCommentCount |
articleId | ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ณ Article์ ์ข
์๋๊ธฐ ๋๋ฌธ์, ํต๊ณ ๊ฐฑ์ ๋ฐ ์กฐํ ๋ชจ๋ธ๊ณผ์ ์ผ๊ด์ฑ์ ๊ฒ์๊ธ ๋จ์๋ก ์ ์งํ๊ธฐ ์ํจ. |
| service:like:ArticleLike, ArticleLikeCount |
articleId | ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ณ Article์ ์ข
์๋๊ธฐ ๋๋ฌธ์, ํต๊ณ ๊ฐฑ์ ๋ฐ ์กฐํ ๋ชจ๋ธ๊ณผ์ ์ผ๊ด์ฑ์ ๊ฒ์๊ธ ๋จ์๋ก ์ ์งํ๊ธฐ ์ํจ. |
| service:ArticleViewCount | articleId | ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ณ Article์ ์ข
์๋๊ธฐ ๋๋ฌธ์, ํต๊ณ ๊ฐฑ์ ๋ฐ ์กฐํ ๋ชจ๋ธ๊ณผ์ ์ผ๊ด์ฑ์ ๊ฒ์๊ธ ๋จ์๋ก ์ ์งํ๊ธฐ ์ํจ. |
- ๋ถ์ฐ ํ๊ฒฝ์์ ์ ์ผ์ฑ ๋ณด์ฅ ๋ชปํจ.
- ๋ณด์์ ์ทจ์ฝํจ.
- ๋๋ค I/O ์ฆ๊ฐํจ.
- Clustered Index ์ฑ๋ฅ ์ ํ.
- ์๊ฐ ์ ์ ๋ ฌ
- ๋ถ์ฐ ํ๊ฒฝ์์ ์ ์ผ์ฑ์ ๋ณด์ฅํจ.
- ID ์์ ๋นํธ์ ํ์์คํฌํ๋ฅผ ๋ฐฐ์นํ์ฌ, ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๊ฐ ์๊ฐ์ ์ ๋ ฌ๋ก๋ ๊ธฐ๋ฅํจ.
| ์์ค | Dirty Read * ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ ์กฐํ |
Non-Repeatable Read * ํ ํธ๋์ญ์ ๋ด๋ถ์์, ๊ฐ์ ๊ฐ์ ์กฐํํ ๋ ๊ฐ์ ๊ฐ์ด ์ ์ง๋๋๊ฐ? |
Phantom Read * ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์กฐํํ์ ๋, ์ฒ์์๋ ์๋ ๋ ์ฝ๋๊ฐ ๋ํ๋๋ ํ์ |
์์ธ |
|---|---|---|---|---|
| Read Uncommitted | O | O | O | ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ ์ฝ์. |
| Read Committed | X | O | O | ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ฝ์. |
| Repeatable Read | X | X | O | ํธ๋์ญ์ ์์์, SELECT๋ฅผ ๋ฐ๋ณตํ๋๋ผ๋ ๊ฐ์ ๊ฐ ๋ณด์ฅ. |
| Serializable | X | X | X | ์๋ฒฝํ๋, ๊ทน์ฌํ ์ฑ๋ฅ ์ ํ. |
- ๊ธฐ๋ณธ์ ์ผ๋ก, ํธ๋์ญ์ ๋ด๋ถ์์ ๋์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต ์กฐํํ ๋, ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํจ. | Repeatable Read
- MVCC๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ถ๋ถ์ Phantom Read๋ฅผ ๋ฐฉ์งํจ.
- ์ฝ๊ธฐ ์์ ์, ํธ๋์ญ์ ์์ ์์ ์ ์ค๋ ์ท์ ๊ธฐ์ค์ผ๋ก ์ฝ์ผ๋ฉฐ, ๋ณ๋์ ๋ฝ ์์.
- ์ฐ๊ธฐ ์์ ์, Next-Key Lock์ ํตํด ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฝ์ ์ ๋ฐฉ์งํจ.
- SELECT FOR UPDATE, ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ์ ํ ๋ฐ์ดํฐ๋ฅผ UPDATEํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ํน์ํ ์ํฉ์์ Phantom Read ๋ฐ์ ๊ฐ๋ฅ.
- ๋น๊ด์ ๋ฝ: ๋ฐ์ดํฐ ์์ ์์ ์ DB ๋ฝ์ ํ๋ํ์ฌ ์ ํฉ์ฑ์ ๊ฐ์ ํจ.
- ๋๊ด์ ๋ฝ: ๋ฒ์ ์ ๋ณด ์นผ๋ผ์ ํ์ฉํ์ฌ ์ค์ ์์ ์์ ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ ๊ธ ์ ์ง ์๊ฐ์ ์ต์ํํจ.
- Spring์
@Transactional์ด๋ ธํ ์ด์ ์ ๋จ์ผ DB ์ธ์คํด์ค ๋ด๋ถ์ ์ธ ์์์ฑ๋ง ๋ณด์ฅํจ. - ์๋ฒ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ MSA ํ๊ฒฝ์์๋ ๋ชจ๋ ์๋น์ค์ ์ํ๋ฅผ ๋์์ ์ ์ดํ ์ ์์.
- 2PC ๋ฐฉ์์ ๊ฐํ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์ง์ฐ ์๊ฐ, SPOF ๋ฌธ์ ๋ก ์ง์ํจ.
- Transactional Outbox ํจํด์ ํ์ฉํ์ฌ, ์ฝ๊ฐ์ ๋ถ์ผ์น๋ฅผ ๊ฐ์ํ๊ณ ์ต์ข ์ผ๊ด์ฑ ๋ชจ๋ธ์ ์ฌ์ฉํจ.
- ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๊ณต๊ฐ์ ๋์คํฌ์ ์ ์ฅ๊ณต๊ฐ์ ๋นํด ์์.
- ์บ์์ ์๋ณธ ์ฌ์ด์ ์ ํฉ์ฑ์ ๊ดํ ์ค๋ฒํค๋๊ฐ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ํจ.
- ์กฐํ ๋น๋๊ฐ ๋์ ๋ฐ์ดํฐ
- ์ฝ๊ธฐ/์ฐ๊ธฐ ๋น์จ์ด ๋น๋์นญ์ ์ธ ๋ฐ์ดํฐ.
- ์ฐ์ฐ ๋น์ฉ์ด ๋์ ๋ฐ์ดํฐ
- ์ผ์์ ์ธ ๋ถ์ผ์น๊ฐ ํ์ฉ๋๋ ๋ฐ์ดํฐ
- CQRS ํจํด์ ๋ฐ๋ผ ๊ฒ์๊ธ, ์ข์์ ์, ๋๊ธ ์ ๋ฑ์ ํ๋๋ก ๋ฌถ์ด ์บ์ฑ.
- ์๋น์ค ๊ฐ์ API ํธ์ถ ๋น์ฉ, ๋ฐ์ดํฐ ์กฐ๋ฆฝ ๋น์ฉ์ ์ ๊ฑฐํ์ฌ ์กฐํ ์ฑ๋ฅ ๊ทน๋ํํจ.
- ๊ฐ์ฒด ์ ์ฒด๊ฐ ์๋ PK ๋ชฉ๋ก๋ง์ ์บ์ฑ.
- ํ์ด์ง ์ฌ์ด์ฆ ๋ณ๊ฒฝ, ๋ฐ์ดํฐ ์์ ์ ์บ์ ๋ฌดํจํ ๋ฒ์๋ฅผ ์ต์ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ, ์ ์ฐ์ฑ์ ํ๋ณดํจ.
- DB ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ๋ ๋์ , Redis์ ๋จผ์ ๊ธฐ๋กํ๊ณ ๋ฐฐ์น ๋จ์๋ก DB์ ๋ฐ์ํ๋ Write-Back ์ ๋ต.
- RDB ๋ฝ์ ์ต์ํํ์ฌ ์ฐ๊ธฐ ๋ณ๋ชฉ์ ํด๊ฒฐํจ.
- ๊ฐ์ค์น์ ๋ฐ๋ฅธ ์ค์ฝ์ด๋ง ๊ฒฐ๊ณผ๋ฅผ ZSet์ ์ด์ฉํด ๊ด๋ฆฌํจ.
- ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ ์ง๊ณ ์ฟผ๋ฆฌ, I/O ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํจ.
TTL ๋ง๋ฃ ์งํ ๋์๋ค๋ฐ์ ์ธ DB ์ ๊ทผ์ด ๋ฐ์ํด ์์คํ ์ด ๋ง๋น๋๋ ํ์.
- ๋ ผ๋ฆฌ์ ์ธ TTL๊ณผ ์ค์ TTL์ ๋ถ๋ฆฌํ์ฌ, ๋ ผ๋ฆฌ์ ์ธ TTL์ ๋ง๋ฃ๋์์ผ๋ ๋ฌผ๋ฆฌ์ ์ธ TTL์ ๋จ๋ ๊ตฌ๊ฐ์ ๋์ด, ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ง๋ฃ๋๊ธฐ ์ ์ ๊ฐฑ์ ํ ๊ธฐํ๋ฅผ ํ๋ณดํจ.
- ๋ถ์ฐ ๋ฝ์ ํ๋ํ ํ๋์ ์ฐ๋ ๋๋ง DB์ ์ ๊ทผํ์ฌ ์บ์๋ฅผ ์ต์ ํํจ.
- ๋ฝ ํ๋์ ์คํจํ ๋๋จธ์ง ์์ฒญ์ ๊ฒฝ์ฐ, ๋๊ธฐํ์ง ์๊ณ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ฐํํ์ฌ ์๋ต์ฑ์ ์ ์งํจ.
OptimizedCacheTTL: ๋ ผ๋ฆฌ์ TTL๊ณผ ์ค์ TTL์ ๋ถ๋ฆฌํจ.@OptimizedCacheable: ์บ์ ๋์ ๋ฉ์๋์ ์ ์ฉํ๋ ์ปค์คํ ์ด๋ ธํ ์ด์ . ์ข ๋ฅ์ ๋ ผ๋ฆฌ์ TTL ์ค์ .OptimizedCacheAspect:@OptimizedCacheable๊ฐ ์ ์ธ๋ ๋ฉ์๋ ์คํ ์,OptimizedCacheManager๋ก ์ฒ๋ฆฌ๋ฅผ ์์.OptimizedCacheManager: Redis๋ฅผ ์ฐ์ ์กฐํํ์ฌ,- ์บ์๊ฐ ์์ ๊ฒฝ์ฐ ๋๋ ๋ฌผ๋ฆฌ์ ๋ง๋ฃ ์, ์๋ณธ DB๋ฅผ ์กฐํํ๊ณ Redis์ ์ ์ฅํจ.
- ๋ ผ๋ฆฌ์ ์ผ๋ก ์ ํจํ ๊ฒฝ์ฐ, ์ฆ์ ๋ฐํ.
- ๋
ผ๋ฆฌ์ ๋ง๋ฃ ์,
OptimizedCacheLockProvider๋ก ๋ฝ์ ์์ฒญ.- ํ๋ํ ๊ฒฝ์ฐ, ์๋ณธ DB๋ฅผ ์กฐํํ๊ณ ์บ์๋ฅผ ๊ฐฑ์ ํจ.
- ํ๋ํ์ง ๋ชปํ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ฐ๋ ๋์์ ๊ฐฑ์ ์ค์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ฐํํจ.
- ๋ถ์ฐ ๋ฝ์ ํตํด, ๋ ผ๋ฆฌ์ ๋ง๋ฃ ์ดํ์ ๋์๋ค๋ฐ์ ์ธ ์์ฒญ์ ๋ฐฉ์งํจ.
- ์ฅ์ ์ํฉ์์๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์์๋ ์๋ฃ๋ฅผ ๋ฐํํ์ฌ, ๊ฐ์ฉ์ฑ์ ๊ทน๋ํํจ.
- Producer๊ฐ ์์ฐํ ๋ฉ์์ง๋ฅผ ์ ์ ํ Consumer์๊ฒ ์ ๋ฌํจ.
- Producer, Consumer ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋งํ๋ฉฐ, ๋ ์ฌ์ด์ ์ ์ถ๋ ฅ ์๋ ์ฐจ์ด์ ์ํ ๋ณ๋ชฉ์ ์ํํจ.
- ์๋นํ ๋ฉ์์ง๋ฅผ ์ฆ์ ์ญ์ ํ์ง ์๊ณ ๋ณด๊ดํ์ฌ ์ฅ์ ๋ณต๊ตฌ ์ ์ฌ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํจ.
- ๋ฉ์์ง๋ฅผ ํํฐ์ ๋ณ๋ก ๋ถ๋ฐฐํ์ฌ ๋ฐ์ดํฐ ์์์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ.
- ์๋น์ค๊ฐ ๋์ปคํ๋ง
- Producer๋ Consumer์ ์ํ์ ๋ฌด๊ดํ๊ฒ ๋ฉ์์ง๋ฅผ ๋ฐํํ ์ ์์.
- ์์คํ ํ์ฅ ์, Consumer์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ์ถ๊ฐํ ์ ์์.
- ์ฅ์ ์ ํ ๋ฐฉ์ง
- Producer๊ฐ Consumer์ ์ฅ์ ๋ก๋ถํฐ ์์ ๋ก์์ง.
- ์ฅ์ ๋ณต๊ตฌ ์ดํ ๋ฉ์์ง๋ฅผ ๋ค์ ์๋นํ์ฌ, ์ต์ข ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์.
- ํธ๋ํฝ ์์ง ๋์
- ํธ๋ํฝ์ด ํญ์ฆํ๋ ์ํฉ์์, ๋ฉ์์ง๋ฅผ Kafka์ ๋ณด๊ดํ์ฌ Consumer์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ด๊ณผํ๋ ๋ถํ๋ก๋ถํฐ ์์คํ ์ ๋ณดํธํจ.
- ๋ฉ์์ง๊ฐ ์ ์ค๋์ง ์์์ ๋ณด์ฅํจ.
- ์ค๋ณต ๋ฐํ๋ ๊ฐ๋ฅ์ฑ ์์.
- ๋ฉ์์ง๊ฐ ์ค๋ณต ์์ด ์ ํํ๊ฒ ํ๋ฒ๋ง ์ฒ๋ฆฌ๋จ์ ๋ณด์ฅํจ.
- ์์คํ ์ค๋ฒํค๋๊ฐ ํฌ๊ณ , ๊ตฌํ ๋ณต์ก๋๊ฐ ๋์.
- ์ด๋ฒคํธ ์บก์ณ: ์๋น์ค ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง ์ํ ์ค์
OutboxEventPublisher::publish()ํธ์ถ ->ApplicationEvent๋ฐ์. BEFORE_COMMIT:MessageRelay::createOutbox()๊ฐ DB์ Outbox ํ ์ด๋ธ์ ๊ธฐ๋กํจ.- .
@TransactionalEventListener(phase = BEFORE_COMMIT)์ด๋ ธํ ์ด์ ์ ํตํด ์ปค๋ฐ ์ง์ ์ ์ํ๋จ์ผ๋ก์จ ์์์ฑ์ ๋ณด์ฅํจ.
- .
AFTER_COMMIT:MessageRelay::publishEvent()์ฐ๋ ๋๊ฐ, ์ปค๋ฐ ํ Kafka๋ก ๋ฉ์์ง๋ฅผ ์ ์กํจ.@Async()์ด๋ ธํ ์ด์ ์ ํตํด ๋ณ๋ ์ฐ๋ ๋์์ ๋น๋๊ธฐ ์ฒ๋ฆฌํจ. ์๋ต์ฑ์ ๋ณด์กดํ๊ณ ์ง์ฐ์ ์ต์ํํจ.- ์ ์ก์ ์ฑ๊ณตํ ๊ฒฝ์ฐ, Outbox ๋ ์ฝ๋๋ฅผ ์ญ์ ํจ.
- ์คํจํ๊ฑฐ๋ ์๋ฒ ์ค๋จ์ผ๋ก ๋จ์ ๋ฐ์ดํฐ๋
MessageRelay::publishPendingEvent()์ค์ผ์ค๋ฌ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ๋ฐํํจ.
- ์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ๋ด๋ถ์ ์ผ๋ก ํธ์ถํจ.
- ๋ด๋ถ์ ์ผ๋ก
ApplicationEventListener๋ฅผ ํธ์ถํ์ฌ Spring ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํด.
@TransactionalEventListener์ด๋ ธํ ์ด์ ์ phase ์ค์ ์ ํตํด DB ์ปค๋ฐ ์ง์ ๊ณผ ์งํ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ๋ฐํํจ.AFTER_COMMIT์์ ์ ๋ฐํ์ ๋ณ๋์ ๋น๋๊ธฐ ์ฐ๋ ๋(messageRelayPublishEventExecutor)์์ ์ฒ๋ฆฌํ์ฌ, ์๋ฒ์ ์๋ต์ฑ์ ๋ณด์กดํจ. ์ถ๊ฐ์ ์ผ๋ก, ์ค์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฉ์์ง ๋ฐํ ๊ฐ์ ์ง์ฐ์ ์ต์ํํจ.publishPendingEvent()๋ฉ์๋๊ฐMessageRelayCoordinator๋ก๋ถํฐ ํ ๋น๋ฐ์ ์ค๋ ๋ด์ ๋ฏธ๋ฐํ ๋ฉ์์ง๋ฅผ ์กฐํํ์ฌ At-least-once delivery๋ฅผ ๊ตฌํํจ.MessageRelayCoordinator- ์๋ฒ ์ธ์คํด์ค์ ์ฃผ๊ธฐ์ ์ผ๋ก
ping()๋ฉ์๋๋ฅผ ํตํด, ์๋ฒ ์ธ์คํด์ค์ ์์กด ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํจ.
- ๋ฐํ ์๋ฃ๋ ๋ฐ์ดํฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ์ญ์ ํจ. Outbox ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ์ผ์ ์ดํ๋ก ์ ์งํจ.
shardKey๋ฅผ Kafka ์ ์ก ์ ํํฐ์ ํค๋ก ์ฌ์ฉํ์ฌ, ์ํฐํฐ์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํจ.MessageRelay::publishPendingEvent()์ ์ํด ๋์ผ ๋ฉ์์ง๊ฐ ์ค๋ณต ๋ฐํ๋ ์ ์์ผ๋ฏ๋ก, Consumer์๋ ๋ฉฑ๋ฑ์ฑ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋จ.
Consumer์๊ฒ ๋์ผํ ๋ฉ์์ง๊ฐ ์ฌ๋ฌ ๋ฒ ์ ๋ฌ๋๋๋ผ๋, ์์คํ ์ ์ํ๊ฐ ์ต์ด 1ํ ์ฒ๋ฆฌ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์ ์ง๋๋๋ก ํ๋ ์ค๊ณ.
MessageRelay๋ ๋ฉ์์ง ์ ์ก ํ, ์์ ํ์ธ์ ๋ฐ์ง ๋ชปํ ๊ฒฝ์ฐ ์ฑ๊ณตํ ๋๊น์ง ์ฌ์ ์กํจ. ์ด ๊ณผ์ ์์ ๋คํธ์ํฌ ์ง์ฐ ๋ฑ์ผ๋ก ์ธํด ๋์ผํ ๋ฉ์์ง๊ฐ ์ค๋ณต ๋ฐํ๋ ์ ์์.- Kafka Consumer ๊ทธ๋ฃน ๋ด์์ ํํฐ์ ์์ ๊ถ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, ๋ง์ง๋ง์ผ๋ก ์ปค๋ฐ๋ ์คํ์ ์ดํ ๋ฉ์์ง๊ฐ ์ค๋ณต ์๋น๋ ์ ์์.
ArticleCreatedHandlerArticleQueryModelRepository๊ฐ Key๋ก articleId๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ฐ๋๋ก ์ค๊ณ๋จ.- ๋ฉ์์ง ์์ ์์๊ฐ ๋ค๋ฐ๋๋ Out-of-Order ๋ฌธ์ ๊ฐ ์์ผ๋, ํ๋ก์ ์ ๋ชจ๋ธ ํน์ฑ์ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ํ๋จํจ.
ArticleLikeCountRepository- DB์ UNIQUE INDEX ์ ์ฝ ์กฐ๊ฑด ํ์ฉํจ.
- DB ์์ง์ ์ข ์์ ์.
ArticleViewCountBackUpProcessor- ์์น๋ฅผ ๋ํ๋ ์ฐ์ฐ ๋์ , ์ง๊ณ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฎ์ด์ฐ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฉฑ๋ฑ์ฑ์ ์ ์งํจ.
- ๋ช ์์ ์ธ ๋ฉฑ๋ฑ์ฑ ์ ์ด ๋์ , ์ธํ๋ผ์ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํจ.
service:hot-article,service:article-read๊ณผ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ, ๋๋ ํ๋ก์ ์ ๋ชจ๋ธ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๊ธฐํ ์๋น์ค์ ๋นํด ์ค์๋๊ฐ ๋ฎ๋ค๊ณ ํ๋จํ๊ณ ์ธํ๋ผ ์์ค์์๋ง ์ ์ดํจ.