Aspire를 사용한 Runtime과 Observability
Lino๊ฐ ์๋น์ค, web apps, ์ธํ๋ผ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ํ Aspire๋ ๋ชจ๋ ๊ฒ์ ๊ฐ์์ฑ ์๊ฒ ๋ก์ปฌ์์ ์คํํ๋๋ก ๋์ต๋๋ค. Observability๋ ์ฌ์น๊ฐ ์๋๋๋ค. APIs, ๋ฐ์ดํฐ๋ฒ ์ด์ค, cache, messaging, workers๊ฐ ์ ์์ธ์ง ๋ณด์ฌ ์ค๋๋ค.
events, Outbox, workers, Redis, RabbitMQ, ์ฌ๋ฌ ๋ชจ๋์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ง์ ๋ฌธ์ ๊ฐ ํ๋ฉด์๋ง ๋ํ๋์ง ์์ต๋๋ค. logs, queues, jobs, migrations, ํ๋ผ๋ฏธํฐ, runtime ๋ฆฌ์์ค์ ๋ํ๋ฉ๋๋ค. ์ด ์น์ ์ ์๋ฃจ์ ์ ์์ฑ๋ ํ์ผ์ด ์๋๋ผ ์คํ ์ค์ธ ์์คํ ์ผ๋ก ๋ณด๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค.
Aspire๋ก ์คํ
AppHost๋ ์๋ฃจ์ ์ ๋ก์ปฌ ์คํ์ ํ๊ณณ์ ๋ชจ์๋๋ค. ์๋น์ค, web apps, PostgreSQL, Redis, RabbitMQ, workers ๊ฐ์ ์์กด์ฑ์ ์์ํฉ๋๋ค.
dotnet run --project src/Aspire/AppHost/<ProjectName>.AppHost.csproj
dashboard๋ฅผ ์ฌ์ฉํด logs, ๋ณ์, endpoints, ๋ฆฌ์์ค ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์๋น์ค๊ฐ ์์๋์ง ์์ผ๋ฉด AppHost์ AppHost๊ฐ ์ฃผ์ ํ๋ ์์กด์ฑ๋ถํฐ ํ์ธํ์ญ์์ค.
Aspire๋ ๋ก์ปฌ ํ ํด๋ก์ง๋ฅผ ๋ณด์ด๊ฒ ํฉ๋๋ค. APIs, web apps, ๋ฐ์ดํฐ๋ฒ ์ด์ค, cache, message broker, workers๊ฐ ๊ด๋ จ ๋ฆฌ์์ค๋ก ํ์๋ฉ๋๋ค. ์ด ๋ทฐ๋ ์๋ชป๋ connection string, ๋๋ฝ๋ ํ๋ผ๋ฏธํฐ, endpoint๊ฐ ์๋ ์๋น์ค, ์์ง ์์๋์ง ์์ ์์กด์ฑ์ฒ๋ผ ์๋ ์คํ์์๋ ์จ๊ฒจ์ง ์ ์๋ ์ค์ ์ค๋ฅ๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- Logs: ์ด๊ธฐํ ์ค๋ฅ, ์ธ์ฆ ์คํจ, migrations ๋ฌธ์ , worker ๋ฉ์์ง๋ฅผ ์ถ์ ํฉ๋๋ค.
- Endpoints: ํฌํธ, URLs, health checks, web apps ๋ฐ APIs ๋งํฌ๋ฅผ ํ์ธํฉ๋๋ค.
- Parameters: ๊ฐ ์๋น์ค๋ก ์ ํ๋๋ secrets์ ๋ณ์๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- Dependencies: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋จํ๊ธฐ ์ ์ Redis, RabbitMQ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ provision ๋์๋์ง ํ์ธํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค
Lino๊ฐ ์์ฑํ ์๋น์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฒด DbContexts, migrations, connection strings๋ฅผ ๊ฐ์ง๋๋ค. ๋ชจ๋ํ ์์คํ ์์๋ ๊ฐ ๋ชจ๋์ด ์์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค/schema๋ฅผ ์ฌ์ฉํ๋์ง, migrations๊ฐ ์ฌ๋ฐ๋ฅธ ์์น์ ์ ์ฉ๋์๋์ง ๊ฒ์ฆํ์ญ์์ค.
- ํ๊ฒฝ๋ณ connection strings๋ฅผ ํ์ธํฉ๋๋ค.
- ์ schema์ ์์กดํ๋ ํ๋ฆ์ ํ ์คํธํ๊ธฐ ์ ์ migrations๋ฅผ ์คํํฉ๋๋ค.
- ์ฐ๊ฒฐ ์คํจ์ query ์๊ฐ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๋ก์ปฌ ์คํ์์ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
๋จ์ํ ์๋น์ค์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋น์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค. ๋ชจ๋ํ ์๋น์ค์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋น์ค์ ์ํ์ง๋ง, ๊ฐ ๋ชจ๋์ ์์ฒด schema, DbContext, migrations, scripts๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด ๋ถ๋ฆฌ๋ ์ด์์๋ ๋๋ฌ๋์ผ ํฉ๋๋ค. migrations๋ฅผ ์ ์ฉํ ๋๋ ์คํ ์ ์ ์๋น์ค, ๋ชจ๋, provider, ํ๊ฒฝ์ ํ์ธํ์ญ์์ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฅ์ ๋ ๋ณดํต API ์ค๋ฅ๋ก ๋ํ๋์ง๋ง, ์์ธ์ AppHost, connection string, ๋ณด๋ฅ ์ค์ธ migration, ์กด์ฌํ์ง ์๋ schema ๋๋ ๋ก์ปฌ ์๊ฒฉ ์ฆ๋ช ์ ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ง๋จ์ ์ ์ฒด ์ฒด์ธ์์ ์์ํด์ผ ํฉ๋๋ค. Aspire ํ๋ผ๋ฏธํฐ, ํ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค, ์ ์ฉ๋ migration, ์ฌ๋ฐ๋ฅธ DbContext, ์์ํ ๋ชจ๋์ ํธ์ถํ๋ endpoint์ ๋๋ค.
Redis์ cache
Redis๋ ํ์ฑํ๋ templates์ ๋ฐ๋ผ cache, ์์ ์ํ, tokens, rate limiting ๋๋ ๊ธฐํ ๋ฆฌ์์ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. cache๋ ์ฑ๋ฅ์ ๋์ด์ง๋ง invalidation๊ณผ eventual consistency๋ฅผ ๋์ ํฉ๋๋ค.
ํค, ๋ง๋ฃ ์๊ฐ, ๋ฐ์ดํฐ ์ถ์ฒ๋ฅผ ๋ฌธ์ํํ์ญ์์ค. ์ํธํ, ๋ง๋ฃ, ์ ๊ทผ ๋ฐฉ์์ ์ดํดํ์ง ๋ชปํ ์ํ์์ ๋ฏผ๊ฐํ secrets๋ฅผ cache์ ์ ์ฅํ์ง ๋ง์ญ์์ค.
ํ๋ก์ ํธ๊ฐ ๋ถ์ฐ cache๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๊ฐ์ ๊ณต์ ํ ์ ์์ด ์ํ ํ์ฅ์ ์ ์ฉํฉ๋๋ค. ๋ก์ปฌ ์ธ๋ฉ๋ชจ๋ฆฌ cache๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ ํ๋ก์ธ์ค๋ ์์ฒด ๋ณต์ฌ๋ณธ์ ์ ์งํฉ๋๋ค. ์ด ์ฐจ์ด๋ ์ด์ ํ๊ฒฝ ๋์, ๋ถํ ํ ์คํธ, ๋ฐ์ดํฐ invalidation์ ์ํฅ์ ์ค๋๋ค.
| ์ง๋ฌธ | ์ค์ํ ์ด์ |
|---|---|
| cache๋ ๋ฐ์ดํฐ์ ์ถ์ฒ๋ ๋ฌด์์ ๋๊น? | ๋ง๋ฃ๋๊ฑฐ๋ invalidation๋ ๋ ๊ฐ์ ์ด๋ป๊ฒ ๋ค์ ๊ณ์ฐํ ์ง ์ ์ํฉ๋๋ค. |
| ํ์ฉ ๊ฐ๋ฅํ TTL์ ์ผ๋ง์ ๋๊น? | ์์คํ ์ด ์ ์ฌ์ ์ผ๋ก ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ค๋ ํ์ฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค. |
| cache๋ tenant๋ณ, ์ฌ์ฉ์๋ณ ๋๋ ์ ์ญ์ ๋๊น? | ์ปจํ ์คํธ ๊ฐ ๋ฐ์ดํฐ ์ ์ถ๊ณผ ์๋ชป ๋ชจ๋ธ๋ง๋ ํค๋ฅผ ๋ฐฉ์งํฉ๋๋ค. |
RabbitMQ์ messaging
messaging์ integration events์ ๋น๋๊ธฐ ํต์ ์ ๋ท๋ฐ์นจํฉ๋๋ค. Outbox๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํธ๋์ญ์ ๊ณผ ๊ฐ์ ์๊ฐ์ ๋ฉ์์ง๋ฅผ publishํ๋ ๊ฒ์ ์์กดํ์ง ์์ผ๋ฉฐ, worker๊ฐ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
- ์์ฑ๋ exchanges, queues, bindings๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ฉ์ถ ๋ฉ์์ง์ ๋นํ์ฑ consumers๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- idempotentํ handlers๋ฅผ ์ค๊ณํฉ๋๋ค.
- correlation logs๋ฅผ ์ฌ์ฉํด ๋ฉ์์ง ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋๋ค.
integration events๊ฐ ์ ์ฉํ ์ด์ ๋ producer๊ฐ ๋ชจ๋ consumers๋ฅผ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ์ด๋ก ์ธํด ๋ณต์ก์ฑ์ ์ผ๋ถ๊ฐ ์ด์์ผ๋ก ์ด๋ํฉ๋๋ค. ๋ฉ์์ง๋ ์ง์ฐ๋ ์ ์๊ณ , consumers๋ ์คํจํ ์ ์์ผ๋ฉฐ, payloads๋ ๋ณ๊ฒฝ๋ ์ ์๊ณ , handlers๋ ๋ ๋ฒ ์ด์ ์คํ๋ ์ ์์ต๋๋ค. ํ๋ฆ ๋ฌธ์๋ ์ด๋ค event๊ฐ publish๋๋์ง, ๋๊ฐ consumeํ๋์ง, ์ด๋ค ๋ก์ปฌ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋๋์ง ๋ช ํํ ํด์ผ ํฉ๋๋ค.
Shadow Entities๋ ์ด๋ฌํ observability์ ์์กดํฉ๋๋ค. tenant ๋๋ ์ฌ์ฉ์ entity๊ฐ event๋ก ๋ค๋ฅธ ๋ชจ๋์ ๋ณต์ ๋๋ ๊ฒฝ์ฐ consumer ์คํจ๋ก ๋ก์ปฌ ๋ณต์ฌ๋ณธ์ด ์ค๋๋ ์ํ๋ก ๋จ์ ์ ์์ต๋๋ค. ์์คํ ์ event, ๋ฉ์์ง, handler, consumer ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ง๋จํ ์ ์์ด์ผ ํฉ๋๋ค.
Hangfire Dashboard
background jobs๊ฐ ํ์ฑํ๋์ด ์์ผ๋ฉด Hangfire Dashboard๋ ๋ฐ๋ณต jobs, ์คํจ, retries, Outbox ์ฒ๋ฆฌ ์คํ์ ๊ฒ์ฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ณต์ ํ๊ฒฝ์์๋ dashboard๋ฅผ ๋ณดํธํ์ญ์์ค. ๊ด๋ จ ์ด์ ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ฏ๋ก ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ์์ด ๊ณต๊ฐ๋์ด์๋ ์ ๋ฉ๋๋ค.
dashboard๋ฅผ ์ง๋จ ๋๊ตฌ๋ก ์ฌ์ฉํ๋ logs์ metrics์ ๋์ฒด๋ฌผ๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค. queues, ์๋ ํ์, ์คํ ์ด๋ ฅ์ ๋ณด์ฌ ์ฃผ์ง๋ง, job์ด ์คํจํ ์ด์ ๋ฅผ ์์ ํ ์กฐ์ฌํ๋ ค๋ฉด correlation id, ๊ตฌ์กฐํ๋ logs, ๋น์ฆ๋์ค ์ปจํ ์คํธ๊ฐ ์ฌ์ ํ ํ์ํฉ๋๋ค.
- Retries: ์คํจ๊ฐ ์ผ์์ ์ธ์ง, ๋๋ job์ด ๊ณ์ ์คํจํ ๊ฒ์ธ์ง ํ์ธํฉ๋๋ค.
- ๋ฐ๋ณต jobs: ๊ฐ๊ฒฉ, ๋ฐฐ์น, ํ๊ท ์คํ ์๊ฐ์ ํ์ธํฉ๋๋ค.
- Outbox: ๋ฉ์ถ ๋ฉ์์ง, ์ฌ์ฒ๋ฆฌ, ์์ธ๊ฐ ๋ฐ์ํ handlers๋ฅผ ๊ด์ฐฐํฉ๋๋ค.
- Security: payloads์ ์ค๋ฅ๊ฐ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋๋ฌ๋ผ ์ ์์ผ๋ฏ๋ก ์ ๊ทผ์ ์ ํํฉ๋๋ค.
Workers์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ
Workers๋ HTTP ์์ฒญ์ ์ฐจ๋จํด์๋ ์ ๋๋ ์์ ์ ์คํํฉ๋๋ค. ๋ฉ์์ง ์ ์ก, Outbox ์ฒ๋ฆฌ, ์ ๋ฆฌ, ๋๊ธฐํ, ์ธ๋ถ ํตํฉ ๋ฑ์ด ์ฌ๊ธฐ์ ํด๋นํฉ๋๋ค.
- ๋ณผ๋ฅจ์ ๋ง๋ ๋ฐฐ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- retries์ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
- ์ฌ์ฒ๋ฆฌ์ ์ถฉ๋ถํ ์ปจํ ์คํธ์ ํจ๊ป ์ค๋ฅ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- ์๊ตฌ์ ์ธ ์คํจ๋ฅผ ์ผ๋ฐ์ ์ธ logs์ ์จ๊ธฐ์ง ๋ง์ญ์์ค.
worker๋ฅผ ์ถ๊ฐํ ๋๋ ๋น๋, ๋ฐฐ์น ํฌ๊ธฐ, ์คํจ ์ ๋์, ๋๋ฉ์ธ ์ํฅ๋ ํจ๊ป ์ ์ํ์ญ์์ค. ๋ช ์ด๋ง๋ค 100๊ฐ ๋ ์ฝ๋๋ฅผ ์ฝ๋ worker๋ ์ผ์ผ job๊ณผ ๋ค๋ฅธ ์ด์ ํน์ฑ์ ๊ฐ์ง๋๋ค. ๋ ๋ค ์ค์ ๋ณผ๋ฅจ์ ๋ฐ๋ผ ๊ด์ฐฐํ๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ์ฆ์ ์๋ตํด์ผ ํ๋ ์์ ์ background์์ ์คํํ์ง ๋ง์ญ์์ค. worker๋ ํ์ ์์ , ํตํฉ, ์๋ฆผ, ์ฌ์ฒ๋ฆฌ, ์ ์ง๋ณด์์ ์ฌ์ฉํ์ญ์์ค. ์ ์ค์ผ์ด์ค๊ฐ ํธ๋์ญ์ ์๋ฃ๋ฅผ ์ํด ๊ฒฐ๊ณผ์ ์์กดํ๋ค๋ฉด ๋๊ธฐ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ์ค๊ฐ ์ํ๋ฅผ ๋ชจ๋ธ๋งํ์ญ์์ค.
