connection_budget(기본 40)을 두고, 기동 시 process_count 에 맞춰 pool_size/max_overflow 를 역산: (pool+overflow)×2엔진×process_count ≤ budget. 워커를 늘려도 config 가 스스로 예산을 지켜 커넥션 고갈→요청 실패를 예방. - config_models: MainDBConfig.connection_budget 추가 - server_configs: _autosize_pool(process_count 확정 후 산정) + _apply_pool_env_override (우선순위 = 명시 DB_POOL_SIZE > 자동 산정 > toml pool) - web_main: 기동 로그에 실효 풀/총커넥션/예산 출력 - env: DB_CONNECTION_BUDGET override, docker-compose 에 knob 노출 - tests: test_pool_autosize 10케이스(예산 준수·분할비·비활성·infeasible 바닥) - docs: operations 2-1 멀티코어/풀 섹션 + loadtest README 자동산정 표 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
from pydantic import BaseModel
|
|
|
|
from config.config_loader import ConfigModel
|
|
|
|
|
|
class WebServerConfig(ConfigModel):
|
|
server_name: str = ""
|
|
port: int = 0
|
|
process_count: int = 1
|
|
is_ssl: bool = False
|
|
is_test: bool = False
|
|
# CORS 허용 오리진(프론트). 비우면 CORS 미적용. 예: ["http://localhost:5173"]
|
|
cors_origins: list[str] = []
|
|
|
|
|
|
class LogConfig(ConfigModel):
|
|
print_console: bool = True
|
|
log_level: str = "debug"
|
|
|
|
|
|
# DB Read/Write 분리 설정.
|
|
# 하나의 논리 DB 에 대해 write(주) / read(복제) 접속 정보를 각각 가진다.
|
|
class MainDBConfig(ConfigModel):
|
|
db_type: str = "postgresql"
|
|
name: str = ""
|
|
write_host: str = ""
|
|
write_port: int = 5432
|
|
write_id: str = ""
|
|
write_pw: str = ""
|
|
read_host: str = ""
|
|
read_port: int = 5432
|
|
read_id: str = ""
|
|
read_pw: str = ""
|
|
show_log: bool = False
|
|
# 커넥션 풀 사이징. 실제 동시 커넥션 = (pool_size + max_overflow) x 엔진수(R/W=2) x process_count.
|
|
pool_size: int = 10
|
|
max_overflow: int = 20
|
|
# 커넥션 예산(자동 산정). >0 이면 process_count 에 맞춰 pool_size/max_overflow 를 자동 계산한다:
|
|
# (pool+overflow)x2xprocess_count ≤ connection_budget 가 되도록. (이때 위 pool_size/max_overflow 는 무시)
|
|
# PG max_connections·공유 DB 동거 서비스(worker·negosium 등)를 고려한 'lps API 가 쓸 총 커넥션 상한'.
|
|
# 0 이면 자동 산정 끔(위 pool_size/max_overflow 그대로 사용). env DB_CONNECTION_BUDGET 로 override.
|
|
connection_budget: int = 40
|
|
# SSL/TLS 모드: ""/"disable"=미사용(로컬), "require"/"verify-ca"/"verify-full"=관리형 DB(RDS/Aurora/Azure).
|
|
sslmode: str = ""
|
|
|
|
|
|
# ── 시크릿(API 키 등)도 TOML 로 통합 관리. config.local.toml 은 미커밋(*.toml). ──
|
|
# 배포는 이 파일을 마운트하거나(권장), 환경별로 바뀌는 값만 env override 한다(DB_HOST 등).
|
|
|
|
|
|
class NaverKey(BaseModel):
|
|
id: str = ""
|
|
secret: str = ""
|
|
|
|
|
|
class NaverConfig(ConfigModel):
|
|
"""네이버 쇼핑 오픈API 키. 여러 개면 429/403 로테이션에 자동 포함."""
|
|
|
|
keys: list[NaverKey] = []
|
|
|
|
|
|
class OpenAIConfig(ConfigModel):
|
|
"""AI 유사도 판정/검색어 생성용 OpenAI."""
|
|
|
|
api_key: str = ""
|
|
model: str = "gpt-4o-mini"
|
|
|
|
|
|
class DecodoConfig(ConfigModel):
|
|
"""DECODO residential 프록시(쿠팡 전용, 포트기반 sticky). 값이 다 차야 활성."""
|
|
|
|
host: str = ""
|
|
username: str = ""
|
|
password: str = ""
|
|
port_start: int = 0
|
|
port_end: int = 0
|
|
session_minutes: int = 10
|
|
cost_per_gb: float = 0.0 # DECODO residential 요금($/GB) — 검색 원가의 대역폭 비용 산정용(플랜에 맞게 설정)
|