Horizon이란
Laravel Horizon은 Laravel의 Redis 큐 전용 모니터링 대시보드입니다. 잡의 처리량·실행 시간·실패 상황을 실시간으로 시각화하고, 워커 설정을 코드로 관리할 수 있습니다.설치
Composer로 설치합니다.config/horizon.php와 app/Providers/HorizonServiceProvider.php가 생성됩니다.
설정
config/horizon.php의 구성
config/horizon.php는 워커 설정을 모두 관리하는 파일입니다. 중심이 되는 설정이 environments 옵션입니다.
Horizon은 내부적으로
horizon이라는 이름의 Redis 연결을 사용합니다. config/database.php에서 이 이름을 다른 연결에 사용하지 마세요.CSP nonce (Content Security Policy)
Content Security Policy의 일환으로 Horizon 뷰 내에서 사용되는script / style 태그에 nonce 속성을 설정하고 싶다면 Horizon::cspNonce 메서드를 사용합니다. 요청마다 새로운 nonce를 할당하기 위해 보통 미들웨어 내에서 호출합니다.
config/horizon.php의 middleware 옵션에 추가합니다.
슈퍼바이저 (Supervisor)
각 환경은 하나 이상의 “슈퍼바이저”를 가질 수 있습니다. 슈퍼바이저는 워커 그룹의 관리 단위로, 다른 큐·밸런스 전략·프로세스 수를 갖는 여러 슈퍼바이저를 같은 환경에서 돌릴 수 있습니다.기본값
defaults 옵션에서 모든 슈퍼바이저에 적용되는 기본값을 설정할 수 있습니다.
유지보수 모드
애플리케이션이 유지보수 모드일 때, Horizon은 기본적으로 잡을 처리하지 않습니다. 강제로 처리하게 하려면force 옵션을 사용합니다.
잡의 최대 시도 횟수
tries를 0으로 하면 무제한 재시도를 허용합니다.
잡의 타임아웃
백오프 (재시도 대기 시간)
예외 발생 후 재시도까지의 대기 초를 지정합니다.그 외 워커 옵션
tries, timeout, backoff 외에도 각 슈퍼바이저는 워커 프로세스의 거동이나 자동 재시작 타이밍을 제어하는 옵션을 받습니다. 장시간 가동하는 프로세스를 정기적으로 재시작하는 것은 메모리 누수를 막는 좋은 습관입니다.
memory— 재시작까지 워커 프로세스가 소비할 수 있는 최대 메모리 양(MB). 기본값은128maxJobs— 재시작까지 처리하는 잡 수.0은 무제한을 의미. 기본값은0maxTime— 재시작까지 워커가 가동할 수 있는 초 수.0은 시간에 의한 재시작 없음을 의미. 기본값은0sleep— 잡이 없을 때 다음 폴링까지 대기하는 초 수. 기본값은3rest— 각 잡 처리 사이에 일시 정지하는 초 수. 기본값은0nice— 워커 프로세스의 우선도(“niceness”). 값이 클수록 우선도는 낮아짐. 기본값은0
밸런스 전략
Horizon에는 3종류의 워커 밸런스 전략이 있습니다.auto (기본)
auto (기본)
큐 부하에 따라 워커 수를 자동 조정합니다.
minProcesses와 maxProcesses로 범위를 지정합니다.time— 큐를 비울 때까지의 추정 시간으로 스케일링size— 큐 내의 잡 수로 스케일링
auto 전략에서는 큐의 순서가 우선도를 의미하지 않습니다. 우선도를 강제하고 싶다면 여러 슈퍼바이저를 사용하세요.simple
simple
워커 수를 고정하고, 지정한 큐에 균등하게 분배합니다.위 예에서는
default와 notifications에 각각 5개의 프로세스가 할당됩니다.false (밸런스 없음)
false (밸런스 없음)
큐를 나열한 순서로 엄밀히 우선합니다. Laravel 기본 큐 시스템과 유사한 동작이지만, 밀린 양에 따라 워커 수를 스케일링합니다.
default 큐의 잡이 항상 notifications 큐보다 먼저 처리됩니다.대시보드 인가
Horizon 대시보드는/horizon 라우트에서 접근할 수 있습니다. 로컬 환경에서는 기본적으로 누구나 접근할 수 있지만, 프로덕션 환경에서는 게이트 정의로 접근을 제한합니다.
app/Providers/HorizonServiceProvider.php의 gate() 메서드를 편집합니다.
Horizon 시작
기본 명령
로컬 개발: 자동 재시작
파일 변경을 감지하여 Horizon을 자동 재시작하려면horizon:listen 명령을 사용합니다.
Supervisor에 의한 상시 시작
프로덕션 환경에서는 Supervisor를 사용하여 Horizon을 상시 가동시킵니다.Supervisor 설치
설정 파일 작성
/etc/supervisor/conf.d/horizon.conf를 만듭니다.
Supervisor 시작
배포 시
코드를 배포할 때마다 Horizon을 재시작하여 변경을 반영합니다.autostart=true / autorestart=true로 되어 있다면 종료 후 자동으로 재시작됩니다.
잡 관리
태그
Horizon은 잡에 관련된 Eloquent 모델을 자동 감지하여 태그를 붙입니다.tags() 메서드를 구현합니다.
tags() 메서드에 전달됩니다.
사일런싱
대시보드의 “완료된 잡” 목록에 표시하고 싶지 않은 잡은config/horizon.php에서 사일런싱할 수 있습니다.
Silenced 인터페이스를 구현하는 방법도 있습니다.
메트릭과 모니터링
Horizon의 메트릭 대시보드에는 잡·큐의 처리량과 실행 시간이 표시됩니다. 정기적으로 스냅샷을 가져오기 위한 스케줄을 설정합니다.config/horizon.php의 metrics.trim_snapshots 옵션에서, 메트릭 그래프용으로 유지할 스냅샷 수를 설정할 수 있습니다. 이 설정은 스냅샷의 경과 시간이 아니라 건수로 제한하므로, 실제 유지 기간은 horizon:snapshot 명령의 실행 빈도에 따라 달라집니다.
잡 실패 알림
큐의 대기 시간이 길어졌을 때 알림을 받을 수 있습니다.app/Providers/HorizonServiceProvider.php의 boot() 메서드에서 설정합니다.
대기 시간 임계값
config/horizon.php의 waits 옵션으로 알림 트리거가 되는 대기 초를 설정합니다.
0을 설정하면 해당 큐의 알림이 비활성화됩니다.
실패 잡 관리
실패한 잡은 ID 또는 UUID로 삭제할 수 있습니다.업그레이드
Horizon의 메이저 버전 업 시에는 업그레이드 가이드를 반드시 확인하세요.관련 페이지
큐와 잡
Laravel 큐의 기본. 잡의 생성·디스패치·배치 처리·실패 처리를 설명.
Redis
Horizon의 백엔드로 필요한 Redis의 설정과 사용법.