EGY NAGYBÓL HÚSZ KISEBB JAVA EE ALKALMAZÁSÉPÍTÉS 2015-BEN - ESETTANULMÁNY KÁLMÁN ANDRÁS, KÁSA KÁROLY PRECOGNOX INFORMATIKAI KFT, 2015. WWW.PRECOGNOX.COM
TARTALOM Monolit és több applikációra bontott alkalmazások előnyei és hátrányai Monolit alkalmazásunknál használt technológiák Több alkalmazásra elosztott megvalósításnál használt technológiák Eszközök amiket a megnövekedő összetettség miatt kell használni Egy JAX-RS implementáció példa
MONOLIT ALKALMAZÁS Kisebb alkalmazásnál - Monolit előnyök: könnyebb deployment Egyszerűbb architektúra Jól átlátható fejlesztési időben a team-nek Nagyobb funkcióhalmaznál - Monolit hátrány Vertikálisan kell skálázni a fejlesztői, teszt és éles gépek erőforrásait (elsősorban RAM) Megnövekedő deployment idő -> belassuló fejlesztés Egy funkció hibája a teljes alkalmazást és a többi team tagot is visszafogja Apró módosítás miatt (pl. szöveg resource változás) is teljes újratelepítés
TÖBB ALKALMAZÁS ([MICRO]SERVICE) EGYÜTTMŰKÖDÉSE Előnyök: Könnyebb fejlesztés, mert átlátható és gyorsan módosítható, kisebb modulokon dolgozunk Tiszta, jól definiált funkcionális határvonalakat könnyebb betartatni Általános szolgáltatás többször felhasználható Gyorsabb deployment ami nem akadályozza feltétlenül a teljes működést Hátrányok: Összetettséget visz át az architektúrára Bonyolult release folyamat és verziózás Figyelni kell az API-k verzió kompatibilitására Nehezebb tesztkörnyezetet felállítani (lokálisan és szerveren is) Sok adminisztráció a Git-ben és JIRA-ban Bonyolultabb konfiguráció menedzsment és service discovery szükséges
MONOLIT VÁLTOZATUNK FŐ MEGOLDÁSAI 1. Egy nagy ANT build script 2. Jenkins készített EAR-t és ezt tettük Jboss 6-ba 3. Homogén fejlesztőkörnyezet Vagrant segítségével 4. Infrastruktúra automatizálás és deployment Chef alkalmazásával 5. Teljes kiesés a frissítés idejére. Hosszú lefutású folyamatok miatt előtte fél óráig is blokkoltunk bizonyos funkciókat 6. Heterogén fejlesztői tudásszint miatt a funkcionális határvonalakat gyakran megsértették. Nagy refaktorálásokat kellett beiktatni, amit nehéz elfogadtatni a megrendelővel
TÖBB ALKALMAZÁSRA ELOSZTOTT MEGOLDÁSUNK 1. Gradle build (convention over configuration előnye ANT-hoz képest) 2. Jenkins Docker image-eket készít 3. A neki legmegfelelőbb ( legvékonyabb ) alkalmazásszerver minden app-nak (Dropwizard, Jetty, Tomcat, Wildfly) 4. Chef szerepe visszaszorult a Docker alkalmazásával 5. Ritka a fő funkció elérhetetlenné válása, mert a háttér szolgáltatások gyorsan cserélhetők, szinte kiesés nélkül 6. Kis fejlesztői csapatok felelnek az egyes alkalmazásokért, amik méretük miatt így konzisztensebb minőségben fejlődnek
ÚJ ÉS RÉGI VERZIÓ TECHNOLÓGIAI ÖSSZEHASONLÍTÁS Monolit MVC - JSF + J2EE Control és Service rétegek + JPA perzisztencia 4 nagyobb alkalmazás (SSO, custom File server, custom CRM és a fő alkalmazás) Külső alkalmazásoknak WS alapú API ElasticSearch log tárolás saját Logback appender-rel és Kibana lekérdezőfelület Nagios monitoring (dőlt betűvel azokat jelöltem amiket nem alkalmazunk az új változatban)
ÚJ ÉS RÉGI VERZIÓ TECHNOLÓGIAI ÖSSZEHASONLÍTÁS Több alkalmazásra elosztott AngularJS + TypeScript frontend, RESTful backends 20 alkalmazás, amiből csak 2 stateful Message alapú alkalmazásközi kommunikáció RabbitMQ-val 7 alkalmazás publikus a többi API csak belső használatra Fluentd? alapú log centralizálás DataDog monitoring as a Service
ÖSSZETETTSÉG NÖVEKEDÉS AZ ÚJ ARCHITEKTÚRÁN JWT alapú autentikáció és autorizáció a stateless alkalmazásoknál Minden alkalmazáshoz saját Docker container-ek tartalmazzák az alkalmazás szervert és benne az app-ot Consul és Registrator alapú service discovery NGINX proxy Correlation id továbbadása szükséges a hívásláncon (debug-hoz) Fault tolerance megvalósítás és traffic monitoring kell - Hystrix
HYSTRIX Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.
JAX-RS INTERFACE
REST SERVICE IMPLEMENTATION
HYSTRIX WRAPPED CLIENT COMMAND
CLIENT
KÁSA KÁROLY Precognox fejlesztési vezető karoly.kasa@precognox.com Kereső világ http://kereses.blog.hu - A blog about big data, search and text mining Hungarian Natural Language Processing Meetup http://www.meetup.com/hungarian-nlp/