Cloud Tasks 큐를 사용하여 워크플로 실행 버퍼링


이 튜토리얼에서는 워크플로 실행 속도를 조절할 수 있는 Cloud Tasks 큐를 만드는 방법을 보여줍니다.

활성 워크플로 실행이 동시에 발생할 수 있는 최대 개수가 존재합니다. 이 할당량이 소진되고 실행 백로그가 사용 중지되었거나 백로그된 실행의 할당량에 도달하면 새 실행은 HTTP 429 Too many requests 상태 코드와 함께 실패합니다. 사용자가 정의한 속도로 하위 워크플로를 실행하도록 Cloud Tasks 큐를 사용 설정하면 Workflows 할당량 관련 문제를 방지하고 실행 속도를 더 높일 수 있습니다.

Cloud Tasks는 전송을 '최소 1회' 하도록 설계되었습니다. 그러나 Workflows는 Cloud Tasks의 중복 요청을 단 한 번만 처리할 것임을 보장하지 않습니다.

다음 다이어그램에서 상위 워크플로는 전달 비율이 적용된 Cloud Tasks 큐로 규제되는 하위 워크플로를 호출합니다.

상위 워크플로에서 Cloud Tasks 큐를 통해 하위 워크플로 반복 호출

목표

이 튜토리얼에서는 다음 단계를 진행합니다.

  1. 상하위 워크플로 사이에서 중개자 역할을 하는 Cloud Tasks 큐 만들기
  2. 상위 워크플로에서 데이터를 수신하는 하위 워크플로를 만들고 배포하기
  3. Cloud Tasks 큐를 통해 하위 워크플로를 실행하는 상위 워크플로를 만들고 배포하기
  4. 디스패치 비율 제한 없이 상위 워크플로를 실행하여 하위 워크플로 실행 호출하기
  5. Cloud Tasks 큐에 디스패치 한도를 적용하고 상위 워크플로를 실행하기
  6. 하위 워크플로가 Cloud Tasks 큐를 통해 정의된 속도로 실행되는지 확인하기

Google Cloud 콘솔에서 또는 터미널이나 Cloud Shell에서 Google Cloud CLI를 사용하여 다음 명령어를 실행할 수 있습니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.

콘솔

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. Google Cloud 콘솔에서 IAM 페이지로 이동하여 Compute Engine 기본 서비스 계정의 권한을 설정합니다.

    IAM으로 이동

    테스트 목적으로 이 튜토리얼의 워크플로와 연결할 것이므로 Compute Engine 기본 서비스 계정을 기록해 두세요. 이 서비스 계정은 Compute Engine을 사용하는 Google Cloud 서비스를 사용 설정하거나 사용하면 다음 이메일 형식으로 자동 생성됩니다.

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다. 프로젝트 번호는 Google Cloud 콘솔의 시작 페이지에서 찾을 수 있습니다.

    프로덕션 환경의 경우 새 서비스 계정을 만들고 해당 계정에 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 하나 이상 하나 이상의 IAM 역할을 부여하는 것을 강력하게 추천합니다.

  9. Compute Engine 기본 서비스 계정을 선택하고 해당 행에서 주 구성원 수정을 클릭합니다.
  10. 대화 상자가 나타나면 다른 역할 추가를 클릭하고 다음 역할을 추가합니다.
    1. 역할 선택 목록에서 Workflows > Workflows 호출자를 선택하여 계정에 워크플로 실행을 트리거할 권한을 부여합니다.
    2. 역할 선택 목록에서 Cloud Tasks > Cloud Tasks 큐 추가자를 선택하여 계정에 작업을 만들 권한을 부여합니다.
  11. 저장을 클릭합니다.

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  11. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. 테스트 목적으로 이 튜토리얼의 워크플로와 연결할 것이므로 Compute Engine 기본 서비스 계정을 기록해 두세요. 이 서비스 계정은 Compute Engine을 사용하는 Google Cloud 서비스를 사용 설정하거나 사용하면 다음 이메일 형식으로 자동 생성됩니다.

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다. 다음 명령어를 실행하여 프로젝트 번호를 찾을 수 있습니다.

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    프로덕션 환경의 경우 새 서비스 계정을 만들고 해당 계정에 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 하나 이상 하나 이상의 IAM 역할을 부여하는 것을 강력하게 추천합니다.

  13. Compute Engine 기본 서비스 계정에 프로젝트에 대한 Workflows 호출자 역할(roles/workflows.invoker)을 부여하여 계정에 워크플로 실행을 트리거할 권한을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID
    • PROJECT_NUMBER: Google Cloud 프로젝트 번호

  14. Compute Engine 기본 서비스 계정에 프로젝트에 대한 Cloud Tasks 큐 추가자 역할(roles/cloudtasks.enqueuer)을 부여하여 계정에 작업을 만들 권한을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudtasks.enqueuer

