작업 재시도 및 체크포인트 권장사항

개별 작업 태스크 또는 작업 실행도 여러 가지 이유로 실패할 수 있습니다. 이 페이지에서는 태스크 재시작 및 작업 체크포인트를 중심으로 이러한 실패를 해결하는 권장사항을 제시합니다.

작업 태스크 재시작 계획

태스크가 재시작되어 출력이 손상되거나 중복되지 않도록 작업이 멱등성을 갖도록 합니다. 즉, 반복 횟수 또는 실행 시점에 관계없이 특정 입력 세트에 대해 동일한 동작을 갖는 반복 가능한 논리를 작성합니다.

입력 데이터와 다른 위치에 출력을 작성하여 입력 데이터를 그대로 유지합니다. 이렇게 하면 작업이 다시 실행될 때 작업이 프로세스를 처음부터 반복하여 동일한 결과를 얻을 수 있습니다.

동일한 고유 식별자를 재사용하거나 출력이 이미 있는지 확인하여 출력 데이터가 중복되지 않도록 합니다. 중복 데이터는 컬렉션 수준 데이터 손상을 나타냅니다.

체크포인트 사용

가능한 경우 실패 후 태스크가 다시 시작되어도 작업을 처음부터 다시 시작하는 대신 중단된 부분부터 다시 진행할 수 있도록 작업 체크포인트를 저장합니다. 이렇게 하면 작업 속도가 빨라지고 불필요한 비용이 최소화됩니다.

Cloud Storage 또는 데이터베이스와 같은 영구 스토리지 위치에 부분적인 결과와 진행률 표시를 주기적으로 작성합니다. 태스크가 시작되면 시작 시에 부분적인 결과를 찾습니다. 부분적인 결과가 발견되면 중단된 지점부터 처리를 시작합니다.

작업이 체크포인트에 적합하지 않은 경우 더 작은 청크로 나누어 더 많은 수의 태스크를 실행하는 것이 좋습니다.

체크포인트 예시 1: 원주율 계산

Pi를 여러 소수 자릿수로 계산하는 등 재귀 알고리즘을 실행하는 작업이 있고 값을 1로 설정한 동시 로드를 사용하는 경우:

  • 10분마다 진행률을 기록하거나 손실된 작업 허용 범위에 따라 pi-progress.txt Cloud Storage 객체에 기록합니다.
  • 태스크가 시작되면 pi-progress.txt 객체를 쿼리하고 이 값을 시작점으로 로드합니다. 이 값을 함수의 초기 입력으로 사용합니다.
  • 최종 결과를 Cloud Storage에 작성할 때 병렬 실행 또는 반복 실행을 통한 중복을 방지하려면 pi-complete.txt를 객체로 사용하고, 완료 날짜를 기준으로 구분하려면 pi-complete-DATE.txt를 사용합니다.

체크포인트 예시 2: Cloud SQL에서 레코드 10,000개 처리

Cloud SQL과 같은 관계형 데이터베이스에서 레코드 10,000개를 처리하는 작업이 있는 경우:

  • SELECT * FROM example_table LIMIT 10000과 같은 SQL 쿼리로 처리할 레코드를 검색합니다.
  • 중요한 처리 작업이 중단시 손실되지 않도록 업데이트된 레코드를 100개 단위의 배치로 작성합니다.
  • 레코드가 기록되면 처리된 레코드를 기록해 둡니다. 처리가 확인된 경우에만 1로 설정된 테이블에 처리된 불리언 열을 추가할 수 있습니다.
  • 태스크가 시작되면 처리할 항목을 검색하는 데 사용되는 쿼리에 처리됨 = 0 조건이 추가되어야 합니다.
  • 재시도를 정리하는 것 외에도 이 기법은 작업을 작은 태스크로 분할하도록 지원합니다. 예를 들어 한 번에 100개의 레코드를 선택하도록 쿼리를 수정하고(LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100) 100개의 태스크를 실행하여 10,000개의 레코드를 모두 처리할 수 있습니다. CLOUD_RUN_TASK_INDEX는 Cloud Run 작업을 실행하는 컨테이너 내에 있는 기본 제공 환경 변수입니다.

이러한 모든 요소를 함께 사용하면 최종 쿼리가 다음과 같이 표시될 수 있습니다. SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100

다음 단계