Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

@holly_cummins #RedHat 2022

Slide 8

Slide 8 text

@holly_cummins #RedHat 2011 microservices

Slide 9

Slide 9 text

@holly_cummins #RedHat 2013 containers (almost) change everything

Slide 10

Slide 10 text

@holly_cummins #RedHat 2013 containers (almost) change everything

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

@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

Slide 14

Slide 14 text

@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

Slide 15

Slide 15 text

@holly_cummins #RedHat

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

@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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

uh, can we do better than that?

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

enter … quarkus

Slide 26

Slide 26 text

an open source stack to write java apps quarkus

Slide 27

Slide 27 text

@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/

Slide 28

Slide 28 text

@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

Slide 29

Slide 29 text

@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)

Slide 30

Slide 30 text

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/

Slide 31

Slide 31 text

@holly_cummins to the code! demo!

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

do quarkus native applications start faster than lightbulbs?

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

ok but does startup time matter?

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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?

Slide 38

Slide 38 text

#Quarkus @holly_cummins

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

#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?

Slide 41

Slide 41 text

#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 (!)

Slide 42

Slide 42 text

in the cloud, memory footprint matters

Slide 43

Slide 43 text

in the cloud, memory footprint matters

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

@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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

@holly_cummins #RedHat where the win comes from 1832

Slide 58

Slide 58 text

@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

Slide 59

Slide 59 text

@holly_cummins #RedHat application frameworks optimised for dynamism

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 62

Slide 62 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 63

Slide 63 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 64

Slide 64 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 65

Slide 65 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 66

Slide 66 text

@holly_cummins #RedHat cloud apps are immutable now

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

@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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

ok but is performance all there is?

Slide 82

Slide 82 text

ok but is performance all there is? developer joy

Slide 83

Slide 83 text

@holly_cummins #RedHat

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

@ @ > 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

Slide 86

Slide 86 text

to the code! @holly_cummins #RedHat

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

@holly_cummins #RedHat developer UI

Slide 90

Slide 90 text

@holly_cummins #RedHat zero-config testcontainers

Slide 91

Slide 91 text

@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)

Slide 92

Slide 92 text

@holly_cummins #RedHat testcontainers integration … without quarkus

Slide 93

Slide 93 text

@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

Slide 94

Slide 94 text

@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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

@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

Slide 97

Slide 97 text

@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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

@holly_cummins #RedHat more opinions, less boilerplate

Slide 100

Slide 100 text

@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

Slide 101

Slide 101 text

@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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

@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

Slide 105

Slide 105 text

@holly_cummins #RedHat example: declaring an application

Slide 106

Slide 106 text

@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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

@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

Slide 109

Slide 109 text

@holly_cummins #RedHat example: panache + hibernate

Slide 110

Slide 110 text

@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()); } }

Slide 111

Slide 111 text

@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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

@holly_cummins #RedHat magic optional

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

@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

Slide 116

Slide 116 text

@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

Slide 117

Slide 117 text

@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

Slide 118

Slide 118 text

ok but we use kotlin

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

No content

Slide 121

Slide 121 text

@holly_cummins #RedHat open source community of contributors

Slide 122

Slide 122 text

@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

Slide 123

Slide 123 text

@holly_cummins #RedHat one last thing …

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

digression: how do you measure carbon?

Slide 126

Slide 126 text

@holly_cummins #RedHat step 1: measure power usage

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

@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

Slide 134

Slide 134 text

@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

Slide 135

Slide 135 text

@holly_cummins #RedHat

Slide 136

Slide 136 text

@holly_cummins #RedHat

Slide 137

Slide 137 text

@holly_cummins #RedHat

Slide 138

Slide 138 text

@holly_cummins #RedHat load

Slide 139

Slide 139 text

@holly_cummins #RedHat Source: Teads EC2 instances carbon dataset

Slide 140

Slide 140 text

@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

Slide 141

Slide 141 text

@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

Slide 142

Slide 142 text

@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

Slide 143

Slide 143 text

@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

Slide 144

Slide 144 text

@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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

@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

Slide 148

Slide 148 text

@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

Slide 149

Slide 149 text

@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

Slide 150

Slide 150 text

slides Holly Cummins Red Hat