운영 설정 자동 반영 설계
LHG 2026-08-29
처음 보는 사람도 이해되게 먼저 풀어둔다
ag_sys_config
db-over-yml
lru_cache
운영자가 ag_sys_config를 수정하면 다음 사용자 요청이 들어올 때 서버가 스스로 설정을 다시 읽는다.
재기동도, 배치도, 인스턴스 목록도 필요 없다
사용자 요청 도착 → 마지막 DB 확인 후 10초가 지났나? → 아니오: DB를 조회하지 않고 기존 설정으로 바로 처리 → 예: 지금 바로 DB 조회
요청마다 간단한 시간 비교는 하지만, 요청마다 DB를 조회하지는 않는다.
서버가 이전에 기억한 max(updated_at): 2026-08-20 10:00:00 운영자가 설정 수정 → 현재 max(updated_at): 2026-08-29 15:30:00 다음 DB 확인 → 시간이 다름 → 변경으로 판단 → ag_sys_config 전체 다시 읽기 → 캐시 갱신
서버가 DB를 3초 전에 확인했다면 바로 다음 요청은 기존 설정을 그대로 쓴다.
DB 접속 정보만큼은 DB에서 읽을 수 없다
application.yaml
타이머가 아니라 요청이 확인을 시작한다
/agent/execute /agent/stream /agent/replay /agent/replay/stream /agent/hil/respond /agent/hil/stream-respond
이 요청들이 들어올 때만 설정 변경 여부를 확인한다.
사용자 요청 도착 → 마지막 DB 확인 후 10초가 지났는지 확인 → 지나지 않음: 기존 설정으로 바로 처리 → 지남: DB 변경 여부 확인 → 변경 없음: 기존 설정으로 처리 → 변경 있음: 캐시 갱신을 최대 3초 기다린 뒤 처리
설정 확인은 그래프 실행 전에 이뤄진다.
그래프가 사용자 승인·추가 입력을 기다림 → 별도 설정 확인 없음 → HIL 응답 요청 도착 → 10초 확인 간격이 지났으면 DB 변경 여부 확인 → 변경이 있으면 캐시 갱신을 기다린 뒤 그래프 재개
설정 캐시를 갱신해도 대기 중인 LangGraph MemorySaver 상태는 그대로 유지한다.
MemorySaver
요청이 한 번에 몰리거나 서버가 여러 대라면 달라진다
_refresh_task
반영 시점은 "DB 변경 후 정확히 10초"가 아니라 "확인 간격이 지난 뒤 들어온 첫 요청"이다
10초가 지나지 않았으면 그 요청은 기존 설정을 쓰고 지난 뒤 첫 요청이 변경을 감지한다.
타이머 대신 요청이 확인을 트리거하도록 설계했다
select max(updated_at), count(*) from ag_sys_config where config_value is not null
max(updated_at)은 최근 수정 시간, count(*)은 값이 있는 설정의 개수다.
max(updated_at)
count(*)
get_settings()
그래프 캐시는 새로 만들되, 실행 중 상태를 담은 LangGraph MemorySaver는 그대로 유지한다.
모든 설정이 재기동 없이 바뀌는 것은 아니다
agent: config: db-over-yml: true auto-refresh: enabled: true ttl-seconds: 10 apply-timeout-seconds: 3
ttl-seconds: 0이면 요청마다 확인하고 apply-timeout-seconds: 0이면 기다리지 않는다.
ttl-seconds: 0
apply-timeout-seconds: 0
서버는 최초 접속 정보로 ag_sys_config를 읽어 설정과 그래프를 만든다. 이후 사용자 요청이 올 때마다 10초 간격으로 max(updated_at)과 행 수를 확인해, 변경이 있으면 get_settings()와 관련 캐시(lru_cache)를 비운 뒤 최신 설정으로 그래프와 서비스를 다시 만든다.