Com Quarkus combina la programació imperativa i la reactiva

Aquest any tenim previst desenvolupar seriosament temes de contenidors, Java natiu del núvol и Kubernetes. Una continuació lògica d'aquests temes serà ja una història sobre el framework Quarkus considerat sobre Habré. L'article d'avui tracta menys sobre el disseny de "Java súper ràpid subatòmic" i més sobre la promesa que Quarkus aporta a Enterprise.

Com Quarkus combina la programació imperativa i la reactiva

Java i la JVM encara són extremadament populars, però quan es treballa amb tecnologies sense servidor i microserveis nadius del núvol, Java i altres llenguatges JVM s'utilitzen cada cop menys perquè ocupen massa espai de memòria i són massa lents per carregar-se, fent-los poc adequat per al seu ús amb contenidors de curta durada. Per sort, aquesta situació ara comença a canviar gràcies a Quarkus.

El Java subatòmic súper ràpid ha arribat a un nou nivell!

42 llançaments, 8 mesos de treball comunitari i 177 desenvolupadors sorprenents: el resultat de tot va ser el llançament el novembre de 2019 Quarkus 1.0, una versió que marca una fita important en el desenvolupament del projecte i ofereix moltes característiques i capacitats interessants (podeu llegir-ne més a anunci).

Avui us mostrarem com Quarkus combina models de programació imperatiu i reactiu en un sol nucli reactiu. Començarem amb una breu història i després entrarem en detalls sobre què és el dualisme del nucli reactiu de Quarkus i com Java-Els desenvolupadors poden aprofitar aquests avantatges.

Microserveis, arquitectures impulsades per esdeveniments и sense servidor-funcions: tot això, com diuen, està en augment avui dia. Recentment, la creació d'arquitectures centrades en el núvol s'ha tornat molt més fàcil i accessible, però hi ha problemes, especialment per als desenvolupadors de Java. Per exemple, en el cas de les funcions sense servidor i els microserveis, hi ha una necessitat urgent de reduir el temps d'inici, reduir el consum de memòria i, tot i així, fer que el seu desenvolupament sigui més còmode i agradable. Java ha fet diverses millores en els darrers anys, com ara una funcionalitat ergonòmica millorada per als contenidors, etc. Tanmateix, aconseguir que Java funcioni correctament en un contenidor encara és un repte. Per tant, començarem analitzant algunes de les complexitats inherents a Java, que són especialment agudes quan es desenvolupen aplicacions Java orientades a contenidors.

Primer, mirem la història.

Com Quarkus combina la programació imperativa i la reactiva

Rierols i contenidors

A partir de la versió 8u131, Java va començar a donar suport més o menys als contenidors a causa de les millores en la funcionalitat ergonòmica. En particular, la JVM ara sap quants nuclis de processador s'executa i pot configurar agrupacions de fils (normalment agrupacions de bifurcació/unió) en conseqüència. Per descomptat, això és fantàstic, però diguem que tenim una aplicació web tradicional que utilitza servlets HTTP i s'executa a Tomcat, Jetty, etc. Com a resultat, aquesta aplicació donarà a cada sol·licitud un fil independent i li permetrà bloquejar aquest fil mentre espera operacions d'E/S, per exemple, quan accedeix a la base de dades, fitxers o altres serveis. És a dir, la mida d'aquesta aplicació no depèn del nombre de nuclis disponibles, sinó del nombre de sol·licituds simultànies. A més, això vol dir que les quotes o els límits a Kubernetes sobre el nombre de nuclis no seran de gran ajuda aquí i, finalment, la qüestió acabarà amb una limitació.

Esgotament de la memòria

Els fils són memòria. I les limitacions de memòria intra-contenidor no són de cap manera una panacea. Només heu de començar a augmentar el nombre d'aplicacions i fils i, tard o d'hora, trobareu un augment crític de la freqüència de commutació i, com a resultat, una degradació del rendiment. A més, si la vostra aplicació utilitza marcs de microserveis tradicionals, o es connecta a una base de dades, o utilitza la memòria cau, o d'una altra manera utilitza memòria, òbviament necessiteu una eina que us permeti mirar dins de la JVM i veure com gestiona la memòria sense matar-la. JVM mateixa (per exemple, XX:+UseCGroupMemoryLimitForHeap). I tot i que, des de Java 9, la JVM ha après a acceptar grups c i adaptar-se en conseqüència, reservar i gestionar la memòria segueix sent una qüestió força complexa.

Quotes i límits

