BLOG

신 기능 – 동적 병렬 처리를 위한 단계 기능 지원
작성일: 2019-11-06

마이크로 서비스는 애플리케이션을 보다 쉽게 ​​확장하고 개발할 수 있도록 하지만, 분산 애플리케이션의 구성 요소를 조정하는 것은 어려운 작업이 될 수 있습니다. AWS Step Functions는 각 단계가 이전 단계의 출력으로 입력되는 단계로 구성된 워크 플로우를 설계하고 실행할 수 있도록 함으로써, 작업을 보다 쉽게 ​​조정할 수 있게 하는 완전 관리형 서비스입니다. 예를 들어, Novartis Institutes for Biomedical Research is using Step Functions는 Step Functions 를 사용하여 과학자들이 클러스터 전문가에 의존하지 않고 이미지 분석을 실행할 수 있도록 합니다.

 

Step Functions는 최근에 callback patterns과 같은 흥미로운 기능을 추가 하여 휴먼 액티비티 및 타사 서비스의 통합을 간소화 하여, 워크 플로우를 끼워 넣고, 재사용 가능한 모듈식 워크 플로우를 모았습니다. 현재 우리는 워크 플로우 내에서 동적 병렬 처리에 대한 지원을 추가하고 있습니다!

 

동적 병렬 처리 작동 방식 상태

머신은 JSON 기반 구조 언어 인  Amazon States Language를 사용하여 정의됩니다. Parallel상태가 상태 머신에 정의 분기 병렬 고정 된 수에 실행할 수 있다. 이제 Step Functions는Map동적 병렬 처리를 위한 새로운 상태 유형을 지원합니다.

 

Map상태를 구성하려면 완전한 하위 워크 플로인 Iterator 을 정의합니다. Step Functions 실행이 Map상태에 들어가면 상태 입력에서 JSON 배열을 반복합니다. 각 항목에 대해 Map상태는 잠재적으로 병렬로 하나의 하위 워크 플로를 실행합니다. 모든 하위 워크 플로 실행이 완료되면 Map상태는 Iterator에 의해 처리 된 각 항목의 출력을 포함하는 배열을 반환합니다.

 

MaxConcurrency 필드 Map을 추가하여 실행 되는 동시 하위 워크 플로우 수에 대한 상한을 구성 할 수 있습니다. 기본값은0 입니다. 이 경우, 병렬 처리에 제한을 두지 않으며 반복은 최대한 동시에 호출됩니다. MaxConcurrency의 값이 1 인 경우, 입력 상태로 나타나는 순서대로, 한번에 1개의 요소를 기동하는 것이 효과적이며, 이전 반복이 실행을 완료 할 때까지 반복 처리를 시작하지 않습니다.

 

새로운 Map상태를 사용하는 한 가지 방법은 워크 플로에서 팬 아웃 또는 분산 수집 메시징 패턴을 활용하는 것입니다.

 

  • 팬 아웃은 여러 대상에게 메시지를 전달할 때 적용되며 주문 처리 또는 배치 데이터 처리와 같은 워크 플로에 유용 합니다. 예를 들어 Amazon SQS에서 메시지 배열을 검색 할 수 있으며 Map은 각 메시지를 별도의 AWS Lambda 함수로 보냅니다.
  • 스캐터 수집은 단일 메시지를 여러 대상 (스캐터) 으로 발송 한 후 다음 단계 (수집)에 대한 응답을 다시 집계합니다. 파일 처리 및 테스트 자동화에 유용 합니다. 예를 들어, 500MB 미디어 파일 10개를 병렬로 트랜스 코딩 한 다음 결합하여 5GB 파일을 만들 수 있습니다.

 

Parallel및 Task상태와 같이 Map은 서비스 및 커스텀 예외를 처리하기 위해 Retry및 Catch필드 를 지원 합니다. 또 Retry 및 Catch를 Iterator내의 예외를 처리하는 것도 가능합니다. 처리되지 않은 오류가 원인으로, 또는 Fail상태에 이행하는 것에 의해 Iterator의 실행에 실패 한 경우, Map상태에서 처리 되지 않은 경우, 단계 기능은 오류와 함께 워크 플로우 실행을 중지합니다.

 

