Contêiner em primeiro lugar
Aplicações Quarkus são otimizadas para baixo uso de memória e tempos de inicialização rápidos.
Desde o início, o Quarkus foi projetado em torno de uma filosofia de contêiner em primeiro lugar. O que isso significa em termos concretos é que as aplicações Quarkus são otimizadas para baixo uso de memória e tempos de inicialização rápidos das seguintes maneiras:
Processamento de tempo de compilação
A ideia central por trás do Quarkus é fazer em tempo de compilação o que as estruturas tradicionais fazem em tempo de execução: análise de configuração, varredura de classpath, alternância de recursos com base no carregamento de classes e assim por diante.
O máximo de processamento possível é feito em tempo de compilação; assim, seu aplicativo contém apenas as classes usadas em tempo de execução. Em estruturas tradicionais, todas as classes necessárias para executar a implantação inicial do aplicativo permanecem durante a vida útil do aplicativo, mesmo que sejam usadas apenas uma vez. Com o Quarkus, eles nem são carregados na JVM de produção! O Quarkus não para por aqui. Durante o processamento em tempo de compilação, ele prepara a inicialização de todos os componentes usados pelo seu aplicativo. Isso resulta em menos uso de memória e tempo de inicialização mais rápido, pois todo o processamento de metadados já foi feito.
Redução no uso de reflexão
Tanto quanto possível, o Quarkus tenta evitar a reflexão, reduzindo o tempo de inicialização e o uso de memória. Durante o processamento em tempo de compilação, as extensões podem analisar o código do aplicativo e as classes disponíveis no classpath e substituir chamadas de reflexão por chamadas regulares. O uso de proxies dinâmicos também é impedido usando a geração de proxy personalizado em tempo de compilação.
Arc, a estrutura de injeção de dependência usada pelo Quarkus, elimina todas as chamadas de reflexão e deduz o gráfico de injeção em tempo de compilação. Assim, quando o aplicativo é iniciado, não há pesquisas caras; já está feito!
Suporte de primeira classe para imagens nativas do GraalVM
O suporte ao GraalVM Native Executable tem sido uma parte essencial do
design do Quarkus desde o início. Quando um aplicativo é compilado em um
executável nativo, ele é iniciado muito mais rápido e pode ser executado com
um heap muito menor do que uma JVM padrão. O compilador nativo usa técnicas
agressivas de eliminação de código morto para incorporar apenas as partes da
JVM e as classes que são absolutamente exigidas pelo seu aplicativo. O
Quarkus facilita a criação de executáveis nativos otimizados. A abordagem de
tempo de compilação permite que o Quarkus colete metadados suficientes em
seu aplicativo para ajustar a compilação. Acabou-se a necessidade de
adicionar a flag -H:+ReportUnsupportedElementsAtRuntime
e
outras gambiarras!
Pré-inicialização da imagem nativa
Nós pré-inicializamos o maior número possível de frameworks durante a compilação nativa de um aplicativo Quarkus. Isso significa que o executável nativo resultante já executou a maior parte do código de inicialização e serializou o resultado no executável: inicialização ainda mais rápida!
Kubernetes, mas também bare metal
Todas as técnicas que permitem reduzir o uso de memória e proporcionar tempos de inicialização mais rápidos não são vantajosas apenas em contêineres. Mesmo em bare metal, isso reduziria sua pressão de memória, e é sempre agradável não ter que esperar 10 segundos para ver seu aplicativo em execução.
Quando o Quarkus foi projetado, não nos concentramos apenas em contêineres, mas também na implantação de aplicativos Quarkus em orquestradores de contêineres, como o Kubernetes. O processamento em tempo de compilação do Quarkus também gera os metadados do Kubernetes, para que sua aplicação esteja pronta para ser implantado no Kubernetes. Os recursos de tempo de execução, como verificações de integridade e métricas, são expostos imediatamente. O Quarkus coleta todos os metadados necessários em tempo de compilação para criar o descritor de deployment do Kubernetes e produzir uma imagem de contêiner. Uma única linha de comando pode implantar seu aplicativo no cluster do Kubernetes.