Java 11 va introduir suport per a quotes de CPU (com PreferContainerQuotaForCPUCount). Kubernetes també ofereix suport per a límits i quotes. Sí, tot això té sentit, però si l'aplicació torna a superar la quota assignada, acabem de nou amb la mida -com és el cas de les aplicacions Java tradicionals- determinada pel nombre de nuclis i amb l'assignació d'un fil separat per a cadascun. petició, llavors tot això té poc sentit.
A més, si utilitzeu quotes i límits o les funcions d'escalada vertical de la plataforma subjacent a Kubernetes, el problema tampoc es resol. Simplement gastem més recursos per resoldre el problema original o acabem gastant més. I si es tracta d'un sistema d'alta càrrega en un núvol públic públic, gairebé segur que acabem utilitzant més recursos dels que realment necessitem.

I què fer amb tot això?

Per dir-ho simplement, utilitzeu biblioteques i marcs d'E/S asíncrons i no bloquejants com Netty, Vert.x o Akka. Són molt més adequades per treballar en contenidors pel seu caràcter reactiu. Gràcies a les E/S sense bloqueig, el mateix fil pot processar múltiples peticions simultànies. Mentre una sol·licitud està esperant els resultats d'E/S, el fil que la processa s'allibera i es fa càrrec d'una altra sol·licitud. I quan finalment arriben els resultats d'E/S, el processament de la primera sol·licitud continua. Mitjançant el processament entrellaçat de sol·licituds dins del mateix fil, podeu reduir el nombre total de fils i reduir el consum de recursos per processar les sol·licituds.

Amb E/S sense bloqueig, el nombre de nuclis es converteix en un paràmetre clau perquè determina el nombre de fils d'E/S que es poden executar en paral·lel. Quan s'utilitza correctament, això us permet distribuir eficaçment la càrrega entre nuclis i gestionar càrregues de treball més altes amb menys recursos.

Com, això és tot?

No, hi ha una altra cosa. La programació reactiva ajuda a fer un millor ús dels recursos, però també té un preu. En particular, s'haurà de reescriure el codi d'acord amb els principis de no bloquejar i evitar bloquejar els fils d'E/S. I aquest és un model completament diferent de desenvolupament i execució. I tot i que aquí hi ha moltes biblioteques útils, no deixa de ser un canvi radical en la manera habitual de pensar.

Primer, heu d'aprendre a escriure codi que s'executi de manera asíncrona. Un cop comenceu a utilitzar E/S sense bloqueig, heu d'especificar explícitament què ha de passar quan es rep una resposta a una sol·licitud. Simplement bloquejar i esperar ja no funcionarà. En lloc d'això, podeu passar devolucions de trucada, utilitzar programació reactiva o continuar. Però això no és tot: per utilitzar E/S sense bloqueig, necessiteu tant servidors com clients que no bloquegin, preferiblement a tot arreu. En el cas de l'HTTP, tot és senzill, però també hi ha bases de dades, sistemes de fitxers i molt més.

I encara que la reactivitat total d'extrem a extrem maximitza l'eficiència, aquest canvi pot ser difícil de suportar a la pràctica. Per tant, la capacitat de combinar codi reactiu i imperatiu esdevé un requisit previ per:

  1. Utilitzar eficaçment els recursos a les àrees més carregades del sistema de programari;
  2. Utilitzeu un codi d'estil més senzill a les parts restants.

Presentació de Quarkus

De fet, aquesta és l'essència de Quarkus: combinar models reactius i imperatius dins d'un únic entorn d'execució.

Quarkus es basa en Vert.x i Netty, amb una sèrie de marcs i extensions reactius a la part superior per ajudar el desenvolupador. Quarkus està dissenyat per crear no només microserveis HTTP, sinó també arquitectures basades en esdeveniments. Pel seu caràcter reactiu, funciona molt eficaçment amb sistemes de missatgeria (Apache Kafka, AMQP, etc.).

El truc és com utilitzar el mateix motor reactiu tant per al codi imperatiu com per al reactiu.

Com Quarkus combina la programació imperativa i la reactiva

