Decide โ boring vs novel
Opendoor JD ๊ทธ๋๋ก: โYou pick the boring solution when boring is right.โ ๊ฐ ์นด๋ = ์ํฉ โ ๋ ์ ํ์ง(์ธ์ /๋น์ฉ) โ ๊ธฐ๋ณธ ํ๋จ โ ํธ๋ฆฝ์์ด์ด(์ธ์ ๋ฐ๊พธ๋๊ฐ, ์ธก์ ๊ฐ๋ฅํ ์ ํธ) โ ์์ด ํ ์ค ํ๊ฒฐ.
- Sync call vs async (queue/event)์ฃผ๋ฌธ์ด ๋ค์ด์ค๋ฉด ์ฌ๊ณ ์ฐจ๊ฐ, ์๋ฆผ ๋ฐ์ก, ์ ์ฐ ๊ธฐ๋ก๊น์ง ํด์ผ ํ๋ค. ์ด๊ฑธ API ํ ๋ฒ์ ๋๊ธฐ ํธ์ถ ์ฒด์ธ์ผ๋ก ๋ค ์ฒ๋ฆฌํ ์ง, ์ผ๋ถ๋ฅผ ํ์ ๋์ ธ ๋น๋๊ธฐ๋ก ๋บ์ง ์ ํด์ผ ํ๋ค.
- Monolith vs splitting services์ฃผ๋ฌธ, ๊ฒฐ์ , ์๋ฆผ์ด ์ ๋ถ ๋ค์ด์๋ ์๋ฒ ํ๋๋ก ์๋น์ค๋ฅผ ์ด์ ์ค์ธ๋ฐ, ์ฝ๋๊ฐ ์ปค์ง๋ฉด์ ์์ ์์ ํ๋์๋ ์ ์ฒด๋ฅผ ๋ค์ ๋ฐฐํฌํด์ผ ํ๋ค. ํ์์ "์ด์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ชผ๊ฐ์ผ ํ์ง ์๋"๋ ์๊ธฐ๊ฐ ๋์ค๊ธฐ ์์ํ๋ค.
- Relational DB vs NoSQL์ ๊ท ์ฃผ๋ฌธ ์๋น์ค์ DB๋ฅผ ์ ํ๋ ํ์์์ ๋๋ฃ๊ฐ "๋์ค์ ํธ๋ํฝ ์ปค์ง ํ ๋ ์ฒ์๋ถํฐ MongoDB๋ก ๊ฐ์"๊ณ ํ๋ค. ์ง๊ธ ํธ๋ํฝ์ ํ๋ฃจ ์ฃผ๋ฌธ ๋ช์ฒ ๊ฑด ์์ค์ด๋ค.
- Add a cache โ or fix the query?์ํ ์์ธ API๊ฐ ๋๋ ค์ ธ์ p95๊ฐ 1์ด๋ฅผ ๋๊ธฐ ์์ํ๋ค. ํ์์์ "๋ ๋์ค ์บ์ ๋ถ์ด๋ฉด ๋์ง ์์์?"๋ผ๋ ๋ง์ด ์ ์ผ ๋จผ์ ๋์ค๋ ์ํฉ.
- Add an index vs denormalize์ฃผ๋ฌธ ๋ชฉ๋ก ํ๋ฉด์ด ์ ์ ๋๋ ค์ง๋ค. ์ฃผ๋ฌธยท๊ณ ๊ฐยท๊ฒฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ๊ณ ๊ฑด์๊น์ง ์ธ์ ๋ณด์ฌ์ฃผ๋ ์ฟผ๋ฆฌ์ธ๋ฐ, ๋ฐ์ดํฐ๊ฐ ์๋ฐฑ๋ง ๊ฑด์ ๋์ผ๋ฉด์ ์๋ต์ด ๋์ ๋๊ฒ ๋์ด์ก๋ค.
- Direct API call vs through a queue์ฃผ๋ฌธ์ด ์๋ฃ๋๋ฉด ์๋ฆผ ์๋น์ค๋ฅผ ํธ์ถํด์ ํธ์/์ด๋ฉ์ผ์ ๋ณด๋ด์ผ ํฉ๋๋ค. ์๋ฆผ API๋ฅผ ๋ฐ๋ก ๋ถ๋ฅผ์ง, ์ค๊ฐ์ ํ๋ฅผ ๋์ง ์ ํด์ผ ํ๋ ์ํฉ์ด์์.
- Build it vs use a managed service์ฃผ๋ฌธ์ด ๋ค์ด์ค๋ฉด ์ด๋ฉ์ผ ๋ฐ์ก์ด๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ฐ์ ์์ ์ ๋น๋๊ธฐ๋ก ๋นผ์ผ ํด์ ํ๊ฐ ํ์ํด์ก๋ค. AWS SQS ๊ฐ์ ๊ด๋ฆฌํ ์๋น์ค๋ฅผ ์ธ์ง, DB ํ ์ด๋ธ ๊ธฐ๋ฐ ํ๋ฅผ ์ง์ ๋ง๋ค์ง ์ ํด์ผ ํ๋ ์ํฉ.
- Strong vs eventual consistency๊ฒฐ์ ๊ฐ ์๋ฃ๋๋ฉด ์ฃผ๋ฌธ ์ํ, ์ฌ๊ณ , ํฌ์ธํธ, ์๋ฆผ์ ์ ๋ถ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. ์ด๊ฑธ ๋ค ํ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์์ง, ๋๊ณผ ์ํ๋ง ๋ฌถ๊ณ ๋๋จธ์ง๋ ์ด๋ฒคํธ๋ก ๋ช ์ด ๋ค์ ๋ง์ถ์ง ์ ํด์ผ ํ๋ ์ํฉ์ ๋๋ค.
- Request/response vs event-driven์ฃผ๋ฌธ ๊ฒฐ์ ๊ฐ ๋๋๋ฉด ์๋ฆผ ๋ฐ์ก, ํฌ์ธํธ ์ ๋ฆฝ, ์ฌ๊ณ ์ฐจ๊ฐ ๊ฐ์ ํ์ ์์ ์ ํด์ผ ํ๋ค. ํ์ ์๋น์ค๋ค์ ๊ทธ๋ฅ REST๋ก ์ง์ ํธ์ถํ ์ง, ์ด๋ฒคํธ ํ๋ ๋ฐํํ๊ณ ๊ฐ์ ์์์ ๊ตฌ๋ ํ๊ฒ ํ ์ง ์ ํด์ผ ํ๋ค.
- Read replica vs cache layer์ํ ์์ธ ํ์ด์ง ํธ๋ํฝ์ด ๋๋ฉด์ DB CPU๊ฐ 80%๋ฅผ ๋๊ธฐ ์์ํ์ด์. ์ฝ๊ธฐ ๋ถํ๋ฅผ ๋นผ์ผ ํ๋๋ฐ, ๋ณต์ ๋ณธ์ ๋ถ์ผ์ง ์บ์๋ฅผ ๋์ง ์ ํด์ผ ํ๋ ์ํฉ์ ๋๋ค.
- Retry vs fail fast์ฃผ๋ฌธ ์๋ฒ๊ฐ ๊ฒฐ์ ์ฌ API๋ฅผ ๋ถ๋ฅด๋๋ฐ ๊ฐ๋ ํ์์์์ด ๋๋ค. ์๋์ผ๋ก ๋ช ๋ฒ ๋ ์๋ํ ์ง, ์๋๋ฉด ๋ฐ๋ก ์คํจ๋ฅผ ๋๋ ค์ฃผ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ฆด์ง ์ ํด์ผ ํ๋ค.
- Feature flag vs long-lived branch์ ์ฐ ๋ก์ง์ ์ ๋ฒ์ ์ผ๋ก ๊ฐ์๋ผ์ฐ๋ ๋ฐ 3์ฃผ๊ฐ ๊ฑธ๋ฆฌ๋๋ฐ, ๊ทธ๋์ ํ์๋ค์ ๋งค์ผ main์ ๊ธฐ๋ฅ์ ๋จธ์งํ๊ณ ์๋ค. ๋ฏธ์์ฑ ์ฝ๋๋ฅผ ์ด๋์ ๋๊ณ ์์ ํ ์ง ์ ํด์ผ ํ๋ ์ํฉ.
- Latency vs Throughput๊ณต์ฅ ์ค๋น์์ ์ฌ๋ผ์ค๋ ์ธก์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ DB์ ์ ์ฌํ๋ ์์ง ์๋ฒ๊ฐ ์๋ค. ์ง๊ธ์ ์ด๋ฒคํธ ํ๋๋น INSERT ํ ๋ฒ์ธ๋ฐ, ๋ผ์ธ์ด ๋๋ฉด์ ์ ์ ์ด ์ด๋น ์์ฒ ๊ฑด์ผ๋ก ์ฌ๋ผ๊ฐ๋ค. ํ ๊ฑด์ฉ ๋ฐ๋ก ์ธ์ง, ๋ชจ์์ ๋ฐฐ์น๋ก ์ธ์ง(๋ฐฐ์น ํฌ๊ธฐยทflush ๊ฐ๊ฒฉ) ์ ํด์ผ ํ๋ค. ๊ฐ์ ๊ณ ๋ฏผ์ด ์คํผ ์๋น์ค์๋ ์๋ค โ ์ฌ์ฉ์๊ฐ ๋ณด๋ ์คํผ ์กฐํ API์ ๋ฐค๋ง๋ค ๋๋ ์์ธ ์ฌ์ฐ์ ํ์ดํ๋ผ์ธ์ ์ต์ ํํ ์ซ์๊ฐ ๋ค๋ฅด๋ค.
- Scale up vs scale out์ฃผ๋ฌธ API ์๋ฒ ํ ๋(8์ฝ์ด)๋ก ์ด์ ์ค์ธ๋ฐ, ํ๋ก๋ชจ์ ๋๋ง๋ค CPU๊ฐ 90%๋ฅผ ์น๊ณ ์๋ต์ด ๋์ด์ง๋ค. ํ์์์ "์ธ์คํด์ค ์ฌ์์ ์ฌ๋ฆฌ์"๋ ์ชฝ๊ณผ "์๋ฒ๋ฅผ ์ฌ๋ฌ ๋๋ก ๋๋ฆฌ์"๋ ์ชฝ์ด ๋ง๋ถ์๋ค. ์ด๋ ์ชฝ๋ถํฐ ๊ฐ์ง ์ ํด์ผ ํ๋ค.
- Stateless vs stateful services์๋ฒ ํ ๋๋ก ์ ๋๋ ์ฃผ๋ฌธ ์๋น์ค๊ฐ ํธ๋ํฝ์ด ๋์ด ์ธ์คํด์ค๋ฅผ 2๋๋ก ๋๋ ธ๋ค. ๊ทธ๋ฐ๋ฐ ์๋ก๊ณ ์นจํ ๋๋ง๋ค ๋ก๊ทธ์ธ์ด ํ๋ฆฐ๋ค๋ ๋ฌธ์๊ฐ ๋ค์ด์จ๋ค. ์ธ์ ๊ณผ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๊ณ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ก๋๋ฐธ๋ฐ์์ sticky session์ ๊ฑธ์ด ๊ฐ์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ์ธ์คํด์ค๋ก ๋ณด๋ผ์ง, ์ธ์ ์ Redis๋ก ๋นผ์ ์ด๋ ์ธ์คํด์ค๋ ๊ฐ์ ์์ฒญ์ ๋ฐ๊ฒ ํ ์ง ์ ํด์ผ ํ๋ค.
- Cache-aside vs write-through vs write-behind (+invalidation)๋งค๋ฌผ ์คํผ ๊ฐ๊ฒฉ ์กฐํ API์ ์ฝ๊ธฐ๊ฐ ๋ชฐ๋ ค์ Redis ์บ์๋ฅผ ๋ถ์ด๊ธฐ๋ก ํ๋ค. ๊ทธ๋ฐ๋ฐ ํ์์์ "์ธ ๋๋ง๋ค ์บ์๋ ๊ฐ์ด ๊ฐฑ์ ํ๋ฉด ํญ์ ์ต์ ์๋๋"(write-through), "์์ ์บ์๋ก ์ฐ๊ธฐ๋ฅผ ๋ฐ๊ณ DB์ ๋ชจ์์ ๋ด๋ฆฌ์"(write-behind)๋ ๋ง๊น์ง ๋์๋ค. ์ฝ๊ธฐ ๊ฒฝ๋ก, ์ฐ๊ธฐ ๊ฒฝ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ฌดํจํ๋ฅผ TTL๋ก ํ ์ง ์ด๋ฒคํธ๋ก ํ ์ง ์ ํด์ผ ํ๋ ์ํฉ.
- Sharding: hash vs range (+hot keys)์คํผ(์ฃผ๋ฌธ) ์ด๋ฒคํธ ํ ์ด๋ธ์ด ์์ต ํ์ ๋์ด DB ํ ๋๋ก๋ ๋ ๋ชป ๋ฒํฐ๊ฒ ๋๋ค. ์ค๋๋ฅผ ๋๋ ์ผ ํ๋๋ฐ, ํค๊ฐ ์๊ฐ์์ผ๋ก ์ฆ๊ฐํ๋ ID๋ผ๋ ๊ฒ ํจ์ ์ด๋ค. ํด์๋ก ๊ณ ๋ฅด๊ฒ ํฉ๋ฟ๋ฆด์ง, ์๊ฐ/ID ๋ฒ์๋ก ์๋ฅผ์ง ์ ํด์ผ ํ๋ค. ๊ณต์ฅ ์ผ์ ๋ก๊ทธ๋ ๋ถ๋์ฐ ์คํผ ์ด๋ฒคํธ๋ "์๊ฐ์ ํค + ์ต๊ทผ N์๊ฐ ์กฐํ"๊ฐ ๊ฐ์ด ์ค๋ ์ ํ์ ์ธ ์ํฉ.
- At-most-once vs at-least-once vs exactly-once๊ฒฐ์ ๊ฐ ์๋ฃ๋๋ฉด '๊ฒฐ์ ์๋ฃ' ์ด๋ฒคํธ๋ฅผ ํ์ ๋ฐํํ๊ณ , ์ ์ฐ ์๋น์ค๊ฐ ๋ฐ์์ ์ฅ๋ถ์ ๊ธฐ๋กํ๋ค. ๋คํธ์ํฌ๊ฐ ํ๋ค๋ฆฌ๊ฑฐ๋ ์ปจ์๋จธ๊ฐ ์ฌ์์๋๋ฉด ๋ฉ์์ง๋ ์ฌ๋ผ์ง ์๋(์ ์ค), ๋ ๋ฒ ๋์ฐฉํ ์๋(์ค๋ณต) ์๋ค. ์ ์ค์ ๊ฐ์ํ ์ง, ์ค๋ณต์ ๋ฐ์๋ค์ด๊ณ ๋ด๊ฐ ๋ง์์ง, ๋ธ๋ก์ปค๊ฐ ์ฝ์ํ๋ 'exactly-once'๋ฅผ ๋ฏฟ์์ง ์ ํด์ผ ํ๋ค.
- Ordering vs parallelism์คํผ ์ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ(์์ฑ โ ๊ฐ๊ฒฉ ์ฐ์ โ ์น์ธ โ ๋ง๋ฃ)๋ฅผ Kafka๋ก ํ๋ ค์ ๋ค์ด์คํธ๋ฆผ(์๋ฆผ, ์ ์ฐ)์ด ๋ฐ์ ์ฒ๋ฆฌํ๋ค. ํธ๋ํฝ์ด ๋์ด ์ปจ์๋จธ๋ฅผ ๋๋ฆฌ๊ณ ์ถ์๋ฐ, ํํฐ์ ์ ๋๋ฆฌ๋ฉด ๊ฐ์ ์คํผ์ '๋ง๋ฃ' ์ด๋ฒคํธ๊ฐ '์น์ธ'๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋ ๊น ๋ด ์์ ๋ชป ๋๊ณ ์๋ค.
- Backpressure vs load shedding์ธ์ผ ์์ 10๋ถ ๋ง์ ์ฃผ๋ฌธ ์ด๋ฒคํธ๊ฐ ํ์์ 10๋ฐฐ๋ก ๋ค์ด์จ๋ค. ๋ค์์ ์๋ฆผยท์ ์ฐยท์ง๊ณ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ปค๋ ์ด๋น 200๊ฑด์ด ํ๊ณ๋ผ ํ๊ฐ ๊ณ์ ๊น์ด์ง๋ค. ๋ค์ด์ค๋ ์ชฝ์ ๋ฆ์ถฐ์ ๋ค ๋ฐ์๋ผ์ง(backpressure), ๋ ์ค์ํ ์์ ์ ๋ฒ๋ ค์ ํต์ฌ๋ง ์งํฌ์ง(shedding) ์ ํด์ผ ํ๋ค.