Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraalVM Native Imageが 見せた未来/graalvm-native-image showed the future

GraalVM Native Imageが 見せた未来/graalvm-native-image showed the future

Hiroki Matsumoto

November 09, 2019
Tweet

More Decks by Hiroki Matsumoto

Other Decks in Technology

Transcript

  1. 自己紹介 松本 宏紀 ( まつもと ひろき ) • 株式会社ブロードリーフ 基盤開発部

    チーフ・アーキテクト • Kubernetes Sapporo for Beginners主催者。 • オフショアラボ・チームリーダー • デブサミ2019「Spring Bootでマイクロサービス作って苦労したお話」登壇 • Google Cloud Next ‘19 in Tokyo 「大規模エンタープライズ システムをマイクロ サービスで刷新。そ の開発プロセス再定義まで道のり」登壇 Twitter :@hirokimatsumo13
  2. Cassandra Elasticsearch Kafka + Zookeeper ( broker ) Kafka Publisher

    ( Cassandra Trigger) Kafka Consumer データの蓄積 データの変更イベント配信 データの変更イベント管理 データの変更イベント受信 データの柔軟検索 背景
  3. 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
  4. 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
  5. 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/
  6. 開発 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を利用。
  7. 開発 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
  8. 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は未サポートだったりトライ&エラーがまだ 必要な段階。
  9. 壁の向こう側 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なので調整すればスループットは上がる。