Cloud Tasks 큐 만들기

상위 워크플로에서 사용할 수 있으며 워크플로 실행 속도를 제어할 수 있는 Cloud Tasks 큐를 만듭니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Tasks 페이지로 이동합니다.

    Cloud Tasks로 이동

  2. push 큐 만들기를 클릭합니다.

  3. 큐 이름으로 queue-workflow-child를 입력합니다.

  4. 리전 목록에서 us-central1(아이오와)을 선택합니다.

  5. 만들기를 클릭합니다.

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

하위 워크플로 만들기 및 배포

하위 워크플로는 상위 워크플로에서 데이터를 수신하고 처리할 수 있습니다. 다음을 수행하는 하위 워크플로를 만들고 배포합니다.

  • 인수로 iteration을 수신합니다.
  • 10초 동안 절전 모드로 전환해서 일부 처리를 시뮬레이션합니다.
  • 실행 성공 시 문자열 반환

콘솔

  1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

    Workflows로 이동

  2. 만들기를 클릭합니다.

  3. 새 워크플로에 대해 workflow-child 이름을 입력합니다.

  4. 리전 목록에서 us-central1(아이오와)을 선택합니다.

  5. 서비스 계정 목록에서 Compute Engine 기본 서비스 계정을 선택합니다.

  6. 다음을 클릭합니다.

  7. 워크플로 편집기에서 다음 워크플로 정의를 입력합니다.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. 배포를 클릭합니다.

gcloud

  1. 워크플로의 소스 코드 파일을 만듭니다.

    touch workflow-child.yaml
  2. 텍스트 편집기에서 소스 코드 파일을 열고 다음 워크플로를 파일에 복사합니다.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. 워크플로를 배포합니다.

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

상위 워크플로 만들기 및 배포

상위 워크플로는 for 루프를 사용해서 하위 워크플로의 여러 분기를 실행합니다.

  1. 상위 워크플로를 정의하는 소스 코드를 복사합니다.

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    이 워크플로는 다음 단계로 구성됩니다.

    • 하위 워크플로와 Cloud Tasks 큐 이름을 참조하는 상수를 할당하는 데 사용되는 맵입니다. 자세한 내용은 을 참조하세요.

    • 하위 워크플로를 반복 호출하기 위해 실행되는 for 루프입니다. 자세한 내용은 반복을 참조하세요.

    • 하위 워크플로를 실행하기 위해 많은 수의 태스크를 만들어 Cloud Tasks 큐에 추가하는 워크플로 단계입니다. 자세한 내용은 Cloud Tasks API 커넥터를 참조하세요.

  2. 워크플로를 배포합니다.

    콘솔

    1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

      Workflows로 이동

    2. 만들기를 클릭합니다.

    3. 새 워크플로에 대해 workflow-parent 이름을 입력합니다.

    4. 리전 목록에서 us-central1(아이오와)을 선택합니다.

    5. 서비스 계정 목록에서 Compute Engine 기본 서비스 계정을 선택합니다.

    6. 다음을 클릭합니다.

    7. 워크플로 편집기에서 상위 워크플로의 정의를 붙여넣습니다.

    8. 배포를 클릭합니다.

    gcloud

    1. 워크플로의 소스 코드 파일을 만듭니다.

      touch workflow-parent.yaml
    2. 텍스트 편집기에서 소스 코드 파일을 열고 상위 워크플로에 대한 정의를 붙여넣습니다.

    3. 워크플로를 배포합니다.

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

비율 제한 없이 상위 워크플로 실행

상위 워크플로를 실행하여 Cloud Tasks 큐를 통해 하위 워크플로를 호출합니다. 실행을 완료하는 데 약 10초 정도 걸립니다.

