심포니 스케줄러 컴포넌트: 앱 안의 크론, 크론탭이 아... 노트

심포니 스케줄러 컴포넌트: 앱 안의 크론, 크론탭이 아닌

이 글은 PHP 애플리케이션에서 예약된 작업을 관리하기 위한 전통적인 crontab의 현대적인 대안으로 Symfony Scheduler 컴포넌트를 논의합니다. 호스트별이고, 버전 관리 밖에 있으며, 관리 및 테스트가 어렵다는 crontab의 문제점을 강조합니다. Symfony Scheduler는 반복 작업을 버전 관리되는 PHP 코드로 재배치하여 코드 검토 및 단위 테스트를 가능하게 합니다.Scheduler의 핵심은 #[AsSchedule]로 표시되고 ScheduleProviderInterface를 구현하는 스케줄 제공자 클래스입니다. 이 클래스는 RecurringMessage::every()를 사용한 사람이 읽을 수 있는 간격 또는 RecurringMessage::cron()을 사용한 표준 cron 표현식을 사용하여 어떤 작업을 언제 실행할지 정의합니다. 메시지 자체는 일반 Data Transfer Objects (DTO)입니다.cron 표현식의 경우 dragonmantank/cron-expression 패키지가 필요하며, 이는 부하를 분산하고 일반적인 시간에 발생하는 동시 실행을 방지하는 해시된 cron 표현식이라는 기능을 제공합니다. Scheduler는 Symfony Messenger 컴포넌트를 기본 엔진으로 사용하므로 예약된 메시지는 다른 애플리케이션 메시지와 동일한 미들웨어, 재시도 전략 및 실패 처리를 거칩니다.작업은 전용 핸들러가 있는 메시지로 정의하거나, 더 간단한 일회성 작업을 위해 #[AsCronTask] 및 #[AsPeriodicTask] 속성을 사용하여 서비스 메서드에서 직접 정의할 수 있습니다. Scheduler의 중요한 이점은 테스트 용이성입니다. 스케줄은 전체 애플리케이션을 부팅하거나 실행을 기다릴 필요 없이 단위 테스트할 수 있습니다. 이 글은 여러 스케줄러 소비자 프로세스를 실행하면 작업이 중복 실행된다는 치명적인 주의 사항을 경고합니다.이를 방지하기 위해 Scheduler 전송은 잠금으로 구성되어야 하며, 이는 단일 프로세스만 예약된 메시지를 생성하도록 보장합니다. 이 잠금은 Redis와 같은 공유 저장소로 백업되어야 합니다. 중복성을 위해 소비자는 수평으로 확장할 수 있지만, 잠금을 보유하고 스케줄링을 수행하는 작업자는 하나만 있어야 합니다.추가적으로, Scheduler는 공유 캐시 풀을 사용하여 상태를 유지할 수 있으며, 작업자가 다시 시작될 때 놓친 작업을 따라잡을 수 있습니다. 궁극적으로 Symfony Scheduler는 스케줄링 문제를 인프라에서 애플리케이션 코드로 이동시켜 분리된 아키텍처의 원칙에 부합합니다. 이 접근 방식은 스케줄링 로직을 애플리케이션의 코드베이스 내에서 버전 관리, 검토 및 테스트 가능하게 유지함으로써 유지보수성을 향상시킵니다.
CdXz5zHNQW_ftlbF6BSQY.webp