Quarkus ho fa de manera brillant. L'elecció entre imperatiu i reactiu és òbvia: utilitzeu un nucli reactiu per a tots dos. El que realment ajuda és un codi ràpid i sense bloqueig que gestiona gairebé tot el que passa pel fil del bucle d'esdeveniments, també conegut com el fil IO. Però si teniu aplicacions clàssiques REST o del costat del client, Quarkus té a punt un model de programació imprescindible. Per exemple, el suport HTTP a Quarkus es basa en l'ús d'un motor reactiu i no bloquejador (Eclipse Vert.x i Netty). Totes les sol·licituds HTTP rebudes per la vostra aplicació es passen primer a través d'un bucle d'esdeveniments (IO Thread) i després s'envien a la part del codi que gestiona les sol·licituds. Depenent de la destinació, el codi de gestió de sol·licituds es pot cridar dins d'un fil separat (l'anomenat fil de treball, utilitzat en el cas de servlets i Jax-RS) o utilitzar el fil d'E/S font (ruta reactiva).

Com Quarkus combina la programació imperativa i la reactiva

Els connectors del sistema de missatgeria utilitzen clients sense bloqueig que s'executen a la part superior del motor Vert.x. Per tant, podeu enviar, rebre i processar missatges de manera eficaç dels sistemes de programari intermedi de missatgeria.

El lloc Quarkus.io Aquests són alguns bons tutorials per ajudar-vos a començar amb Quarkus:

També hem creat tutorials pràctics en línia per ensenyar-vos diversos aspectes de la programació reactiva amb només un navegador, sense necessitat d'IDE i sense ordinador. Podeu trobar aquestes lliçons aquí.

Recursos útils

10 lliçons de vídeo sobre Quarkus per familiaritzar-se amb el tema

Com diuen a la web Quarkus.io, Quarkus - ho és Kubernetes-Pila Java orientada, adaptada per a GraalVM i OpenJDK HotSpot i muntada a partir de les millors biblioteques i estàndards de Java.

Per ajudar-vos a entendre el tema, hem seleccionat 10 tutorials en vídeo que cobreixen diversos aspectes de Quarkus i exemples del seu ús:

1. Presentació de Quarkus: el marc de Java de nova generació per a Kubernetes

Per Thomas Qvarnstrom i Jason Greene
L'objectiu del projecte Quarkus és crear una plataforma Java per a Kubernetes i entorns sense servidor, i combinar models de programació reactius i imperatius en un únic entorn d'execució perquè els desenvolupadors puguin variar el seu enfocament de manera flexible quan treballen amb una àmplia gamma d'arquitectures d'aplicacions distribuïdes. Obteniu més informació a la conferència introductòria a continuació.

2. Quarkus: Java subatòmica superràpida

Per: Burr Sutter
Aquest vídeo tutorial de DevNation Live demostra com utilitzar Quarkus per optimitzar aplicacions Java empresarials, API, microserveis i funcions sense servidor en un entorn Kubernetes/OpenShift, fent-los molt més petits, ràpids i escalables.

3. Quarkus i GraalVM: accelerant Hibernate a súper velocitats i reduint-lo a mides subatòmiques

Autor: Sanne Grinovero
A partir de la presentació aprendràs com va ser Quarkus, com funciona i com et permet fer biblioteques complexes, com Hibernate ORM, compatibles amb imatges natives de GraalVM.

4. Aprendre a desenvolupar aplicacions sense servidor

Autor: Martín Luter
El vídeo següent mostra com crear una aplicació Java senzilla amb Quarkus i desplegar-la com a aplicació sense servidor a Knative.

5. Quarkus: Diverteix-te amb la codificació

Autor: Edson Yanaga
Una guia de vídeo per crear el vostre primer projecte Quarkus, que us permetrà entendre per què Quarkus s'està guanyant el cor dels desenvolupadors.

6. Java i contenidors: quin serà el seu futur junts

Publicat per Mark Little
Aquesta presentació presenta la història de Java i explica per què Quarkus és el futur de Java.

7. Quarkus: Java subatòmica superràpida

Autor: Dimitris Andreadis
Una visió general dels avantatges de Quarkus que han rebut el reconeixement dels desenvolupadors: senzillesa, velocitats ultra altes, les millors biblioteques i estàndards.

8. Quarkus i sistemes de coets subatòmics

Autor: Clement Escoffier
Mitjançant la integració amb GraalVM, Quarkus ofereix una experiència de desenvolupament ultra ràpida i un entorn d'execució subatòmic. L'autor parla del costat reactiu de Quarkus i de com utilitzar-lo per crear aplicacions reactives i de streaming.

9. Quarkus i desenvolupament ràpid d'aplicacions a Eclipse MicroProfile

Autor: John Clingan
En combinar Eclipse MicroProfile i Quarkus, els desenvolupadors poden crear aplicacions MicroProfile en contenidors amb totes les funcions que s'inicien en desenes de mil·lisegons. El vídeo detalla com codificar una aplicació MicroProfile en contenidors per al desplegament a la plataforma Kubernetes.

10. Java, versió "Turbo".

Autor: Marcus Biel
L'autor mostra com utilitzar Quarkus per crear contenidors Java súper petits i súper ràpids que permeten avenços reals, especialment en entorns sense servidor.



Font: www.habr.com

Afegeix comentari