Reportáž z GeeCON Praha 2015

GeeCON 2015 GeeCON je zavedená konference, u které se můžete spolehnout na kvalitní speakery a skvělou organizaci. Připočtěme ještě rozumnou cenu a fakt, že se děje u nás v České republice a vychází nám z toho rovnice, která má jasně daný výsledek = je to akce, na které nemůžete chybět, pokud nemáte opravdu dobrou výmluvu :)

V tomto článku udělám krátkou rešerši přednášek na kterých jsem byl.

Úvodní keynote Grant Ingersolla z firmy Lucidworks, která stojí za známým Lucene narážela na to, zda-li dostatečně využíváme data, které nám v aplikacích generují naši uživatelé. Přitom tata data mohou být klíčová při vytváření UX - díky odhalování podobností v chování uživatelů a segmentaci, můžeme již předem vědět, co by mohl daný uživatel chtít a nabízet mu personalizovaný obsah, nebo jinou prioritizaci položek. O tom, že to není úplně jednoduché je možné se dočíst v nedávném článku na Zdrojáku. Na druhou stranu preferovat ve výsledcích vyhledávání "trendy" položky e-shopu nemusí být zase až taková věda, a kdo to skutečně dělá, že?

[gallery columns="1" link="file" ids="3063"]

Krzysztof Dębski mluvil o tom, jak v Allegro (provozovatel Aukra) zpracovávají obrovský stream vstupních dat pomocí Kafky. Především se věnoval problémům, se kterými se při implementaci setkali. Na toto téma doporučuji sérii článku od Lukáše Havrlanta, která je v tomto ohledu docela detailní. Kryštof zmiňoval např. to, že pokud máte jediného producenta dat a ponecháte výchozí strategii pro publishing eventů do Kafky, nijak nevyužijete její výkonnostní parametry na úrovni partition - publisher defaultně zapisuje nějakou dobu (např. 10 minut) do jedné partition a pak switchne na druhou. Tj. v jednom momentu je utilizovaná pouze jediná partition na zápis.

Upozorňoval také na konfigurační nastavení replica.lag.max.messages (blíže popsáno třebas zde), které určuje o kolik záznamů může být replika pozadu (než je považována za mrtvou). To mj. také znamená, že když vypadne master na dané partition, můžete nenávratně příjít tento počet zpráv - pokud je replika, která se stane novým masterem pozadu v synchronizaci. Můžete samozřejmě při zápisech trvat na potvrzení (ACK) až poté, co je zpráva uložena i na replice, ale tím přicházíte o tolik potřebný výkon.

Upozorňoval i na chybu kernelu 3.2.x, která způsobuje, že flush na disk pozastaví na krátkou dobu chod systému (tato chyba je opravena až ve verzi 3.8.X) - správně by měl být flush prováděn asynchronně, ale v dané verzi kernelu tomu tak není. Poměrně dlouho také elaboroval nad tím, jaký formát dat zvolit pro ukládání dat do Kafky - začínali s JSON formátem, který je pro ukládání velmi neefektivní a jeho hlavní výhodu - čitelnost - vlastně nikdy nepoužili. Nedoporučoval používat protokoly Snappy a Lz4, protože při jejich použití dochází sem tam k poškození dat. Jim se osvědčil formát Avro, který má malý footprint na síti (je binární), je Hadoop friendly a má schéma, dle kterého se dá validovat.

[gallery columns="1" link="file" ids="3045"]

V Allegro vyvíjejí systém Hermes, kterým se snaží řešit některé negativní stránky Kafky. V tomto kontextu padl i onen často zmiňovaný problém záruky doručení zprávy právě jednou (viz. přiložený obrázek).

Martin Večeřa a Pavel Macík na konferenci představili Java knihovnu pro výkonnostní testování - PerfCake. Starší přednášku od této dvojice na stejné téma můžete shlédnout např. zde:

Knihovna se snaží konkurovat zavedené knihovně Gatling napsané ve Scale. Testovací scénáře se píší buď ve vlastním "plain textovém" DSL nebo v XML (marně jsem hledal Java API ekvivalent). Testování je zaměřeno na ověření SLA nebo také nalezení "sweet spot", ve kterém aplikace reaguje nejlépe. Výsledky testů je možné nově uploadovat do tzv. PerfRepo, což je webová aplikace, která umí výsledky testů ukládat, tagovat, zobrazovat a porovnávat mezi sebou. Z ukazovaného dema bylo vidět, že aplikace je ještě syrová a z hlediska UI bude potřebovat ještě další dočištění. Rozhodně se však jedná o zajímavý počin, který stojí za vyzkoušení - zvlášť, pokud vám nesedí Scala :) Nástroj aktuálně neumožňuje distribuované generátory zátěže. Osobně by mě zajímalo srovnání např. s českým SmartMeter, který mi přijde na první pohled pokročilejší, ovšem komerční.

Lukáš Křečan z GoodData měl ve vedlejší místnosti přednášku o nebezpečí paralelních streamů v Java 8. Problém naznačil už ve svém článku z roku 2014. V přednášce problematiku rozvedl do větších detailů - posuďte sami a podle mých kolegů, kteří na přednášce byly, se velmi povedla.

Martin Škurla ve své přednášce rozebral základy fungování classloaderů v Javě - s velkým přesahem do historie. Přednáška byla určitě zajímavá pro někoho, kdo se v problematice orientuje, ale mě moc nového, bohužel, nepřinesla. Byla velmi srozumitelná a hezky podaná. Já jsem se těšil na rozebrání toho, co nás čeká v Javě 9 s projektem Jigsaw, ale toho jsem se nedočkal.

