クラウド関数
12470 ワード
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 .
まず第一に、機能をパッケージ化する
関数を最初のGenランタイムに配備するには、次の手順に従います
第2世代のランタイムで同じ機能を展開します.
第1世代と第2世代の間には非常に異なる行動があり、調査の対象についてGoogleチームに連絡します.
並行処理を比較するために、ツールで重い負荷をシミュレートしますwrk 両方の実行時.
それぞれのランタイムでは、2つの連続したテストを行います.
Googleクラウドコンソールを介して起動されたインスタンスの数を見ることによって、これを検証することができます.そして、第1世代(65から70のインスタンス対140~200のインスタンス)のように、第2世代で多くのインスタンスが開始されていることがわかります.
第1のgen - nbインスタンス
第2のgen - nbインスタンス
最もエキサイティングな第2世代の機能の一つは、クラウドイベントタイプの機能を作成する機能です.これらは、独自のGoogleクラウド形式でイベントを受け取る代わりに、Cloud Events specification .
以下は、ストレージのイベントを受信し、独自のGoogleクラウドイベントを使用しているクラウド関数の例ですそれは、所有者を使用するバックグラウンド機能です
第2世代がまだプレビューにあるとしても、パフォーマンスとコールドスタートだけで提供される利点は、それを使い始める価値があります(多くの時間がかかる第1の機能起動の問題を解決していなくても).
さらに、CloudeEvents標準のサポートは、Googleクラウドに依存しない機能を記述することができ、他のクラウドや他のテクノロジ(Kafka Broker、HTTPクライアント、…)でサポートされている形式を使用することができます.
この2番目の世代がもたらす:
ケーキの上のアイシング、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クライアント、…)でサポートされている形式を使用することができます.
Reference
この問題について(クラウド関数), 我々は、より多くの情報をここで見つけました https://dev.to/zenika/google-cloud-functions-2nd-gen-d0mテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol