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

ScalaとGraalVM

Fda899b3499ba4d6b2dbc763b3923759?s=47 s_edward
September 15, 2020

 ScalaとGraalVM

Scala関西での発表資料です

Fda899b3499ba4d6b2dbc763b3923759?s=128

s_edward

September 15, 2020
Tweet

Transcript

  1. ScalaとGraalVM 2020-09-15 Shigeki Shoji

  2. 自己紹介 Consultant, Mamezou. 2

  3. テーマ • AWS LambdaをGraalVMネイティブにするときに気をつけること • GraalVMをサポートするQuarkusについて 3

  4. AWS Lambdaの課題 • https://www.infoq.com/articles/tracing-aws-lambda-functions/ ◦ cold start 4

  5. GraalVMって何? https://www.graalvm.org/ • Increase application throughput and reduce latency. •

    Compile applications into small self-contained native binaries. • Seamlessly use multiple languages and libraries. 5
  6. 制限 https://www.graalvm.org/reference-manual/native-image/Limitations/ • Dynamic Class Loading • Reflection • Dynamic

    Proxy • JCA (Java Cryptography Architecture) • JNI (Java Native Interface) 6
  7. Features Incompatible with Closed-World Optimization • invokedynamic Bytecode and Method

    Handles • Serialization • Security Manager 7
  8. GraalVMでScalaは使えるのか? https://www.graalvm.org/reference-manual/jvm/ 8

  9. GraalVMをサポートするフレームワーク • Quarkus - https://quarkus.io/ ◦ CDI • Micronaut -

    https://micronaut.io/ 9
  10. Quarkus 10 Source: https://quarkus.io/

  11. Building a Native Executable • Scala コードは、sbt を使って、jar にパッケージングし、Maven のローカルリポジト

    リに publish ◦ sbt の publishLocal では .ivy2 にデプロイされるので publishM2 を使う $ sbt publishM2 • 次に Quarkus の pom.xml で上記 jar を依存関係に含めて、次のコマンドで、ネイ ティブイメージにパッケージング $ mvn package -Pnative -Dquarkus.native.container-build=true 11
  12. ScalaとJDKのバージョンの関係 https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html 12 JDK version Minimum Scala versions 13, 14

    2.13.2, 2.12.11 12 2.13.1, 2.12.9 11 2.13.0, 2.12.4, 2.11.12 8 2.13.0, 2.12.0, 2.11.0, 2.10.2 6, 7 2.11.0, 2.10.0
  13. HTTPS(SSL/TLS) AWSサービス等のAPIは、HTTPSを通して通信する。JVMもネイティブ化されたバイナ リイメージも、HTTPS通信では、OSにバンドルされたネイティブライブラリが使用され る。 APIs as AWS cloud services communicate

    over https. The JVM uses the native library bundled with the OS for this communication. 13
  14. docker-compose.ymlとsslsupport.sh 14 #!/bin/sh mkdir -p target/ssl-libs/lib cp $GRAALVM_HOME/lib/security/cacerts target/ssl-libs cp

    $GRAALVM_HOME/lib/libsunec.so target/ssl-libs/lib/ version: '3.1' services: builder: image: oracle/graalvm-ce:19.3.1-java11 volumes: - '.:/work' working_dir: /work command: ./sslsupport.sh environment: GRAALVM_HOME: /opt/graalvm-ce-java11-19.3.1
  15. serverless.yml 15 layers: sslLibs: path: target/ssl-libs

  16. Reflection Jackson Library 16 import io.quarkus.runtime.annotations.RegisterForReflection; import java.io.Serializable; import java.nio.charset.StandardCharsets;

    import java.util.Base64; @RegisterForReflection public class InputObject implements Serializable {
  17. Quarkus DI beans.xml - https://quarkus.io/guides/cdi-reference <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee

    http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"> </beans> 17
  18. Configurations https://quarkus.io/guides/writing-native-applications-tips • proxy-config.json • reflection-config.json • resources-config.json 18

  19. proxy-config.json [ [ "org.apache.http.conn.HttpClientConnectionManager", "org.apache.http.pool.ConnPoolControl", "com.amazonaws.http.conn.Wrapped" ] ] 19

  20. reflection-config.json See https://quarkus.io/guides/writing-native-applications-tips 20

  21. resources-config.json { "resources": [ { "pattern": ".*\\.properties$" }, { "pattern":

    ".*\\.yml$" }, { "pattern": "com/amazonaws/partitions/endpoints.json" } ] } 21
  22. invokedynamic Bytecode and Method Handles Scalaの部分関数やラムダ式を、Java 8をターゲットにコンパイルするとこの制限にかか る場合がある。 “Note that

    invokedynamic use cases generated by javac for, e.g., Java lambda expressions and string concatenation are supported because they do not change called methods at image run time.” • invokedynamic - Java 7 • method handler - Java 7 22
  23. まとめ • HTTPS通信のために、Lambda Layerを使う • GraalVMネイティブの制限にかかる場合は、Java 6 をターゲットにできる Scala 2.11.x

    を使う(注: ただし、2.12.10 でもターゲットを jvm-1.6 指定できてる) 23
  24. ありがとうございました 24