지도 상태 사용

주문을 처리하는 워크 플로를 구축하고Map상태를 사용하여 항목을 순서대로 작업합니다. 이 워크 플로의 일부로 실행되는 작업은 모두 Lambda 기능이지만 Step Functions를 사용하면 다른 AWS service integrations 을 사용 하고 EC2 인스턴스, 컨테이너 또는 온 프레미스 인프라에서 코드를 실행할 수 있습니다.

 

다음은 JSON 문서로 표현 된 샘플 주문과 책을 읽는 동안 함께 마시는 커피입니다. 주문에는 상세 부문이 있고, 주문의 일부인 items 리스트가 있습니다.

 

{

  “orderId”: “12345678”,

  “orderDate”: “20190820101213”,

  “detail”: {

    “customerId”: “1234”,

    “deliveryAddress”: “123, Seattle, WA”,

    “deliverySpeed”: “1-day”,

    “paymentMethod”: “aCreditCard”,

    “items”: [

      {

        “productName”: “Agile Software Development”,

        “category”: “book”,

        “price”: 60.0,

        “quantity”: 1

      },

      {

        “productName”: “Domain-Driven Design”,

        “category”: “book”,

        “price”: 32.0,

        “quantity”: 1

      },

      {

        “productName”: “The Mythical Man Month”,

        “category”: “book”,

        “price”: 18.0,

        “quantity”: 1

      },

      {

        “productName”: “The Art of Computer Programming”,

        “category”: “book”,

        “price”: 180.0,

        “quantity”: 1

      },

      {

        “productName”: “Ground Coffee, Dark Roast”,

        “category”: “grocery”,

        “price”: 8.0,

        “quantity”: 6

      }

    ]

  }

}

이 주문을 처리하기 위해 다른 작업을 실행하는 방법을 정의하는 상태 시스템을 사용하고 있습니다. 단계 기능 콘솔은 내가 구축하고 있는 워크 플로의 시각적 표현을 생성합니다 :

 

  • 먼저 결제를 검증하고 확인합니다.
  • 그 후, 주문의 품목을 처리하고, 동시에 가능 여부를 확인하며, 재고를 확인 후, 배송을 준비하고 배송 프로세스를 시작합니다.
  • 마지막으로 주문 요약이 고객에게 전송됩니다.
  • 지불 확인에 실패한 경우, 고객에게 알림을 보내는 것을 차단합니다.

다음은 JSON 문서와 동일한 상태 머신 정의입니다. ProcessAllItems상태는 Map을 사용한 항목을 병렬적으로 처리 합니다. 이 경우 MaxConcurrency 필드를 사용하여 동시성을 3으로 제한 합니다. Iterator에는 임의의 복잡한 하위 워크 플로를 배치 할 수 있습니다. 이 경우, CheckAvailability, PrepareForDelivery및 StartDelivery 3가지 단계가 있습니다. 예를 들면, 외부 서비스와의 통합 경우 등 이 단계에서는 각각 하위 플로 실행의 신뢰성을 높이기 위해, 재 시도 및 Catch 오류를 실행 가능합니다.

