nodejs에서 AWS Step 함수 사용

최근의 한 항목은 일정한 신축성을 필요로 하는데, 특히 장기적으로 실행되는 작업을 대기열에 넣을 수 있어야 한다.이러한 작업은 코드 변환 방면에서 약간의 번거로운 작업을 했지만, 실제로 우리는 이 작업 대기열을 관리할 계획을 세워야 한다.우리는rabbitmq와kue/redis 등 도구에 대해 약간의 경험을 가지고 있지만, 최종적으로 우리는 작은 단체이기 때문에 모든 이동 부품을 관리하는 것을 피할 수 있는지 궁금하다.
Google의 일부 인프라는 AWS를 사용하기 때문에, Google은 AWS Step 함수를 대기열 관리 도구로 사용합니다.코드 변환 엔진의 핵심은 EC2의 윈도우즈 기기에서 프로세스를 실행해야 하기 때문에 이 프로세스를 API 엔진에 봉인한 다음 AWS Step 함수에 연결하기로 결정했습니다.
묘사AWS Step Functions가 무엇인지 참고 자료가 많기 때문에 저는 깊이 토론하지 않겠습니다.요컨대, AWS는 정보를 대기열에 넣는 능력을 제공합니다. 메시지는 소비 프로그램이 대기열에서 삭제할 때까지 대기열에 저장됩니다.
이 자습서는 AWS Step 함수를 통합하여 웹 API에 포함된 대규모 실행 프로세스의 대기열 생성 방식으로 사용하는 방법을 중점적으로 보여 줍니다.우리의 API에 대해 우리는 매우 즐겨 사용AdonisJS한다. 이것은 매우 좋은nodejs 웹 프레임워크로 Laravel 세계의 영향을 많이 받는다.
이 강좌에 source code 다운로드할 수 있거나 기본적인 Adonis JS 프로젝트를 설정할 수 있다고 가정합니다.

AWS 활동 작성


우리의 예는 단지 시범일 뿐, 활동 절차가 필요하다.웹 폼에서 데이터를 보내고 AWS 상태기에 추가하는 방법을 보여 주고 이 상태기가 대기열을 충당하는 것이 목표입니다.그 다음에 소비 프로그램은 대기열에 있는 정보를 얻고 발견된 내용을 컨트롤러에 출력합니다.
Activities는 상태기 중의 일꾼의 작은 임무이다.
우리의 활동을 다음과 같이 부르자.DemoWorkerActivity

상태기 만들기


ARN이 활성화되면 다음과 같은 상태기 문서를 만들 수 있습니다.여기에는 한 단계만 있기 때문에 이 단계를 "DemoWorkerRun"이라고 부릅니다.이 단계의 내부는 개별 활동 "DemoWorker Activity"입니다.
{
    "Comment": "Demo State Machine - to show how my application interacts with the queue",
    "StartAt": "DemoWorkerRun",
    "States": {
        "DemoWorkerRun": {
            "Type": "Task",
            "Resource": "arn:aws:states:us-east-1:XXXXXXXXXX:activity:DemoWorkerActivity",
            "End": true
        }
    }
}
상태기를 작성하면 AWS에서 리소스 ARN을 제공합니다.
이 예에서 상태 식별자는 다음과 같습니다.
“arn:aws:states:us-east-1:xxxxxxxxx:stateMachine:DemoWorkerStateMachine”

