Esiste un modo migliore per interrompere i servizi Java in contenitori

6

Mi piacerebbe scomporre un numero di servizi Java REST (file WAR) in singoli container "MicroServices", in modo da poter scalare i servizi su e giù, isolare le applicazioni, avere accoppiamenti lenti, facilitare l'implementazione del cloud, ecc. , etc (circa ~ 100 servizi attualmente in uso in un ESB / in esecuzione nella stessa JVM)

Ho dato un'occhiata a a few Docker tutorial, e sono preoccupato che ogni contenitore sarà di circa 150MB (dovuto to the JRE) - non grande da solo, ma se ho bisogno di ridimensionare a centinaia / migliaia (o più) di istanze di servizio, ci sarà molto spazio sul disco ridondante in uso ...

Esiste un modo migliore per interrompere i servizi Java nei contenitori?

  • Sto utilizzando lo strumento giusto per il lavoro? (Docker vs AWS ElasticBeanstalk vs AWS Lambda vs Java Application Server (/ s) vs ???)
  • Qual è la migliore pratica in termini di risorse condivise? (isolare tutto o condividere tutto (indipendenza dal trading per risorse inferiori)? ad es. Posso / devo avere un'unità condivisa montata da un sistema host, contenente una singola copia condivisa di JRE?)

Attualmente stiamo studiando JavaSE8 (compact1) - che è molto più appetibile di 40 MB (incl OS)

    
posta Nick Grealy 07.11.2016 - 13:29
fonte

4 risposte

2

La finestra mobile condivide lo spazio su disco ridondante tra le istanze dello stesso contenitore e i livelli ridondanti di immagini tra istanze di contenitori diversi. Ad esempio, se hai due microservizi diversi, entrambi iniziano con FROM openjdk:8-jre-alpine nella parte superiore del loro Dockerfile, quindi Docker condividerà lo spazio su disco JRE tra tutte le istanze sullo stesso host.

Anche se Docker non si comporta in questo modo, questo è il compromesso fondamentale che frequenti con i microservizi. Molte tecnologie di architettura dei microservizi funzionano in questo modo. I database NoSQL come Cassandra, ad esempio, creano spesso dozzine di copie di dati. Non dovresti aver paura di scambiare spazio su disco a basso costo per ottenere scalabilità.

Per quanto riguarda la tua "domanda giusta per il lavoro", molte persone hanno usato con successo Docker in situazioni simili alla tua, ma molte persone hanno utilizzato le altre tecnologie che hai elencato. In definitiva, devi fare quella determinazione per te.

    
risposta data 07.11.2016 - 14:46
fonte
1

Sei a quel punto in cui ti stai decomprimendo dove gestire 100 qualcosa (ad esempio Docker, Elastic Beanstalk, ecc.) potrebbe essere più doloroso di quanto valga.

Vedrei due cose diverse qui. Innanzitutto, vorrei considerare la possibilità di raggruppare i servizi in "sottoservizi" più piccoli. Non pensare che un singolo servizio debba essere una singola immagine di macchina / finestra mobile. Potrei essere incline a, ad esempio, raggruppare tutti i servizi di sicurezza in un singolo servizio e determinare il modo migliore per implementarlo.

In secondo luogo, ho utilizzato AWS Lambda ed Elastic Beanstalk per la distribuzione dei servizi. Elastic Beanstalk è ottimo per i servizi con funzionamento prolungato / alta CPU. Ha molti modi per aumentare e diminuire (utilizzo della CPU, I / O di rete, lunghezza della coda SQS, ecc.). Lambda ha più o meno la stessa cosa, ma ora stai correndo in un ambiente un po 'più ristretto. Lambda può funzionare molto bene, ma a mio parere gestisce il traffico o il tipo di attività di cron al meglio.

Come avvertimento: un Lambda che esegue frequentemente un po 'di tempo ogni corsa può diventare rapidamente più costoso di una macchina di fagiolo magico elastico.

Nel complesso, IMHO, il vantaggio dei microservizi è la capacità di aggiornare facilmente piccole sezioni del codice facilmente e di essere in grado di scalare facilmente sezioni del codice. Ma il lato negativo è dove ti trovi - quale divisione dei servizi ha senso? Il build / test / distribuzione / monitoraggio di 100 contenitori potrebbe essere più di quanto alcune organizzazioni possano gestire. Ma dividili in, diciamo, da 10 a 20 contenitori e ora hai un problema molto più gestibile.

    
risposta data 08.11.2016 - 23:29
fonte
-1

I moduli Java 9 sono progettati per risolvere alcuni di questi problemi: link

Ma forse dovresti migrare a JavaScript che ha un minore ingombro di memoria.

    
risposta data 08.11.2016 - 01:48
fonte
-2

È possibile utilizzare un file ear se si sfruttano EJB di qualsiasi forma. Guarderei più da vicino le implementazioni OCI in Java. Ho usato questo in passato e le cose hanno funzionato molto bene.

    
risposta data 13.11.2016 - 19:42
fonte

Leggi altre domande sui tag