{

  “StartAt”: “ValidatePayment”,

  “States”: {

    “ValidatePayment”: {

      “Type”: “Task”,

      “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:validatePayment”,

      “Next”: “CheckPayment”

    },

    “CheckPayment”: {

      “Type”: “Choice”,

      “Choices”: [

        {

          “Not”: {

            “Variable”: “$.payment”,

            “StringEquals”: “Ok”

          },

          “Next”: “PaymentFailed”

        }

      ],

      “Default”: “ProcessAllItems”

    },

    “PaymentFailed”: {

      “Type”: “Task”,

      “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:paymentFailed”,

      “End”: true

    },

    “ProcessAllItems”: {

      “Type”: “Map”,

      “InputPath”: “$.detail”,

      “ItemsPath”: “$.items”,

      “MaxConcurrency”: 3,

      “Iterator”: {

        “StartAt”: “CheckAvailability”,

        “States”: {

          “CheckAvailability”: {

            “Type”: “Task”,

            “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:checkAvailability”,

            “Retry”: [

              {

                “ErrorEquals”: [

                  “TimeOut”

                ],

                “IntervalSeconds”: 1,

                “BackoffRate”: 2,

                “MaxAttempts”: 3

              }

            ],

            “Next”: “PrepareForDelivery”

          },

          “PrepareForDelivery”: {

            “Type”: “Task”,

            “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:prepareForDelivery”,

            “Next”: “StartDelivery”

          },

          “StartDelivery”: {

            “Type”: “Task”,

            “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:startDelivery”,

            “End”: true

          }

        }

      },

      “ResultPath”: “$.detail.processedItems”,

      “Next”: “SendOrderSummary”

    },

    “SendOrderSummary”: {

      “Type”: “Task”,

      “InputPath”: “$.detail.processedItems”,

      “Resource”: “arn:aws:lambda:us-west-2:123456789012:function:sendOrderSummary”,

      “ResultPath”: “$.detail.summary”,

      “End”: true

    }

  }

}

이 워크 플로우에서 사용되는 Lambda 함수는 주문 JSON 문서의 전체 구조를 인식하지 못합니다. 그들은 처리 할 입력 상태의 일부만 알면 됩니다. 여러 워크 플로에서 이러한 기능을 쉽게 재사용 할 수 있도록 하는 것이 가장 좋습니다. 상태 머신 정의에서는 InputPath, ItemsPath, ResultPath, 및 OutputPath 필드를 포함하여 JsonPath 구문을 사용한 함수를 입력 및 출력하는 데에 사용 되는 패스를 조작 합니다. :

 

  • InputPath 는 입력 상태에서 데이터를 필터링 하는 데 사용됩니다 (예 : 주문의 상세를 Iterator에 넘기는 것 뿐입니다.)
  • ItemsPath는 Map상태에 따라 고유하며 예를 들어 주문 상세 내의 항목을 처리 하기 위해 입력으로 처리하는 배열 필드를 특정하기 위해 사용 됩니다.
  • ResultPath 작업의 출력을 입력 상태에 추가하고 완전히 덮어 쓰지 않아도 됩니다. 예를 들어. 주문에 a summary를 추가하는 등, 작업의 출력을 완전히 덮어 쓰는 것이 불가합니다.
  • 이번에는 OutputPath을 사용하지 않지만 원하지 않는 정보를 걸러 내고 관심 있는 JSON 부분 만 다음 상태로 전달하는 것이 유용 할 수 있습니다. 예를 들어, 주문의 상세만을 출력으로 송신 합니다.

 

선택적으로 Parameters필드는 각 반복에 사용되는 raw 입력을 커스터마이즈 가능합니다. 예를 들어, deliveryAddress는 주문의 상세에 포함 되어 있지 않지만, 각 항목에는 포함 되어 있지 않습니다. Iterator에 아이템의 인덱스가 있고, deliveryAddress에 액세스 하기 위해서는 이것을 Map상태로 추가 합니다.

 

“Parameters”: {

  “index.$”: “$$.Map.Item.Index”,

  “item.$”: “$$.Map.Item.Value”,

  “deliveryAddress.$”: “$.deliveryAddress”

}

현재 사용 가능

이 새로운 기능은 Step Functions가 제공되는 모든 지역에서 사용할 수 있습니다. 동적 병렬 처리는 아마도 단계 함수에서 가장 많이 요청 된 기능 일 것입니다. 새로운 사용 사례의 구현이 가능하며, 기존 사용 사례를 최적화 할 수 있습니다. 무엇에 사용할 예정인지 알려주십시오!

 

원문 URL: https://aws.amazon.com/ko/blogs/aws/new-step-functions-support-for-dynamic-parallelism/

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.