슈퍼비전
슈퍼비전
섹션 제목: “슈퍼비전”슈퍼바이저는 서비스 수명 주기를 관리하며, 시작 순서, 자동 재시작, 정상 종료를 처리합니다. auto_start: true로 설정된 서비스는 애플리케이션 부팅 시 시작됩니다.
라이프사이클 설정
섹션 제목: “라이프사이클 설정”서비스는 lifecycle 블록으로 슈퍼바이저에 등록합니다. 프로세스의 경우 process.service로 프로세스 정의를 래핑합니다:
# 프로세스 정의 (코드)- name: worker_process kind: process.lua source: file://worker.lua method: main
# 감독 서비스 (수명 주기 관리로 프로세스 래핑)- name: worker kind: process.service process: app:worker_process host: app:processes lifecycle: auto_start: true start_timeout: 30s stop_timeout: 10s stable_threshold: 5s depends_on: - app:database restart: initial_delay: 2s max_delay: 60s max_attempts: 10| 필드 | 기본값 | 설명 |
|---|---|---|
auto_start | false | 슈퍼바이저 시작 시 자동으로 시작 |
start_timeout | 10s | 시작에 허용된 최대 시간 |
stop_timeout | 10s | 정상 종료 최대 시간 |
stable_threshold | 5s | 서비스가 안정적으로 간주되기 전 실행 시간 |
depends_on | [] | 먼저 실행되어야 하는 서비스 |
의존성 해결
섹션 제목: “의존성 해결”슈퍼바이저는 두 가지 소스에서 의존성을 해결합니다:
depends_on에 선언된 명시적 의존성- 엔트리 참조에서 레지스트리 추출 의존성 (예: 설정의
database: app:db)
graph LR A[HTTP 서버] --> B[라우터] B --> C[핸들러 함수] C --> D[데이터베이스] C --> E[캐시]의존성은 의존 항목보다 먼저 시작됩니다. 서비스 C가 A와 B에 의존하면, C가 시작되기 전에 A와 B 모두 Running 상태에 도달해야 합니다.
depends_on에 명시하지 않아도 됩니다. 슈퍼바이저가 엔트리 설정의 레지스트리 참조에서 의존성을 자동으로 추출합니다.
재시작 정책
섹션 제목: “재시작 정책”서비스 실패 시 슈퍼바이저는 지수 백오프를 적용하여 재시도합니다:
lifecycle: restart: initial_delay: 1s # 첫 번째 재시도 대기 max_delay: 90s # 최대 지연 상한 backoff_factor: 2.0 # 시도당 지연 승수 jitter: 0.1 # ±10% 랜덤화 max_attempts: 0 # 0 = 무한 재시도| 시도 | 기본 지연 | 지터 포함 (±10%) |
|---|---|---|
| 1 | 1s | 0.9s - 1.1s |
| 2 | 2s | 1.8s - 2.2s |
| 3 | 4s | 3.6s - 4.4s |
| 4 | 8s | 7.2s - 8.8s |
| … | … | … |
| N | 90s | 81s - 99s (상한) |
서비스가 stable_threshold보다 오래 실행되면 재시도 카운터가 리셋됩니다. 이는 일시적 실패로 인한 영구적 지연 증가를 방지합니다.
터미널 에러
섹션 제목: “터미널 에러”다음 에러는 재시도를 중지합니다:
- 컨텍스트 취소
- 명시적 종료 요청
- 재시도 불가로 표시된 에러
보안 컨텍스트
섹션 제목: “보안 컨텍스트”서비스는 특정 보안 ID로 실행될 수 있습니다:
# 프로세스 정의- name: admin_worker_process kind: process.lua source: file://admin_worker.lua method: main
# 보안 컨텍스트가 있는 감독 서비스- name: admin_worker kind: process.service process: app:admin_worker_process host: app:processes lifecycle: auto_start: true security: actor: id: "service:admin-worker" meta: role: admin groups: - app:admin_policies policies: - app:data_access보안 컨텍스트가 설정하는 것:
| 필드 | 설명 |
|---|---|
actor.id | 이 서비스의 ID 문자열 |
actor.meta | 키-값 메타데이터 (역할, 권한 등) |
groups | 적용할 정책 그룹 |
policies | 적용할 개별 정책 |
서비스에서 실행되는 코드는 이 보안 컨텍스트를 상속받습니다. security 모듈로 권한을 확인할 수 있습니다:
local security = require("security")
if security.can("delete", "users") then -- 허용됨end서비스 상태
섹션 제목: “서비스 상태”stateDiagram-v2 [*] --> Inactive Inactive --> Starting Starting --> Running Running --> Stopping Stopping --> Stopped Stopped --> [*]
Running --> Failed Starting --> Failed Failed --> Starting : retry슈퍼바이저는 서비스를 다음 상태로 전환합니다:
| 상태 | 설명 |
|---|---|
Inactive | 등록되었지만 시작되지 않음 |
Starting | 시작 진행 중 |
Running | 정상 작동 중 |
Stopping | 정상 종료 진행 중 |
Stopped | 정상 종료됨 |
Failed | 에러 발생, 재시도 가능 |
시작 및 종료 순서
섹션 제목: “시작 및 종료 순서”시작: 의존성 먼저, 그 다음 의존 항목. 같은 의존성 레벨의 서비스는 병렬로 시작할 수 있습니다.
종료: 의존하는 항목 먼저, 그 다음 의존성. 의존성이 중지되기 전에 의존하는 서비스가 먼저 종료됩니다.
시작: database → cache → handler → http_server종료: http_server → handler → cache → database