콘솔

  1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

    Workflows로 이동

  2. Workflows 페이지에서 workflow-parent 워크플로를 클릭하여 세부정보 페이지로 이동합니다.

  3. Workflows 세부정보 페이지에서 실행을 클릭합니다.

  4. 실행을 다시 클릭합니다.

  5. 상위 워크플로가 실행 중일 때 Workflows 페이지로 돌아가 workflow-child 워크플로를 클릭하여 세부정보 페이지로 이동합니다.

  6. 실행 탭을 클릭합니다.

    다음과 비슷하게 하위 워크플로가 거의 동시에 실행됩니다.

    거의 동시에 실행되는 하위 워크플로의 세부정보

gcloud

  1. 워크플로를 실행합니다.

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. 워크플로 실행이 트리거되었는지 확인하려면 마지막의 4개 실행을 나열합니다.

    gcloud workflows executions list workflow-child --limit=4

    실행 횟수인 100이 Workflows 동시 실행 한도보다 낮으므로 결과는 다음과 유사합니다. 수천 개의 실행을 동시에 제출하면 할당량 문제가 발생할 수 있습니다.

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

이제 하위 워크플로 100회 반복을 호출하는 워크플로를 만들고 배포했습니다.

비율 제한을 사용하여 상위 워크플로 실행

Cloud Tasks 큐에 초당 디스패치 1회의 비율 제한을 적용한 다음 상위 워크플로를 실행합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Tasks 페이지로 이동합니다.

    Cloud Tasks로 이동

  2. 생성된 Cloud Tasks 큐인 queue-workflow-child를 클릭하고 큐 수정을 클릭합니다.

  3. 작업 디스패치의 비율 제한 섹션에서 최대 디스패치 필드에 1을 입력합니다.

  4. 저장을 클릭합니다.

  5. Workflows 페이지로 이동합니다.

    Workflows로 이동

  6. workflow-parent 워크플로를 클릭하여 세부정보 페이지로 이동합니다.

  7. Workflows 세부정보 페이지에서 실행을 클릭합니다.

  8. 실행을 다시 클릭합니다.

  9. 상위 워크플로가 실행 중일 때 Workflows 페이지로 돌아가 workflow-child 워크플로를 클릭하여 세부정보 페이지로 이동합니다.

  10. 실행 탭을 클릭합니다.

    다음과 비슷하게 하위 워크플로가 초당 요청 1회로 실행됩니다.

    초당 요청으로 실행되는 하위 워크플로의 세부정보

gcloud

  1. Cloud Tasks 큐를 업데이트하여 초당 디스패치 1회의 비율 제한을 적용합니다.

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. 워크플로를 실행합니다.

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. 워크플로 실행이 트리거되었는지 확인하려면 마지막의 4개 실행을 나열합니다.

    gcloud workflows executions list workflow-child --limit=4

    결과는 다음과 비슷하게 초당 워크플로 하나가 실행됩니다.

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

초당 1회 실행의 디스패치 비율로 하위 워크플로 100회 반복을 호출하는 워크플로를 성공적으로 배포했습니다.

삭제

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

튜토리얼 리소스 삭제

이 튜토리얼에서 만든 워크플로와 Cloud Tasks 리소스를 삭제합니다.

콘솔

  • 워크플로를 삭제하려면 다음 단계를 따르세요.

    1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

      Workflows로 이동

    2. 워크플로 목록에서 워크플로를 클릭하여 워크플로 세부정보 페이지로 이동합니다.

    3. 삭제를 클릭합니다.

    4. 워크플로 이름을 입력한 다음 확인을 클릭합니다.

  • Cloud Tasks 큐를 삭제하려면 다음 단계를 따르세요.

    1. Google Cloud 콘솔에서 Cloud Tasks 페이지로 이동합니다.

      Cloud Tasks로 이동

    2. 삭제할 큐의 이름을 선택하고 큐 삭제를 클릭합니다.

    3. 삭제 작업을 확인합니다.

gcloud

  • 워크플로를 삭제하려면 다음 명령어를 실행합니다.

    gcloud workflows delete workflow-child
    gcloud workflows delete workflow-parent

  • Cloud Tasks 큐를 삭제하려면 다음 명령어를 실행하세요.

    gcloud tasks queues delete queue-workflow-child

다음 단계