MSA(Micro Service Architecture)
๐ฟ MSA
Monolith: โํ ๋ฉ์ด๋ฆฌโ์ ํด๋นํ๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ ํ๋์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํด ์ด์ํ๋ค.
- ๊ฐ๋ฐ์ ํ๊ฑฐ๋ ์ค์ ์ ์์ด์ ๊ฐ๋จํ๊ธฐ์ ์์ ์ฌ์ด์ฆ์ ํ๋ก์ ํธ์์๋ ์ ๋ฆฌํ์ง๋ง,
- ์์คํ
์ด ์ ์ ํ์ฅ๋๊ฑฐ๋ ํฐ ํ๋ก์ ํธ์์๋ ๋จ์ ๋ค์ด ์กด์ฌํ๋ค.
- ๋น๋/ํ ์คํธ ์๊ฐ์ ์ฆ๊ฐ: ํ๋๋ฅผ ์์ ํด๋ ์์คํ ์ ์ฒด๋ฅผ ๋น๋ํด์ผํจ, ์ ์ง ๋ณด์๊ฐ ํ๋ค๋ค.
- ์์ ๋ฌธ์ ๊ฐ ์์คํ ์ ์ฒด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํด: ์๋น์ค ํ๋์ ํธ๋ํฝ ๋ฌธ์ ๋ก ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด ๋ชจ๋ ์๋น์ค๊ฐ ์ด์ฉ ๋ถ๊ฐ๋ฅํด ์ง๋ค.
- ํ์ฅ์ฑ์ ๋ถ๋ฆฌ: ํ๋์ ์๋น์ค๋ฅผ ํ์ฅํ๊ธฐ ์ํด ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ํ์ฅํด์ผ ํ๋ค.
MSA: ๋จ์ผ ํ๋ก๊ทธ๋จ์ ๊ฐ ์ปดํฌ๋ํธ ๋ณ๋ก ๋๋์ด ์์ ์๋น์ค์ ์กฐํฉ์ผ๋ก ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ
MSA์์๋ ๊ฐ ์ปดํฌ๋ํธ๋ API๋ฅผ ํตํด ๋ค๋ฅธ ์๋น์ค์ ํต์ ํ๋๋ฐ ๋ชจ๋ ์๋น์ค๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ์๋ฒ๋ก ์ด์ํ๊ณ ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์๋ก ์์กด์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ํ๋์ ์๋น์ค์ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๋ค๋ฅธ ์๋น์ค์๋ ์ํฅ์ ๋ผ์น์ง ์์ผ๋ฉฐ ์๋น์ค ๋ณ๋ก ๋ถ๋ถ์ ์ธ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
๐ฟ MSA ํ์ค ๊ตฌ์ฑ์์
MSA๋ ํฌ๊ฒ Inner Architecture ์ Outer Architecture๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ ๊ทธ๋ฆผ์์ ๋จ์ ๋ถ๋ถ์ Inner ์ด๊ณ ํ์ ๋ถ๋ถ์ Outer ์ ๋๋ค.
Inner Architecture
- ๊ณ ๋ ค ์ฌํญ
- ์๋น์ค๋ฅผ ์ด๋ป๊ฒ ์ ์(๋๋)ํ ๊ฒ์ธ๊ฐ.
- ์๋น์ค๋ฅผ ์ ์ํ๊ธฐ ์ํด์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋น์ฆ๋์ค, ์๋น์ค ๊ฐ ์ข ์์ฑ, ๋ฐฐํฌ ์ฉ์ด์ฑ, ์ฅ์ ๋์, ์ด์ ํจ์จ์ฑ
- DB Access ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ ๊ฒ์ธ๋ค.
- MSA๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๊ด๋ API๋ฅผ ํตํด์ ์ ๊ทผํฉ๋๋ค. ๋ํ ๊ฐ ์๋น์ค์๋ ์์ฒด์ DB๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ผ๋ถ ํธ๋์ญ์ ์ ์ฌ๋ฌ microService์ ๊ฑธ์ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์๋น์ค์ ์ฐ๊ฒฐ๋ DB์ ์ ํฉ์ฑ์ ๋ณด์ฅํ ์ ์๋ ๋ฐฉ์์ด ํ์
- api ์ค๊ณ
- ๋
ผ๋ฆฌ์ ์ธ ์ปดํฌ๋ํธ๋ค์ Layer๋ ์ด๋ป๊ฒ ์ค๊ณํ ๊ฒ์ธ๊ฐ.
- ๋์ปค layer์ ๊ดํ ์ด์ผ๊ธฐ ์ธ ๊ฒ ๊ฐ๋ค.
- ์๋น์ค๋ฅผ ์ด๋ป๊ฒ ์ ์(๋๋)ํ ๊ฒ์ธ๊ฐ.
Inner Architecture
์์ ๊ฐ์ด Gartner์์๋ MSA์ Outer architecture์ ์ด 6๊ฐ์ ์์ญ์ผ๋ก ๋ถ๋ฅํ๊ณ ์์ต๋๋ค.
- External Gateway
- Service Mash
- Container Management
- Backing Services
- Telemetry
- CI/CD Automation
๐ฟ Inner Architecture
External Gateway
์ ์ฒด ์๋น์ค ์ธ๋ถ๋ก๋ถํฐ ๋ค์ด์ค๋ ์ ๊ทผ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋๋ฌ๋ด์ง ์๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์์ ๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ(Consumer Identity Provider)๊ณผ ๊ถํ ์ ์ฑ ๊ด๋ฆฌ(policy management)๋ฅผ ์ํํ๋ฉฐ, API Gateway๊ฐ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
Service Mesh
๋ง์ดํฌ๋ก ์๋น์ค ๊ฐ์ ํต์ (๋คํธ์ํฌ)์ ๋ด๋นํ๋ ์์
- ๋ง์ดํฌ๋ก ์๋น์ค ๊ตฌ์ฑ ์์๊ฐ ์ํธ ํต์ ์ ์ํด์๋ Service Discovery, ์๋น์ค ๋ผ์ฐํ , Failure recovery, load balancing(ํธ๋ํฝ ๊ด๋ฆฌ), ๋ณด์ ๋ฑ์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํ๋ค
- Service Mesh๋ ํต์ ๋ฐ ๋คํธ์ํฌ ๊ธฐ๋ฅ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํ ๋คํธ์ํฌ ํต์ ์ธํ๋ผ. ๋ชจ๋ ์๋น์ค์ ์ธํ๋ผ ๋ ์ด์ด๋ก์ ์๋น์ค๋ค ๊ฐ์ ํต์ ์ ์ฒ๋ฆฌํ๋ฉฐ, ์์ ์ธ๊ธ๋ ๋ง์ ๊ธฐ๋ฅ๋ค์ ํฌํจ
API Gateway์์ ์ฐจ์ด์
- ์ ์ฉ๋๋ ์์น
- API Gateway๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ทธ๋ฃน์ ์ธ๋ถ ๊ฒฝ๊ณ์ ์์นํ์ฌ ์ญํ ์ ์ํํ์ง๋ง, ServiceMesh๋ ๊ฒฝ๊ณ ๋ด๋ถ์์ ๊ทธ ์ญํ ์ ์ํํฉ๋๋ค.
- ์ํคํ
์ณ ํํ
- API Gateway๊ฐ ์ค์์ง์คํ ์ํคํ ์ณ์ฌ์ SPOF(Single Point of Failure)์ ์์ฑํ๋ค๋ฉด,
- Service Mesh๋ ๋ถ์ฐํ ์ํคํ ์ณ๋ฅผ ์ทจํ๊ธฐ ๋๋ฌธ์ SPOF๋ฅผ ์์ฑํ์ง ์๊ณ ํ์ฅ์ด ์ฉ์ด
- ํจํด
- API Gateway๋ ์ผ๋ฐ์ ์ผ๋ก Gateway proxy pattern์ ์ฌ์ฉํด์ ์ํ๋ฉ๋๋ค. Consumer(ํธ์ถ์)์ ๊ตฌํ ๋ด์ฉ์ ์ ํ์ ์์ด Gateway๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ๋ง ์๋ฉด Gateway๊ฐ ์์์ ์ํํด์ฃผ๋ ๋ฐฉ์
- Sidecar proxy pattern์ ์ฌ์ฉํฉ๋๋ค. Consumer(ํธ์ถ์)์ ์ฝ๋์๋ Provider(๊ณต๊ธ์)์ ์ฃผ์๋ฅผ ์ฐพ๋๋ฐฉ๋ฒ, failover์ ๊ด๋ จ๋ ์ฝ๋ ๋ฑ์ ๋ด์ฉ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ๋ค๋ง, ํธ์ถ์์ ์ฝ๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ฝ๋(๋น์ฆ๋์ค ๋ก์ง)์ ๋ด์ฅ๋๋ ๊ฒ์ด ์๋๋ผ sidecar ํํ๋ก ๋ณ๊ฐ๋ก ๊ด๋ฆฌ
์ต๊ทผ MSA์์ API Gateway๋ ๋ ธ์ถ๋๋ ๋ถ๋ถ์ ์์นํ์ฌ ๋ด๋ถ ์๋น์ค๋ฅผ ๋ณดํธ ๋ฐ ์ ์ดํ๋ ์ญํ ์ ํ๊ณ ,
Service Mesh๋ ๋ด๋ถ ์๋น์ค์ ์์นํ์ฌ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋ง์ด ์ฌ์ฉ๋จ
์ ํ
- PaaS (Platform as a Service)์ ์ผ๋ถ๋ก ์๋น์ค ์ฝ๋์ ํฌํจ๋๋ ์ ํ
- Microsoft Azure Service fabric, lagom, SENECA ๋ฑ์ด ์ด ์ ํ์ ํด๋น๋๋ฉฐ, ํ๋ ์์ํฌ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด๊ธฐ ๋๋ฌธ์, ์๋น์ค๋ฉ์ฌ๋ฅผ ๊ตฌํํ๋๋ฐ์ ํนํ๋ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ( Mesh-native Code )
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํ๋์ด API ํธ์ถ์ ํตํด Service mesh์ ๊ฒฐํฉ๋๋ ์ ํ
- Spring Cloud, Netflix OSS(Ribbon/Hystrix/Eureka/Archaius), finagle ๋ฑ์ด ์ด ์ ํ์ ํด๋น๋๋ฉฐ, ํ๋ ์์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํํ์ ๋๋ค. ์ด์ค Netfilix์ Prana๋ sidecar ํํ๋ก ๋์ํฉ๋๋ค. ์๋น์ค ๋ฉ์๋ฅผ ์ดํดํ๊ณ ์ฝ๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค. (Mesh Aware Code)
- Side car proxy๋ฅผ ์ด์ฉํ์ฌ Service mesh๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค์ ์ฃผ์
ํ๋ ์ ํ
- Istio/Envoy, Consul, Linkerd ๋ฑ์ด ์ด ์ ํ์ ํด๋น๋๋ฉฐ, sidecar proxy ํํ๋ก ๋์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋น์ค๋ฉ์์ ๋ฌด๊ดํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Container Management
์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด์์ ์ ์ฐ์ฑ๊ณผ ์์จ์ฑ์ ๊ฐ์ง๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ์ ๊ทผ ๋ฐ ์ด์ํ ์ ์๋ ์ธํ๋ผ ๊ด๋ฆฌ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ MSA์ ์ ํฉํ๋ค๊ณ ํ๊ฐ๋ฐ๊ณ ์์
kubernetes์ ๊ดํ ๊ฒ์ ๋ฐ๋ก Post์์ ๋ค๋ฃจ๊ฒ์
Backing Service
MSA ์์ ํน์ง์ ์ธ Backing Service ์ค ํ๋์ธ Message queue
MSA์์๋ ๋ฉ์ธ์ง์ ์ก์ ์์ ์์ ์๊ฐ ์ง์ ํต์ ํ์ง ์๊ณ Message Queue๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ํต์ ํ๋ ๊ฒ์ ์งํฅํจ
Message Queue๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฐํ ๊ฒฐํฉ ๊ตฌ์กฐ์ ๊ฒฝ์ฐ, ์ฌ๋ฌ ์๋น์ค๋ฅผ ๊ฑธ์น๋ ์ค์๊ฐ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ ๋, ํ๋์ ์๋น์ค๊ฐ ์ฃฝ์ด๋ฒ๋ฆฐ๋ค๋ฉด ํธ๋์ญ์ ์ด ๋์ด์ง๊ธฐ ๋๋ฌธ์ ํด๋น ์๋น์ค ์์ฒญ์ ๋ณด์กดํ ์ ์๊ณ ํฐ ์๋ฌ๊ฐ ๋ฐ์
MSA์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด๋, ๋ณด์ ํธ๋์ญ์ ๊ณผ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ Message Queue๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํจ์จ์ ์ ๋๋ค.
์ด๋ฌํ Message Queue์๋ ์นดํ์นด, RabbitMq ๋ฑ์ด ์๋๋ฐ ์ด๋ ์ถํ์ ๋ค์ ๋ค๋ฃจ๊ฒ ์
Telemetry
์ค์๊ฐ ์๊ฒฉ ์ฑ๋ฅ ์ธก์
MSA์์ ์๋น์์ ๋ง์ดํฌ๋ก ์๋น์ค๊ฐ ๋ถ์ฐ ํ๊ฒฝ์์ ์ด์๋๊ธฐ ๋๋ฌธ์ ์๋น์ค๋ค์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ด์์ ๋์ํ๋๊ฒ์ ๋งค์ฐ ๊ณ ๋๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ผ
Telemetry๋ ์๋น์ค๋ค์ ๋ชจ๋ํฐ๋งํ๊ณ , ์๋น์ค๋ณ๋ก ๋ฐ์ํ๋ ์ด์๋ค์ ๋์ํ ์ ์๋๋ก ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ์ญํ
Grafana + Prometheus๋ฅผ ํตํด ์ฑ๋ฅ ์ธก์ ๋ฐ ๋ก๊ทธ ์ ์ฅ์ด ๊ฐ๋ฅ ์ด๋ ์ถํ์ ๋ค๋ฃจ๊ฒ ์