GAE push 대기열의 작업 실행 속도 제어 정보

5744 단어 GAEgcpScala
GAE의 push 큐에서는 태스크 실행 레이트 제어에 「토큰 버킷 방식」을 채용하고 있다.
실제로 이용해 보면 상정대로의 동작을 해주지 않았으므로, 조사해 보았습니다.

시험 환경


  • GAE Standard Environment
  • Scala2.12

  • 토큰 버킷이란?



    네트워크에 흐르는 트래픽을 일정량 이하가 되도록 조정하는 알고리즘입니다.

    먼저 움직이기



    우선 bucket_size=5로 rate=5/m의 queue를 작성

    queue.yaml
    queue:
    - name: gae-study-push-queue
      mode: push
      rate: 5/m
      target: gae-study
      bucket_size: 5
      retry_parameters:
        task_retry_limit: 1
    
  • bucket_size : 토큰을 보유 할 수있는 최대 수
  • rate: 작업을 처리하는 빈도로, 단위는 s가 초, m이 분, h가 시간, d가 일을 나타냅니다. 예를 들어 5/m 값은 작업이 분당 5회의 속도로 처리됨을 나타냅니다
  • max_concurrent_requests : 대기열에서 동시에 실행할 수있는 최대 작업 수 (default : 1000)

  • appengine-web.xml
    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <application>XXXXXXX</application>
        <module>gae-study</module>
        <version>app001</version>
        <runtime>java8</runtime>
        <threadsafe>false</threadsafe>
        <instance-class>F1</instance-class>
        <automatic-scaling>
            <!--https://cloud.google.com/appengine/docs/standard/java/config/appref?hl=ja#scaling_elements_automatic_scaling-->
            <min-idle-instances>0</min-idle-instances>
            <max-idle-instances>1</max-idle-instances>
            <max-concurrent-requests>30</max-concurrent-requests>
            <max-pending-latency>10s</max-pending-latency>
            <min-pending-latency>4s</min-pending-latency>
        </automatic-scaling>
        <system-properties>
            <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
        </system-properties>
    </appengine-web-app>
    

    Task에서 수행하는 처리



    Hello.scala
    package com.gae.study
    
    import skinny.micro.WebApp
    
    trait Hello extends WebApp {
      get("/sayhello") {
        val key = params("key")
        val message = s"Hello, key => $key!"
    
        logger.info(message)
    
        Thread.sleep(5000) // 5秒待機
    
        message
      }
    }
    

    예상


    gae-study-push-queue에 작업을 7개 추가하면 어떻게 됩니까?
    bucket_size=5이고 rate=5/m이므로
  • 처음 1분 ​​동안 5개의 작업 처리
  • 다음 1분 동안 나머지 2개의 작업 처리

  • 따라서 전체적으로 약 1 분 정도 걸릴 전망

    실행 결과




    30秒에서 전체 처리가 완료되었습니다. . . rate=5/m인데 1분에 5건 이상 처리를 하고 있는 것은???

    처음 5건은 예상대로 13:58:47~48에서 접수되어 있으며,
    6번째는 13:58:59에 접수
    7번째는 13:59:11에 접수
    그래서 처음부터 12초 후에 6번째, 12초 후에 7번째가 접수되고 있다

    이미지적으로는 다음과 같은 느낌입니다.


    결론



    처음에는 5개의 토큰이 있으므로 1분 동안 5개 이상의 작업이 처리되는 것처럼 보입니다.
    기본적으로 rate가 5/m인 경우, 태스크는 분당 5회 rate로 처리된다.
    다만, 토큰이 보충되는 타이밍은 1분 후에 한번에 보충되는 것이 아니라, rate가 5/m이면, 60초/5=12초마다 1개씩 보충되어 간다. rate가 10/m이면, 60초/10=6초 간격으로 토큰이 1개씩 보충되어 간다고 하는 움직임이 된다.

    좋은 웹페이지 즐겨찾기