クラウド関数


Googleは、Googleクラウド機能の第二世代のベータ版をリリースしました.まだGoogleクラウド機能に慣れていない人のために私の記事を読むことができますQuarkus and Google Cloud Functions .
この2番目の世代がもたらす:
  • より長い最大処理時間:10 mnの代わりに60 mn.
  • 8 GB/4 VCPUの代わりに16 GB/4 VCPUまでのインスタンス.
  • インスタンスが常に利用できる能力.
  • より良い同時実行管理:インスタンスごとに最大1000同時呼び出し.
  • EventArcを介してCloudEventsサポート:90以上のイベントをご利用いただけます.
  • クラウド関数gen 2のすべての新機能が利用可能ですhere .
    ケーキの上のアイシング、Qualkusは、彼らのためにすでに準備ができています!私は個人的なAlphaバージョンにアクセスしたので、私はすでにQualkus拡張モジュール互換性を作りました.
    この記事では、2つの点について話します.

    展開と最初の呼び出し


    まず、第1世代と第2世代のランタイムで同じ機能を展開しましょう.Google Cloud機能のためのQualkus拡張統合テストからHTTP機能を使用しますhere .
    まず第一に、機能をパッケージ化するmvn clean package . Qualkusは、その中のOn Jarを生成しますtarget/deployment ディレクトリを使用して関数を展開します.
    関数を最初のGenランタイムに配備するには、次の手順に従います
    gcloud functions deploy quarkus-example-http-v1 \
        --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \
        --runtime=java11 --trigger-http \
        --source=target/deployment
    
    ビルドは、クラウドビルドを介して行われ、約22秒かかります.展開の後、curl経由で関数への最初の呼び出しを行います.
    D      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.446  Function execution took 277 ms, finished with status code: 200
    D      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.169  Function execution started
           quarkus-example-http-v1                2022-03-22 17:31:38.441  2022-03-22 17:31:38.441:INFO:oejs.Server:main: Started @1476ms
    [...]
    I      quarkus-example-http-v1                2022-03-22 17:31:38.339  Installed features: [cdi, google-cloud-functions]
    I      quarkus-example-http-v1                2022-03-22 17:31:38.339  Profile prod activated.
    I      quarkus-example-http-v1                2022-03-22 17:31:38.338  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 0.690s.
    I      quarkus-example-http-v1                2022-03-22 17:31:38.266  JBoss Threads version 3.4.2.Final
           quarkus-example-http-v1                2022-03-22 17:31:37.431  2022-03-22 17:31:37.430:INFO::main: Logging initialized @457ms to org.eclipse.jetty.util.log.StdErrLog
           quarkus-example-http-v1                2022-03-22 17:31:36.969  Picked up JAVA_TOOL_OPTIONS: -XX:MaxRAM=256m -XX:MaxRAMPercentage=70
    
    この関数はクォーツを開始するために0.7 sを含む1.5 sで起動することに注意してください.最初の呼び出しは277 msでした.
    第2世代のランタイムで同じ機能を展開します.
    gcloud beta functions deploy quarkus-example-http-v2  \
        --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \
        --runtime=java11 --trigger-http \
        --source=target/deployment --gen2
    
    ビルドは、クラウドビルドを介して行われ、約25秒かかります.配備の後、私はカールを通して機能に最初の呼び出しをします、そして、私はすぐに、呼び出しが非常に非常に長いことに気がつきます!私は関数の起動時間と最初の呼び出しの時間を見るためにそのログにアクセスします.
    I      quarkus-example-http-v2  2022-03-22 17:38:44.464
           quarkus-example-http-v2  2022-03-22 17:38:43.041  2022-03-22 17:38:43.041:INFO:oejs.Server:main: Started @14069ms
    [...]
    I      quarkus-example-http-v2  2022-03-22 17:38:41.943  Installed features: [cdi, google-cloud-functions]
    I      quarkus-example-http-v2  2022-03-22 17:38:41.943  Profile prod activated.
    I      quarkus-example-http-v2  2022-03-22 17:38:41.942  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 7.283s.
    I      quarkus-example-http-v2  2022-03-22 17:38:41.343  JBoss Threads version 3.4.2.Final
    ----> OTHER STARTING LOGS <-------
    
    いくつかの観測:スタートアップ時間ははるかに長い、クォーカスのための7 sを含む約14秒、私たちは同じ比率起動ランタイム対クォーター1つしかし10倍以上見つける!また、展開が別の関数の起動をトリガーした直後にコールされます.連続した呼び出しはずっと速くなるでしょう.
    第1世代と第2世代の間には非常に異なる行動があり、調査の対象についてGoogleチームに連絡します.

    より良い並行性


    並行処理を比較するために、ツールで重い負荷をシミュレートしますwrk 両方の実行時.
    それぞれのランタイムでは、2つの連続したテストを行います.
    wrk -c 100 -t 10 -d 60 --latency https://my-function-host/quarkus-example-http-v1
    wrk -c 200 -t 20 -d 300 --latency https://my-function-host/quarkus-example-http-v1
    
    最初のGenランタイムの結果は以下の通りです.
      10 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   144.47ms  111.63ms   2.00s    97.54%
        Req/Sec    69.62     17.30   101.00     64.76%
      Latency Distribution
         50%  123.09ms
         75%  129.64ms
         90%  174.37ms
         99%  601.22ms
      40755 requests in 1.00m, 16.36MB read
      Socket errors: connect 0, read 0, write 0, timeout 175
    Requests/sec:    678.27
    Transfer/sec:    278.89KB
    
    
      20 threads and 200 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   126.24ms   31.54ms   1.92s    93.47%
        Req/Sec    79.79     13.07   101.00     76.19%
      Latency Distribution
         50%  118.99ms
         75%  122.78ms
         90%  138.27ms
         99%  224.09ms
      477829 requests in 5.00m, 191.86MB read
      Socket errors: connect 0, read 0, write 0, timeout 30
      Non-2xx or 3xx responses: 20
    Requests/sec:   1592.29
    Transfer/sec:    654.69KB
    
    そして、ここでは、第2世代のランタイムの結果です
      10 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   138.16ms   63.56ms   1.95s    95.26%
        Req/Sec    65.04     23.10   101.00     63.66%
      Latency Distribution
         50%  119.94ms
         75%  140.14ms
         90%  190.22ms
         99%  230.52ms
      27713 requests in 1.00m, 8.72MB read
      Socket errors: connect 0, read 0, write 0, timeout 169
      Non-2xx or 3xx responses: 64
    Requests/sec:    461.20
    Transfer/sec:    148.58KB
    
    
      20 threads and 200 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   125.02ms   30.51ms   1.98s    92.59%
        Req/Sec    79.25     14.82   101.00     71.28%
      Latency Distribution
         50%  117.89ms
         75%  120.57ms
         90%  136.77ms
         99%  210.77ms
      474727 requests in 5.00m, 148.95MB read
      Socket errors: connect 0, read 0, write 0, timeout 79
      Non-2xx or 3xx responses: 38
    Requests/sec:   1581.91
    Transfer/sec:    508.26KB
    
    平均性能は2回の走行時間に対して類似しており、第2世代に対してわずかに低い平均時間を持つ.99 %のレイテンシ(テールレイテンシ)で詳細に見ると、特に第1の負荷試験(230 ms対601 ms)の間に、より低いレイテンシを有する第2世代に対するより顕著な違いがあることに気づく.私たちは明らかに第2のGen関数のために増加した同時性の関心を見ることができます:インスタンスごとに処理されたより多くの要求は、より少ない機能スタートアップ、したがって、より少ないコールドスタートに等しいです.
    Googleクラウドコンソールを介して起動されたインスタンスの数を見ることによって、これを検証することができます.そして、第1世代(65から70のインスタンス対140~200のインスタンス)のように、第2世代で多くのインスタンスが開始されていることがわかります.
    第1のgen - nbインスタンス
    第2のgen - nbインスタンス

    雲の穴


    最もエキサイティングな第2世代の機能の一つは、クラウドイベントタイプの機能を作成する機能です.これらは、独自のGoogleクラウド形式でイベントを受け取る代わりに、Cloud Events specification .
    以下は、ストレージのイベントを受信し、独自のGoogleクラウドイベントを使用しているクラウド関数の例ですそれは、所有者を使用するバックグラウンド機能ですStorageEvent イベントオブジェクト
    public class BackgroundFunctionStorageTest 
        implements BackgroundFunction<StorageEvent> {
    
        @Override
        public void accept(StorageEvent event, Context context) 
                throws Exception {
            System.out.println("Receive event on file: " + event.name);
        }
    
        public static class StorageEvent {
            public String name;
        }
    }
    
    この関数を展開して、Qualkus Helloバケットのイベントを聞いてください.次のコマンドを使用できます.
    gcloud functions deploy quarkus-example-storage \
        --entry-point=com.example.BackgroundFunctionStorageTest \
        --trigger-resource quarkus-hello \
        --trigger-event google.storage.object.finalize \
        --runtime=java11 --source=target/deployment
    
    以下はクラウド関数の例です.を提供するJava Cloudeventsライブラリを使用しますCloudEvent 対象:
    public class CloudEventStorageTest implements CloudEventsFunction {
    
        @Override
        public void accept(CloudEvent cloudEvent) throws Exception {
            System.out.println("Receive event Id: " + cloudEvent.getId());
            System.out.println("Receive event Subject: " + cloudEvent.getSubject());
            System.out.println("Receive event Type: " + cloudEvent.getType());
            System.out.println("Receive event Data: " + new String(cloudEvent.getData().toBytes()));
        }
    }
    
    この関数の展開時に、バケツを指定することでトリガーがストレージ型イベントになることを指定します.
    gcloud beta functions deploy quarkus-example-cloud-event \
      --gen2 \
      --entry-point=com.example.CloudEventsFunctionStoragetTest \
      --runtime=java11 --trigger-bucket=example-cloud-event \
      --source=target/deployment
    
    ストレージイベントの内容はdata Cloudeventオブジェクトの属性.

    結論


    第2世代がまだプレビューにあるとしても、パフォーマンスとコールドスタートだけで提供される利点は、それを使い始める価値があります(多くの時間がかかる第1の機能起動の問題を解決していなくても).
    さらに、CloudeEvents標準のサポートは、Googleクラウドに依存しない機能を記述することができ、他のクラウドや他のテクノロジ(Kafka Broker、HTTPクライアント、…)でサポートされている形式を使用することができます.