L78 — Configuration Management

Một binary, nhiều môi trường: thử precedence default < file < env < flag, validate fail-fast lúc startup, và hot reload qua SIGHUP không restart.

1. Precedence — nguồn nào thắng?

Mỗi field config có thể đến từ 4 nguồn. Nguồn "gần lúc chạy" hơn ghi đè nguồn tĩnh hơn: default < file < env < flag. Bật/tắt từng nguồn và đổi giá trị để xem giá trị resolved cuối cùng và nguồn quyết định.

2. Validation — fail-fast lúc startup

Gọi Validate() ngay sau Load(), TRƯỚC khi mở socket/DB. Config sai → process exit khác 0 → K8s thấy CrashLoopBackOff và không route traffic. Nhập config rồi bấm "Start app".

Bấm "Start app" để chạy Load() → Validate()...

3. Hot reload — SIGHUP, atomic swap

App đang chạy (cùng một PID). Đổi LOG_LEVEL rồi gửi SIGHUP: store reload từ env, validate, swap nguyên con trỏ. Process không restart — PID không đổi, uptime tiếp tục tăng. Config hỏng → giữ config cũ.

PID 4242
● running
LOG_LEVEL=info
uptime: 0s
App khởi động với LOG_LEVEL=info...