핵심 노드 구성 요소:

  • Queue Service - 이 서비스는 초기 유효 로드가 있는 상태기의 "실행"을 시작합니다.
  • 데모워커 - 이 일꾼은 상태기에서 활동하는 소비자를 충당할 것이다.그것은 유효 부하와 하부 응용 프로그램 간의 접촉점이다.
  • 대기 서비스


    저희 adonis 프로젝트에서 서비스 폴더를 만들고 app/서비스/Queue 서비스를 만들 것입니다.js 클래스.이것은 초기 사용자 정의 부하 시작 상태기를 사용하여 실행됩니다.이런 요구 사항은awssdk를 설치해야 합니다.adonis 도구를 사용하여 설치할 수 있습니다.adonis install aws-sdk
    
    'use strict'
    const AWS = require('aws-sdk')
    const Env = use('Env')
    
    class QueueService {
      /**
       * Returns result of StepFunctions.startExecution
       * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/StepFunctions.html#startExecution-property
       */
      async enqueue (name, payload) {
        const awsConfig = new AWS.Config({
          accessKeyId: Env.get('AWS_ACCESS_KEY'),
          secretAccessKey: Env.get('AWS_SECRET_KEY'),
          region: Env.get('AWS_REGION')
        })
    
        // Initialize the AWS SDK 
        const StepFunctions = new AWS.StepFunctions(awsConfig)
    
        // Executing the State Machine requires a custom name, some custom input and the ID of the State Machine from AWS
        var params = {
          name: name,
          input: JSON.stringify(payload),
          stateMachineArn: Env.get('AWS_STATEMACHINE_ARN')
        }
    
        // Execute StepFunction
        // @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/StepFunctions.html#startExecution-property
        let result = null
        try {
          result = await StepFunctions.startExecution(params).promise()
        } catch (e) {
          console.log('Error:', e)
        }
    
        return result
      }
    }
    module.exports = QueueService
    
    

    인구 노동자.js


    새 폴더 app\Workers를 만들고 DemoWorker를 추가합니다.js.상태기에서 마운트된 작업을 사용합니다.npm 모듈 "step function worker"필요
    adonis 프로젝트에 설치하려면 다음과 같이 하십시오.adonis install step-function-worker
    'use strict'
    
    const StepFunctionWorker = require('step-function-worker')
    const AWS = require('aws-sdk')
    const Env = use('Env')
    const Logger = use('Logger')
    
    /*
    |--------------------------------------------------------------------------
    | DemoWorker
    |--------------------------------------------------------------------------
    | @see https://github.com/piercus/step-function-worker
    |
    | For this class to work, a StepFunction activity must first be configured on AWS
    */
    
    class DemoWorker extends StepFunctionWorker {
      constructor () {
        const options = {}
    
        // Configure the connection to AWS
        options.awsConfig = new AWS.Config({
          accessKeyId: Env.get('AWS_ACCESS_KEY'),
          secretAccessKey: Env.get('AWS_SECRET_KEY'),
          region: Env.get('AWS_REGION')
        })
    
        // Function that interacts directly with the AWS StepFunction this must be defined
        // The call back is responsible for letting the State Machine know it can either
        // continue to the next step in execution or fail
        options.fn = async (input, cb, heartbeat) => {
          // Respond to StepFunction state machine
          Logger.info('Custom Worker function:', input)
          cb(null, input)
        }
    
        // the ID of the Step Function Activity arn:aws:states:us-east-1:XXXXXXXXXXXXX:activity:DemoWorkerActivity
        options.activityArn = Env.get('AWS_ACTIVITY_ARN_DEMOWORKERACTIVITY')
    
        super(options)
        this._initCallbacks()
      }
    
      _initCallbacks () {
        this.on('task', this.task)
        this.on('ready', this.ready)
        this.on('error', this.error)
        this.on('failure', this.failure)
        this.on('success', this.success)
      }
    
      /**
       * Called when the worker "wakes up"
       * The StepFunctionWorker parent class will pass in the payload
       * @param {*} task
       */
      task (task) {
        // task.input contains the payload from the web
        Logger.info('DemoWorker task:', task.input)
      }
    
      ready () {
        Logger.info('DemoWorker is ready')
      }
    
      failure (failure) {
        Logger.info('DemoWorker failure:', failure)
      }
    
      success (output) {
        // output.input will contain the payload from the web
        Logger.info('DemoWorker success:', output.input)
      }
    
      error (err) {
        Logger.info('DemoWorker error:', err)
      }
    }
    
    module.exports = DemoWorker
    

    프레젠테이션 시간


    나는 먼저 우리의 시범으로 뛰어들었다.상태기가 실행하는 이름을 입력하는 폼을 만들 것입니다.실행 작업에 지정된 이름을 사용자 정의할 수 있습니다.프로젝트에서 대기열 작업 상태를 유지하는 MongoDB 기록을 담당하는 ObjectID를 사용했습니다.명명약정을 사용하면 실행 대상을 시스템에서 유효한 부하를 초기화하는 대상으로 거슬러 올라가 시스템 절차를 더욱 쉽게 따를 수 있습니다.
    adonis 프로젝트를 시작하겠습니다.adonis serve --dev지금 액세스할 수 있음http://localhost:3333
    다음 테이블이 있습니다.

    폼을 제출한 후 줄을 서 있는 상태 함수가 작업을 수행하는 것을 보여 줍니다.

    이제 사용자 정의 활동이 실행되는지 모니터링하기 위해 DemoWorker를 시작해야 합니다.adonis stepfunctionworker --name=DemoWorkerDemoWorker가 시작되면 중단된 실행 작업이 상태 함수 대기열에서 꺼집니다.

    컨디셔너를 다시 한 번 보고 실행이 성공적으로 끝났는지 봅시다.

    완성!우리는 AWS 상태기를 만드는 목표를 달성했고 사용자 정의 프로그램을 시작하여 소형이지만 완전한 작업을 완성했다.
    소스 코드: https://github.com/openstepmedia/adonisjs-stepfunction-demo

    좋은 웹페이지 즐겨찾기