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

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

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

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

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

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

Cloud Tasks 큐 만들기

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

콘솔

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

    Cloud Tasks로 이동

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

  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회 반복을 호출하는 워크플로를 성공적으로 배포했습니다.