Juergen Hoeller ve své přednášce popisoval přístup Springu k definici anotací a vypichoval věci, které on osobně považuje v celém ekosystému za zajímavé a důležité. Jednou z nich je např. možnost kompozice anotací (je velká škoda, že podobnou věc nelze udělat i ve Spring Security - což sice lze obejít, ale dost pracně). Zdůrazňoval respektování použitých generik v třídách autowirovaných springem a možnost využití sady odpovídajících bean např. pomocí:

@Autowired
public MyObject(
   List<HttpService> httpServices,
   GenericDao<Product> productDao) {
   ...
}

Co bylo pro mě nové je možnost v rámci autowingu použít deklaraci Optional<ClassBeany>, což Spring vyhodnotí jako nepovinný autowiring (tj. pokud odpovídající beana existuje, bude autowirovaná, pokud ne, autowiruje se Optional.empty()). Novinkou pro mě bylo i to, že Java 8 podporuje repeatable anotace, což mi z radaru nějak uteklo. Stejně tak mi utekla i nová Spring anotace @EventListener, která umožňuje v rámci jedné třídy pořešit hned sadu souvisejících událostí. Juergen v následující přednášce také vykládal o novinkách, které chystají do následujího release Springu, ale z této přednášky mám jen pár fotek:

[gallery columns="2" ids="3048,3049,3050,3053"]

Zavítal jsem i na přednášku Toma Bujoka o distribuované memory databázi Hazelcast. Opět se mi nevyplatilo jít na přednášku na téma, kde něco málo znám - ačkoliv byla srozumitelná a hezky poslouchatelná, nedozvěděl jsem se nic jiného, než je možné dočíst v oficiální dokumentaci. Zajímavá byla zmínka o distribuovaných query v SQL like jazyku (popř. v predikátové formě), které jsou paralelně vyhodnocovány na jednotlivých uzlech memory gridu. Část přednášky se soustředila i na strategii soustředění souvisejících dat na stejném uzlu gridu pomocí PartitionAware rozhranní, které umožňuje efektivnější výpočty díky vyloučení nákladů na komunikaci po síti. Hazelcast může samozřejmě fungovat i jako distribuovaná cache a dokonce se dá použít i jako Memcached drop-in replacement.

Velmi poutavá byla přednáška Bas Knoppera o evolučních algoritmech, což je věc, se kterou se denně nesetkáváme. Popisoval v ní na příkladu cestujícího obchodníka (traveling salesman) konkrétní použití evolučního algoritmu, které si sami můžete vyzkoušet zde.

[gallery columns="1" link="file" ids="3065"]

V přednášce byly detailně popsány základní principy každého evolučního algoritmu - od tvorby úvodní populace, stanovení fitnes funkce, výběru kandidátů pro další iteraci, kombinační a mutační funkce a mnoho dalšího. Pokud tato přednáška vyjde jako videozáznam, vřele doporučuji její shlédnutí. Evoluční algoritmy doporučuje Bas Konpper všude, kde je tak velký počet kombinací, že není možné použít přístup hrubou silou a zároveň je možné stanovit fitness funkci, funkci pro kombinaci a mutaci prvků. Podobně to například provedla NASA pro tvorbu minimalistické antény pro komunikaci s pozemní základnou.

Simon Brown si ve své přednášce Modular Monoliths lehce utahoval s aktuálního trendu microservis. Vyzdvihoval známou pravdu, že pokud nejste schopni vytvořit kvalitní monolickou aplikaci, přechodem na microservice architekturu si nejspíše nepomůžete - spíše naopak (o tom konec konců píše i velký Martin Fowler). Ve své přednášce popisuje to, co ve Forrestu už praktikujeme několik let (alespoň tedy na úrovni komponent), i když musím přiznat, že moje přednáška na CZJUGu nesahala této ani po paty. Holt kdo umí, ten umí :)

Poslední zajímavé vystoupení se týkalo testování microservice based architektury od člověka se jménem Christopher Batey, který řešil jako konzultant rozpad monolitické architektury aplikace pro poskytování streamovaného videa v Británii. V několika demech ukázal praktické použití nástrojů jako je třeba Wiremock, který umožňuje simulovat problémy na síťové vrstvě a ať už v podobě prodlužování odezvy nebo zdržování jednotlivých paketů. Osobně jsem si teprve až tady uvědomil, jak složité může být v microservice architektuře (a v podstatě v každé architektuře, která má více elementů komunikujících po síti) zaručit SLA. Těch kombinací, které způsobí "zaseknutí" služby je totiž daleko více než jen connection timeout. Doporučoval např. nikdy se nevzdávat vlákna, které řeší request uživatele - veškerou komunikaci po síti provádět v separátním vlákne s pevně danými timeoutem. Klíčové sdělení jeho přednášky bylo: "you don’t know a service is fault tolerant if you don’t test faults" a položme si ruku na srdce - kdo z nás si skutečně simuloval všechny možné problémy, které mohou v distribuovaných architekturách nastat?! K přečtení doporučoval knížku Release it!, která jej k této přednášce inspirovala. Doporučoval také použití nástrojů jako jsou Hystrix, Graphite nebo Saboteur. I tuto přednášku doporučuji shlédnout online, pokud bude zveřejněna.

[gallery columns="1" link="file" ids="3066"]

Na konec musím poděkovat organizátorům, protože je vidět, že opravu umí - letos fungovala dokonce i Wi-Fi a to vůbec není při tomto počtu zařízení samozřejmé. Dagimu děkuji za volňásek a doufám, že jsem si ho tímto článkem zasloužil.

IMG_20151022_100727