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

Faster, greener, and happier- why Quarkus should be your next tech stack

Faster, greener, and happier- why Quarkus should be your next tech stack

Java never went away, but it’s having a renaissance. After some initial teething pains on the cloud (too big, too slow, too hard to configure) a new breed of Java frameworks are changing everything. In this talk, Holly will introduce Quarkus and then delve into some of the advanced features you might not know about. She’ll cover native binaries, what makes Quarkus super-fast running on the JVM, TDD with Quarkus, and Quarkus’s carbon footprint. The talk includes some theory (what underpins Quarkus’s surprising speed?) and also live demos (does Quarkus really start faster than a light bulb? What does an integration testing flow with Quarkus look like?)

Holly Cummins

November 30, 2023
Tweet

More Decks by Holly Cummins

Other Decks in Programming

Transcript

  1. Holly Cummins
    Senior Principal Software Engineer, quarkus
    Cloud Builders Java Conf
    November 20, 2023
    @[email protected]
    faster
    greener
    happier
    why quarkus should be your
    next tech stack

    View full-size slide

  2. @holly_cummins
    #RedHat
    let’s remember how
    computers used to be

    View full-size slide

  3. @holly_cummins
    #RedHat
    let’s remember how
    computers used to be
    1832

    View full-size slide

  4. @holly_cummins
    #RedHat
    on-prem
    dedicated hardware
    long-lived processes
    2005

    View full-size slide

  5. @holly_cummins
    #RedHat
    2015
    1 local deploy 1 cup of tea

    View full-size slide

  6. @holly_cummins
    #RedHat
    2015
    “please do not make unfavourable
    tea analogies in your writing.”
    1 local deploy 1 cup of tea

    View full-size slide

  7. @holly_cummins
    #RedHat
    2022

    View full-size slide

  8. @holly_cummins
    #RedHat
    2011
    microservices

    View full-size slide

  9. @holly_cummins
    #RedHat
    2013
    containers
    (almost) change
    everything

    View full-size slide

  10. @holly_cummins
    #RedHat
    2013
    containers
    (almost) change
    everything

    View full-size slide

  11. @holly_cummins
    #RedHat
    java apps run on the
    cloud, but have they
    really adapted to cloud?

    View full-size slide

  12. @holly_cummins #RedHat
    Container platform
    um … no
    machine
    go go
    go go
    go go
    go go
    go go
    go go
    go go

    View full-size slide

  13. @holly_cummins #RedHat
    Container platform
    um … no
    machine
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js
    machine
    go go
    go go
    go go
    go go
    go go
    go go
    go go

    View full-size slide

  14. @holly_cummins #RedHat
    Container platform
    um … no
    machine
    HotSpot Heap
    HotSpot Heap
    HotSpot Heap
    HotSpot Heap
    machine
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js
    machine
    go go
    go go
    go go
    go go
    go go
    go go
    go go

    View full-size slide

  15. @holly_cummins #RedHat

    View full-size slide

  16. @holly_cummins #RedHat
    “I can’t bring up the microservices
    in my Java dev stack

    View full-size slide

  17. @holly_cummins #RedHat
    “I can’t bring up the microservices
    in my Java dev stack
    … on my brand new Apple laptop
    with a M1 chip and 64GB of RAM.”
    - fintech developer

    View full-size slide

  18. @holly_cummins
    #RedHat
    in the cloud, apps get
    started and stopped often

    View full-size slide

  19. @holly_cummins
    #RedHat
    in the cloud, apps get
    started and stopped often

    View full-size slide

  20. @holly_cummins
    #RedHat
    java servers are not very
    much like light switches

    View full-size slide

  21. @holly_cummins
    #RedHat
    java servers are not very
    much like light switches

    View full-size slide

  22. @holly_cummins
    #RedHat
    java servers are not very
    much like light switches
    (historically)

    View full-size slide

  23. uh, can we do better than that?

    View full-size slide

  24. enter … quarkus

    View full-size slide

  25. an open source
    stack to write java apps
    quarkus

    View full-size slide

  26. @holly_cummins #RedHat
    traditional cloud-native
    java stack
    traditional cloud-native
    java stack
    traditional cloud-native
    java stack
    traditional cloud-native
    java stack
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js
    node.js go
    go
    machine
    go go go
    go go go
    go go go
    go go go
    go go go
    go go
    go go
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    spoiler: we did better :)
    container orchestration
    machine machine machine
    https:/
    /developers.redhat.com/blog/2017/03/14/java-inside-docker/

    View full-size slide

  27. @holly_cummins #RedHat
    machine
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    container orchestration
    machine
    traditional cloud-native java stack
    traditional cloud-native java stack
    traditional cloud-native java stack
    traditional cloud-native java stack
    … a lot better quarkus native

    View full-size slide

  28. @holly_cummins #RedHat
    machine
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    quarkus
    container orchestration
    machine
    traditional cloud-native java stack
    traditional cloud-native java stack
    traditional cloud-native java stack
    traditional cloud-native java stack
    … a lot better quarkus native
    (but quarkus on jvm
    is also way smaller
    than traditional java)

    View full-size slide

  29. do quarkus applications start faster?
    quarkus + graalvm 0.014 Seconds
    REST
    quarkus + open jdk 0.75 Seconds
    traditional cloud-native stack 4.3 Seconds
    https://quarkus.io/blog/runtime-performance/

    View full-size slide

  30. @holly_cummins
    to the code!
    demo!

    View full-size slide

  31. @holly_cummins #RedHat
    mvn quarkus:build -Pnative
    target/code-with-quarkus-1.0.0-SNAPSHOT-runner

    View full-size slide

  32. do quarkus native applications start faster than lightbulbs?

    View full-size slide

  33. do quarkus native applications start faster than lightbulbs?
    ridiculously, yes

    View full-size slide

  34. ok but does startup time matter?

    View full-size slide

  35. ok but does startup time matter?
    fast boot time means auto-scaling works better
    more resilience to load spikes

    View full-size slide

  36. quarkus + GraalVM
    13 MB
    quarkus + OpenJDK
    74 MB
    Traditional Cloud-Native Stack
    140 MB
    rest application
    https://quarkus.io/blog/runtime-performance/
    does quarkus improve memory utilization?

    View full-size slide

  37. #Quarkus @holly_cummins

    View full-size slide

  38. #Quarkus @holly_cummins
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?

    View full-size slide

  39. #Quarkus @holly_cummins
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    uhh … are you supposed
    to shut down applications
    after using them?

    View full-size slide

  40. #Quarkus @holly_cummins
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    hey, wanna see
    quarkus?
    uhh … are you supposed
    to shut down applications
    after using them? 120 instances (!)

    View full-size slide

  41. in the cloud,
    memory footprint matters

    View full-size slide

  42. in the cloud,
    memory footprint matters

    View full-size slide

  43. do quarkus applications have higher throughput?
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  44. do quarkus applications have higher throughput?
    48 concurrent connections
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  45. do quarkus applications have higher throughput?
    48 concurrent connections
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  46. do quarkus applications have higher throughput?
    48 concurrent connections
    traditional cloud native stack 3555 req/s
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  47. do quarkus applications have higher throughput?
    48 concurrent connections
    traditional cloud native stack 3555 req/s
    quarkus on jvm 6389 req/s
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  48. @holly_cummins #RedHat
    https://medium.com/arconsis/spring-boot-vs-quarkus-part-2-jvm-runtime-performance-af45d0db116e

    View full-size slide

  49. @holly_cummins #RedHat
    https://medium.com/arconsis/spring-boot-vs-quarkus-part-2-jvm-runtime-performance-af45d0db116e
    spring boot quarkus
    response time 1901 ms 294 ms
    throughput 523 req/s 3374 req/s

    View full-size slide

  50. #Quarkus @holly_cummins
    users care (a lot)
    about response time

    View full-size slide

  51. better startup
    better footprint
    better throughput
    wait, isn’t that
    something for nothing?

    View full-size slide

  52. @holly_cummins #RedHat
    the two ways of improving performance
    •trade off one thing against another
    •eliminate waste

    View full-size slide

  53. traditional cloud native stack 3555 req/s
    quarkus on jvm 6389 req/s
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper

    View full-size slide

  54. traditional cloud native stack 3555 req/s
    quarkus on jvm 6389 req/s
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper
    a trade-off of throughput
    against footprint

    View full-size slide

  55. traditional cloud native stack 3555 req/s
    quarkus on jvm 6389 req/s
    quarkus native 3212 req/s
    https://www.redhat.com/en/resources/mi-quarkus-lab-validation-idc-analyst-paper
    no trade-off, just better :)
    a trade-off of throughput
    against footprint

    View full-size slide

  56. @holly_cummins
    #RedHat
    where the win
    comes from
    1832

    View full-size slide

  57. @holly_cummins
    #RedHat
    2010
    multiple applications share a single
    application server instance
    application re-deployed many times
    between server restarts
    application dependencies changed
    while it is running

    View full-size slide

  58. @holly_cummins
    #RedHat
    application frameworks
    optimised for dynamism

    View full-size slide

  59. @holly_cummins
    #RedHat
    application frameworks
    optimised for dynamism
    dynamism has a cost

    View full-size slide

  60. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  61. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  62. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  63. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  64. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  65. @holly_cummins #RedHat
    cloud apps
    are immutable
    now

    View full-size slide

  66. @holly_cummins
    #RedHat
    a highly dynamic
    runtime in a container
    is pointless

    View full-size slide

  67. @holly_cummins
    #RedHat
    a highly dynamic
    runtime in a container
    is pointless
    loading classes that aren’t needed

    View full-size slide

  68. @holly_cummins
    #RedHat
    a highly dynamic
    runtime in a container
    is pointless
    loading classes that aren’t needed
    expensive, slow, reflection

    View full-size slide

  69. @holly_cummins
    #RedHat
    a highly dynamic
    runtime in a container
    is pointless
    loading classes that aren’t needed
    expensive, slow, reflection
    the same initialisation on every startup

    View full-size slide

  70. @holly_cummins #RedHat
    how does a framework start?
    @
    @
    >
    packaging
    (maven, gradle…)
    build time
    runtime

    View full-size slide

  71. @holly_cummins #RedHat
    @
    @
    >
    load and parse config files,
    properties, yaml, xml, etc.
    build time
    runtime
    how does a framework start?

    View full-size slide

  72. @holly_cummins #RedHat
    @
    @
    >
    • classpath scanning and
    annotation discovery
    • attempt to load class to
    enable/disable features
    build time
    runtime
    how does a framework start?

    View full-size slide

  73. @holly_cummins #RedHat
    @
    @
    >
    build a metamodel
    of the world
    build time
    runtime
    how does a framework start?

    View full-size slide

  74. @holly_cummins #RedHat
    @
    @
    >
    start thread pools,
    I/O, etc.
    build time
    runtime
    how does a framework start?

    View full-size slide

  75. @holly_cummins #RedHat
    what if we initialize at build time?

    View full-size slide

  76. @holly_cummins #RedHat
    @
    @
    >
    build time
    what if we initialize at build time?

    View full-size slide

  77. @holly_cummins #RedHat
    @
    @
    >
    runtime
    build time
    what if we initialize at build time?

    View full-size slide

  78. @holly_cummins #RedHat
    quarkus makes a
    “closed-world” assumption

    View full-size slide

  79. @holly_cummins #RedHat
    the quarkus way enables native compilation
    native
    (graalvm)
    @
    @
    >
    jvm
    build time

    View full-size slide

  80. ok but is performance all there is?

    View full-size slide

  81. ok but is performance all there is?
    developer joy

    View full-size slide

  82. @holly_cummins #RedHat

    View full-size slide

  83. @
    @
    >
    doing more up-front enables better devex
    @
    @
    >
    build time
    runtime
    runtime
    build time

    View full-size slide

  84. @
    @
    >
    doing more up-front enables better devex
    @
    @
    >
    build time
    runtime
    runtime
    build time
    we can do cool code introspections
    here that would be too expensive and
    annoying to do at runtime

    View full-size slide

  85. to the code!
    @holly_cummins #RedHat

    View full-size slide

  86. @holly_cummins
    #RedHat
    mvn quarkus:dev
    zero-config live coding

    View full-size slide

  87. @holly_cummins
    #RedHat
    tests are run on every code change
    “reverse code coverage” means only relevant tests run
    mvn quarkus:dev
    continuous testing

    View full-size slide

  88. @holly_cummins
    #RedHat
    developer UI

    View full-size slide

  89. @holly_cummins
    #RedHat
    zero-config testcontainers

    View full-size slide

  90. @holly_cummins #RedHat
    testcontainers integration … without quarkus
    @TestConfiguration(proxyBeanMethods = false)
    public class ContainersConfig {
    @Bean
    @ServiceConnection
    public PostgreSQLContainer> postgres() {
    return new PostgreSQLContainer<>(DockerImageName.parse("postgres:14"));
    }
    }
    public class TestApplication {
    public static void main(String[] args) {
    SpringApplication
    .from(MySpringDataApplication::main)
    .with(ContainersConfig.class)
    .run(args);
    }
    }
    @Import(ContainersConfig.class)

    View full-size slide

  91. @holly_cummins #RedHat
    testcontainers integration … without quarkus

    View full-size slide

  92. @holly_cummins #RedHat
    zero-config testcontainers integration
    the only thing you need to do to make
    testcontainers work is not configure anything
    # configure your datasource
    quarkus.datasource.db-kind = postgresql
    quarkus.datasource.username = sarah
    quarkus.datasource.password = connor
    quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/mydatabase
    # drop and create the database at startup
    quarkus.hibernate-orm.database.generation = drop-and-create

    View full-size slide

  93. @holly_cummins #RedHat
    zero-config testcontainers integration
    the only thing you need to do to make
    testcontainers work is not configure anything
    # drop and create the database at startup
    quarkus.hibernate-orm.database.generation = drop-and-create

    View full-size slide

  94. @holly_cummins #RedHat
    zero-config testcontainers integration
    the only thing you need to do to make
    testcontainers work is not configure anything

    View full-size slide

  95. @holly_cummins #RedHat
    zero-config testcontainers integration
    the only thing you need to do to make
    testcontainers work is not configure anything
    quarkus also auto-invokes flyway and liquibase

    View full-size slide

  96. @holly_cummins #RedHat
    zero-config testcontainers integration
    realistically, use profiles so things work in
    production :)
    # configure your datasource
    %prod.quarkus.datasource.db-kind = postgresql
    %prod.quarkus.datasource.username = sarah
    %prod.quarkus.datasource.password = connor
    %prod.quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/mydatabase
    # on real databases, defaults to ‘none’, but let’s validate
    %prod.quarkus.hibernate-orm.database.generation = validate

    View full-size slide

  97. @holly_cummins
    #RedHat
    • databases
    • redis
    • keycloak
    • kafka
    • elasticsearch
    • kubernetes
    • … or add your own
    auto-provision services
    “dev services”
    using testcontainers under the hood

    View full-size slide

  98. @holly_cummins
    #RedHat
    more opinions, less boilerplate

    View full-size slide

  99. @holly_cummins
    #RedHat
    package com.example;
    import org.jboss.logging.Logger;
    public class MyService {
    private static final Logger log = Logger.getLogger(MyService.class);
    public void doSomething() {
    log.info("It works!");
    }
    }
    example: logging

    View full-size slide

  100. @holly_cummins
    #RedHat
    package com.example;
    import org.jboss.logging.Logger;
    public class MyService {
    private static final Logger log = Logger.getLogger(MyService.class);
    public void doSomething() {
    log.info("It works!");
    }
    }
    example: logging
    import io.quarkus.logging.Log;
    Log

    View full-size slide

  101. @holly_cummins
    #RedHat
    example: query parameters
    public String hello(@QueryParam("name") String name) {

    View full-size slide

  102. @holly_cummins
    #RedHat
    example: query parameters
    public String hello(@RestQuery String name) {

    View full-size slide

  103. @holly_cummins
    #RedHat
    package org.acme;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class SpringDemo {
    public static void main(String[] args) {
    SpringApplication.run(SpringDemo.class, args);
    }
    }
    example: declaring an application

    View full-size slide

  104. @holly_cummins
    #RedHat
    example: declaring an application

    View full-size slide

  105. @holly_cummins
    #RedHat
    @ApplicationScoped
    public class GreetingRepository {
    public Entity findByName(int name) {
    return find("name", name).firstResult();
    }
    void persist(Entity entity) {}
    void delete(Entity entity) {}
    Entity findById(Id id) {}
    List list(String query, Sort sort, Object... params) {
    return null;
    }
    Stream stream(String query, Object... params) {
    return null;
    }
    long count() {
    return 0;
    }
    long count(String query, Object... params) {
    return 0;
    }
    }
    example: panache + hibernate

    View full-size slide

  106. @holly_cummins
    #RedHat
    example: panache + hibernate
    @ApplicationScoped
    public class GreetingRepository implements PanacheRepository {
    public Entity findByName(int name) {
    return find("name", name).firstResult();
    }
    }

    View full-size slide

  107. @holly_cummins
    #RedHat
    DAO
    example: panache + hibernate
    @ApplicationScoped
    public class GreetingRepository implements PanacheRepository {
    public Entity findByName(int name) {
    return find("name", name).firstResult();
    }
    }
    repository pattern

    View full-size slide

  108. @holly_cummins
    #RedHat
    example: panache + hibernate

    View full-size slide

  109. @holly_cummins
    #RedHat
    example: panache + hibernate
    active record pattern
    @Entity
    public class Greeting extends PanacheEntity {
    public String name;
    public LocalDate issued;
    @Version
    public int version;
    public static List getTodaysGreetings() {
    return list("date", LocalDate.now());
    }
    }

    View full-size slide

  110. @holly_cummins
    #RedHat
    int port = 8081;
    ClientInterceptor[] interceptors = new ClientInterceptor[3];
    interceptors[0] = new EventLoopBlockingCheckInterceptor();
    interceptors[1] = new IOThreadClientInterceptor();
    interceptors[2] = new StorkMeasuringGrpcInterceptor();
    // etc
    Channel channel = ManagedChannelBuilder
    .forAddress(“localhost", port)
    .usePlaintext()
    .build();
    GreeterGrpc.GreeterStub greeter = GreeterGrpc
    .newStub(channel)
    .withInterceptors(interceptors);
    example: gRPC

    View full-size slide

  111. @holly_cummins
    #RedHat
    example: gRPC
    @GrpcClient
    Greeter greeter;

    View full-size slide

  112. @holly_cummins
    #RedHat
    magic optional

    View full-size slide

  113. @holly_cummins
    #RedHat
    the old ways all still work
    magic optional

    View full-size slide

  114. @holly_cummins
    #RedHat
    the old ways all still work
    but you don’t have to type all
    the stuff unless you want to
    magic optional

    View full-size slide

  115. @holly_cummins
    #RedHat

    io.quarkus
    quarkus-spring-web


    io.quarkus
    quarkus-spring-data-jpa

    ok but we use spring
    option 1: compatibility libraries
    option 2: migration tooling
    • migration toolkit for applications (mta)
    • windup
    • open rewrite

    View full-size slide

  116. @holly_cummins #RedHat
    “After a week of development with
    quarkus, I was able to regain the
    same level of productivity as when
    I was developing with Spring Boot.”
    – Fawaz Paraïso, Decathlon

    View full-size slide

  117. ok but we use kotlin

    View full-size slide

  118. @holly_cummins #RedHat
    open source community of contributors

    View full-size slide

  119. @holly_cummins #RedHat
    Emiliia Nesterovych
    Emmanuel Bernard
    Emre Kaplan
    Enrique gonzález Martínez
    Enrique Mingorance Cano
    Eoin Gallinagh
    Eric Deandrea
    Eric Wittmann
    Erik Åsén
    Erik Mattheis
    Erin Schnabel
    Eugene Berman
    Evan Shortiss
    Fabricio Gregorio
    faculbsz
    Falko Modler
    Fedor Dudinskiy
    Felipe Carvalho dos Anjos Formentin
    Felipe Henrique Gross Windmoller
    Fernando Comunello
    Fernando Henrique
    fhavel
    Fikru Mengesha
    Filippe Spolti
    Florian Beutel
    Florian Bütler
    Florian Heubeck
    Florin Botis
    Foivos Zakkak
    Foobartender
    Fouad Almalki
    Francesco Nigro
    Francisco Javier Tirado Sarti
    Francois Steyn
    Frank Eichfelder
    franz1981
    freakse-sa
    Fred Bricon
    Frédérc Blanc
    Freeman Fang
    Fu Cheng
    Gabriele Cardosi
    Galder Zamarreño
    galiacheng
    Gavin King
    Gavin Ray
    Geert Schuring
    Geoffrey De Smet
    Geoffrey GREBERT
    Georg Leber
    George Gastaldi
    manofthepeace
    Manyanda Chitimbo
    Marat Gubaidullin
    Marc Nuri
    Marc Schlegel
    Marc Wrobel
    Marcel Hanser
    Marcel Lohmann
    Marcell Cruz
    Marcelo Pereira
    Marcin Czeczko
    Marcin Kłopotek
    Marco Bungart
    Marco Schaub
    Marco Yeung
    Marco Zanghì
    Marcus Paulo
    Marek goldmann
    Marek Skacelik
    Marián Macik
    Mario Fusco
    MarioHNogueira
    Mark Lambert
    Mark Little
    Mark McLaughlin
    Mark Sailes
    marko-bekhta
    Markus Heberling
    Markus Himmel
    Markus Schwer
    Martin C. Richards
    Martin Grammelspacher
    Martin Kouba
    Martin Muzikar
    Martin Panzer
    Martin Weiler
    martin-kofoed-jyskebank-dk
    MartinWitt
    Marvin B. Lillehaug
    masini
    Matej Novotny
    Matej Vasek
    Matheus Cruz
    Mathias Holzer
    Matteo Mortari
    Matthias Andreas Benkard
    Matthias Cullmann
    mauroal
    Max Andersen
    Max Gabrielsson
    Max Rydahl Andersen
    Victor Hugo de Oliveira Molinar
    Vincent Sevel
    Vincent van Dam
    Vinícius Ferraz Campos Florentino
    Viswa Teja Nariboina
    Vladimir Konkov
    Vojtech Juranek
    Vratislav Hais
    w.glanzer
    Walter Medvedeo
    Wayne Ellis
    Werner Glanzer
    Willem Jan Glerum
    William Antônio Siqueira
    Wim goeman
    Wippermueller, Frank
    wojciech.stryjewski
    Xavier
    Xieshen
    xstefank
    Y. Luis
    Yann-Thomas LE MOIGNE
    Yannick Reifschneider
    YassinHajaj
    Yelzhas Suleimenov
    yesunch9
    Yoann Rodière
    Yoshikazu Nojima
    Youngmin Koo
    Yubao Liu
    yugoccp
    Yukihiro Okada
    Zaheed Beita
    zanmagerl
    zedbeit
    Zheng Feng
    Žiga Deisinger
    Zineb Bendhiba
    zohar
    Zoran Regvart
    Шумов Игорь Юрьевич


    三不惹
    open source community of contributors

    View full-size slide

  120. @holly_cummins #RedHat
    one last thing …

    View full-size slide

  121. @holly_cummins #RedHat
    does being faster
    and lighter mean
    quarkus is greener?

    View full-size slide

  122. digression:
    how do you measure carbon?

    View full-size slide

  123. @holly_cummins #RedHat
    step 1: measure power usage

    View full-size slide

  124. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement

    View full-size slide

  125. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete

    View full-size slide

  126. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall

    View full-size slide

  127. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall
    and equipment

    View full-size slide

  128. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall
    and equipment
    RAPL

    View full-size slide

  129. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall
    and equipment
    RAPL
    programmatically accessible

    View full-size slide

  130. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall
    and equipment
    RAPL
    programmatically accessible
    misses some components

    View full-size slide

  131. @holly_cummins #RedHat
    step 1: measure power usage
    wall power measurement
    more complete
    needs access to the wall
    and equipment
    data costs carbon
    RAPL
    programmatically accessible
    misses some components

    View full-size slide

  132. @holly_cummins #RedHat

    View full-size slide

  133. @holly_cummins #RedHat

    View full-size slide

  134. @holly_cummins #RedHat

    View full-size slide

  135. @holly_cummins #RedHat
    load

    View full-size slide

  136. @holly_cummins #RedHat
    Source: Teads EC2 instances carbon dataset

    View full-size slide

  137. @holly_cummins #RedHat
    density
    Source: Clement Escoffier
    experiment 1: cloud
    Setup:
    • 800 requests/second, over 20 days
    • SLA > 99%
    • AWS instances
    Assumptions:
    • Costs are for us-east-1 data centre

    View full-size slide

  138. @holly_cummins #RedHat
    Setup:
    • 800 requests/second, over 20
    days
    • SLA > 99%
    Assumptions:
    Source: Clement Escoffier x Teads
    cloud carbon impact of framework choice
    interpolated carbon metrics

    View full-size slide

  139. @holly_cummins #RedHat
    Setup:
    • 800 requests/second, over 20
    days
    • SLA > 99%
    Assumptions:
    Source: Clement Escoffier x Teads
    cloud carbon impact of framework choice
    the carbon is lower because
    the cost is lower
    interpolated carbon metrics

    View full-size slide

  140. @holly_cummins #RedHat
    Setup:
    • REST + CRUD
    • large heap
    • RAPL energy measurement
    • multiple instances to
    support high load

    Assumptions:
    • US energy mix
    Source: John O’Hara
    experiment 2: RAPL measurements

    View full-size slide

  141. @holly_cummins #RedHat
    Setup:
    • REST + CRUD
    • large heap
    • RAPL energy measurement
    • multiple instances to
    support high load

    Assumptions:
    • US energy mix
    Source: John O’Hara
    experiment 2: RAPL measurements
    quarkus on JVM has the lowest carbon …
    because it has the highest throughput

    View full-size slide

  142. • quarkus cuts carbon by ~2-3x*
    • native consumes more carbon
    than JVM
    carbon measurements:
    conclusions

    View full-size slide

  143. @holly_cummins #RedHat
    ok but is it being
    used in production?

    View full-size slide

  144. @holly_cummins #RedHat
    “We can run 3 times denser deployments without
    sacrificing availability and response times of services.
    quarkus live coding is a really good thing: Making changes
    and reloading pages instantaneously is a great feature.”
    – Fawaz Thorsten Pohl, Lufthansa AVIATAR

    View full-size slide

  145. @holly_cummins #RedHat
    2019: Moved digital experience to quarkus
    (from Spring Boot)
    • Startup times 40s ➡ 12s
    • RAM 800 MB ➡ 360 MB
    • Developer productivity ⬆ 30-40%
    – Christos Sotiriou, Vodafone Greece

    View full-size slide

  146. @holly_cummins #RedHat
    tl;dpa
    (too long didn’t pay attention)
    deployment density
    lower cloud bill
    frictionless development experience
    Medium Nano
    auto-provision services
    zero-config live coding
    continuous testing
    developer UI
    greener

    View full-size slide

  147. slides
    Holly Cummins
    Red Hat

    View full-size slide