Slide 1

Slide 1 text

GraalVM Native Imageが 見せた未来

Slide 2

Slide 2 text

自己紹介 松本 宏紀 ( まつもと ひろき ) ● 株式会社ブロードリーフ 基盤開発部 チーフ・アーキテクト ● Kubernetes Sapporo for Beginners主催者。 ● オフショアラボ・チームリーダー ● デブサミ2019「Spring Bootでマイクロサービス作って苦労したお話」登壇 ● Google Cloud Next ‘19 in Tokyo 「大規模エンタープライズ システムをマイクロ サービスで刷新。そ の開発プロセス再定義まで道のり」登壇 Twitter :@hirokimatsumo13

Slide 3

Slide 3 text

GraalVM Native Imageで、 CPU、Memoryリソースの割当てを削減できる Javaでも小さな・疎結合なサービスを 開発しやすくなる。

Slide 4

Slide 4 text

Cassandra Elasticsearch Kafka + Zookeeper ( broker ) Kafka Publisher ( Cassandra Trigger) Kafka Consumer データの蓄積 データの変更イベント配信 データの変更イベント管理 データの変更イベント受信 データの柔軟検索 背景

Slide 5

Slide 5 text

Cassandra Elasticsearch Kafka + Zookeeper ( broker ) Kafka Publisher ( Cassandra Trigger) Kafka Consumer 背景 CPU: 500m、 Mem:1Gi CPU: 500m、 Mem:1.2Gi CPU: 300m、 Mem:300Mi CPU: 500m、 Mem:900Mi データの蓄積 データの変更イベント配信 データの変更イベント管理 データの変更イベント受信 データの柔軟検索 合計 = CPU: 1,800m、Mem: 3.4Gi

Slide 6

Slide 6 text

Cassandra Elasticsearch Kafka + Zookeeper ( broker ) Kafka Publisher ( Cassandra Trigger) Kafka Consumer 背景 Kafka Consumer Elasticsearch Kafka Consumer Google Cloud Storage Kafka Consumer Web API データの利用用途が増えて5つconsumerが増える。 Kafka Consumer Web API

Slide 7

Slide 7 text

ローカルPCで動かすの辛くなる。 バックグラウンドの仕組みだけで、 CPU: 3,000m、Mem: 4.3Gi必要になる。 (一番メモリ使っているのはChromeだけど…)

Slide 8

Slide 8 text

Javaで頑張りたい

Slide 9

Slide 9 text

GraalVM LLVMベースの言語(Java、JavaScript、Ruby、Python…)の多言語をサポー トする仮想マシン。 GraalVM Native Imageは、JVMベースの言語(Java、Scala、Kotlin)を、ス タンドアロンの実行可能ファイルにコンパイルするもの。 JavaVMの実行環境が不要。

Slide 10

Slide 10 text

Quarkus KubernetesネイティブなGraalVM & OpenJDKで動作するJava Framework。 Quarkus + GraalVM Quarkus + OpenJDK Traditional Cloud Native Stack Memory(RSS) Usage 13MB 74MB 140MB Boot Time 0.014sec 0.75sec 2.5Sec 参考:https://quarkus.io/

Slide 11

Slide 11 text

GraalVM+Quarkusで 快適Javaライフを試してみる。

Slide 12

Slide 12 text

開発 Quarkusのmavenプロジェクト雛形生成。 $ mvn io.quarkus:quarkus-maven-plugin:0.21.2:create \ -DprojectGroupId=${groupId} \ -DprojectArtifactId=${artifactId} $

Slide 13

Slide 13 text

開発 Elasticsearch、kafka周りの拡張のライブラリを追加。 …Elasticsearch周りが無い。 とりあえず、Elasticsearchの公式Java ライブラリをdependencyに追加する。 # Quarkus拡張ライブラリ一覧確認 $ mvn quarkus:list-extensions # Kafkaのライブラリ追加。 $ mvn quarkus:add-extension -Dextensions="quarkus-kafka-client" # pom.xmlに直接 elasticsearch-rest-high-level-clientを追加。 Reactive(MicroProfile) な方のKafkaは、 複数件の一括処理ができないので、通常の kafkaを利用。

Slide 14

Slide 14 text

開発 VSCodeでごにょごにょ開発する・・・。

Slide 15

Slide 15 text

開発 JavaVM上で動作確認をする。 $ mvn compile quarkus:dev

Slide 16

Slide 16 text

開発 Native Imageを作って動作確認する。 …動かない。 $ ./mvnw clean package -U -Pnative -Dnative-image.docker-build=false $ docker build -f src/main/docker/Dockerfile.native -t $DOCKER_IMAGE . $ docker run -i --rm $DOCKER_IMAGE

Slide 17

Slide 17 text

Native Imageへの壁 参考:https://quarkus.io/guides/writing-native-applications-tips#native-in-extension ○ データクラスに、@RegisterForReflectionをつける。 ObjectMapper#readValue(in,XXX.class)でエラーになる。 ○ 3rd Partyライブラリが結構動かない。必要に応じてSubstituteで書き換えが必要。 Elasticsearchもquarkus-elasticsearch-rest-client利用した。 ○ native imageビルドする際、staticオプションをつけてもlibc周りは必要。 scratchでは動かず。100MB程度のdocker image sizeになる。 ○ Windows環境だとnative-image build on dockerが終わらない。 Linux環境化でもnative-imageのビルド時間:4分程度。 ○ ObjectOutputStream/ObjectInputStreamは未サポートだったりトライ&エラーがまだ 必要な段階。

Slide 18

Slide 18 text

壁の向こう側 Quarkus + GraalVM Spring Boot + OpenJDK Deployments Memory Limit 70MB 300MB Boot Time + Warm up 15秒 5分 Throughput 25.4 message/sec 27.0 message/sec Kubernetes DeploymentsでCPU:limit = 100msの場合。 ※Warm up…Elasticsearch index定義のjsonファイル400個の読み込み + kafkaへの接続。 ※kafkaの1messageのサイズは平均5KB。pollするmax sizeが10なので調整すればスループットは上がる。

Slide 19

Slide 19 text

ローカルPCで動かすの辛くなる。 バックグラウンドの仕組みだけで、 CPU: 3,000m、Mem: 4.3Gi CPU: 1,900m、Mem: 3.5Gi 必要になる。 ( ちょっと軽減された ☺ )

Slide 20

Slide 20 text

多くの分散サービスをJavaで開発している場 合、インフラコストを大幅に削減できる未来 を垣間見る事ができた。

Slide 21

Slide 21 text

ご静聴ありがとうございました。