서버 클러스터에서 한 번만 실행하려는 작업이있는 경우 정기적으로이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 이 경우 클러스터의 정의는 분산 세션이로드 밸런서 뒤에있는 둘 이상의 동일한 서버입니다.
사용 사례 : X 시간당 한 번만 실행해야하는 비싼 작업이 있습니다. 예를 들어이 작업은 많은 레코드를 반복하고 상태를 업데이트 할 수 있습니다.
- 최악의 시나리오는 작업을 두 번 실행하면 데이터가 무효화되는 것입니다.
- 가장 좋은 시나리오는 작업이 모든 서버의 리소스를 이용하는 것입니다.
요구 사항 요약 :
- 노드 중 하나가 작동 중지 된 경우에도 작업을 계속 실행해야합니다.
- 작업은 스케줄 당 한 번만 실행해야합니다.
- 여러 작업이 동시에 또는 겹치는 시간에 예약 된 경우 실행중인 작업 수가 서버간에 균등하게 분배됩니다.
- 머신은 동일한 코드베이스를 가져야하며 NTP를 통해 동기화되어야합니다.
- 환경 변수에 따라 노드와 노드간에 구성이 다를 수 있습니다.
- 작업은 정시에 또는 지정된 시간 간격 내에서 시작해야합니다. (예를 들어 5 분)
가능한 해결책
- 하나의 노드를 마스터 노드로 설정하면 위의 1을 위반하므로 작동하지 않습니다.
- 작업을 시작하기 위해로드 밸런서 균형을 조정하도록 요청하십시오. 불행히도 이것은 동시에 여러 작업을 실행하는 경우 동일한 시스템에서 모두 실행될 수있는 부작용이 있습니다.
이것은 서블릿 컨테이너에서 Java로 실행되어야합니다. 그러나 그것은 내가 찾고있는 직업을 코딩하지 않습니다.
확실히 이것은 알려진 최상의 솔루션으로 해결 된 문제입니다.
관련 질문. /programming/5949038/schedule-job-executes-twice-on-cluster
위에서 언급 한 5 가지 요구 사항에 따라 솔루션이 충분하지 않으므로 중복되지 않습니다. 가장 많이지지 된 솔루션은 경쟁 문제로 어려움을 겪고 두 번째 솔루션은 요구 사항 3을 위반합니다.