Fotbalista střílí na stadionu branku. Během okamžiku o tom vědí všichni naši uživatelé na celém světě. Co se stane mezi tím? Spousta věcí, které běžný člověk nevidí a které mají jedno společné: žádná nesmí zdržovat celý proces. Proto náš backendový tým vytvořil LiveInput 2.0 — vychytaný nástroj pro efektivnější správu sportovních dat.

Livesport
Livesport
Sep 19, 2018 · 8 min read

Jednou z hlavních komponent, na kterou v Livesportu spoléháme, je sportovní databáze. Ta obsahuje všechno důležité, aby naši uživatelé dostávali přesné a rychlé výsledky, komentáře, statistiky a další informace. Tyto údaje jsme v počátcích získávali od dodavatelů, ovšem nyní v našich centrech v Praze, Brně a Hradci Králové zaměstnáváme kolem 400 administrátorů, kteří nám veškerý servis zajišťují přímo a nejsme tak na nikom závislí.

Všichni tito administrátoři využívají databázi, která má v současné době kolem 200 GB dat s 3,5 miliony zápasů, stovkami tisíc hráčů a týmů a tisícovkami soutěží. Když je sezona v plném proudu, odbavujeme až 1 500 zápasů denně, 5 000 zápasů týdně a 25 000 zápasů měsíčně. Další řada transakcí pak probíhá během jednotlivých utkání.

U fotbalového zápasu se skrze náš nástroj LiveInput provede i 4 000 změn, u tenisu přes 12 000 a kriket si může sáhnout dokonce i na více než 50 000 změn, protože se na rozdíl od jiných sportů hraje obvykle několik dní.

Nároky na celý systém se ale objevují ještě jinde. Naši administrátoři, kterým říkáme „plniči“, fungují na základě specializací. Není to tak, že by jeden člověk sledoval veškeré údaje v rámci daného zápasu. Někdo má na starost výsledky, další statistiky, někdo zapisuje střelce, jiný zase žluté a červené karty, další lidé mají na starosti sestavy — a vedle toho máme ještě komentátory probíhajících zápasů. Nad tím vším jsou pak vedoucí, kteří aktivity organizují.

Tohle všechno vyvíjí vysoké nároky na administrační prostředí. O něj se stará náš takzvaný DataCore tým (té naší dvousetgigové databázi totiž říkáme DataCore), který zajišťuje hladký chod a to, že sportovní data jsou aktuální.

Když se jeden gól propíše všude

Jednou z věcí, se kterou se musíme vypořádat, je, že systém v jeden okamžik intenzivně využívá sto a víc lidí najednou. Zároveň platí, že jakmile se někde na vstupu provede změna (administrátor typicky klikne na tlačítko „+“ pro připsání gólu danému týmu), nejde jen o malý záznam. Na výstupu naopak číslo „probublá“ celým systémem a hodnoty se propíší na mnoha místech — často vzniknou i stovky změn.

Vstřelená branka se tedy nezobrazí pouze u aktuálního skóre, ale například se také zjišťuje, jestli se díky ní tým neposunul v live tabulce soutěže. Na gól se vážou mraky věcí. Další administrátor musí dopsat střelce a asistenci, komentátor situaci okomentuje.

Všechna tato data zapisujeme do MySQL. Vzhledem k velkému množství přístupů a změn v tabulkách jsme museli vyřešit to, aby všechno fungovalo plynule a nevznikalo úzké hrdlo. Snažíme se optimalizovat dotazy, aby toho nezapisovaly hodně, a cíleně tedy nastavujeme zpoždění a nedáváme příkazy typu „aktualizuj celou tabulku“. Operace dávkujeme.

To, kolik dat MySQL právě zpracovává, si pečlivě monitorujeme.

Zápisy si řeší aplikační vrstva. Jakmile administrátor vytvoří změnu (vloží třeba gól), pošle se požadavek na server. Ten ho zpracuje a pošle do databáze, ve které se odchytí změna. Tyto změny v databázích se sledují a informace si přebírají další stroje, typicky aplikační vrstvy. Díky tomu dokážeme zápisy například u fotbalu odbavit za 50 až 100 milisekund, u komplexnějších sportů pak o něco déle. Změny se každopádně do sekundy objeví na webu.

Statistika rychlosti ukládání fotbalových zápasů.

Sportovní databáze běží na více než 20 serverech, kde dochází k replikaci. U replikací řešíme hlavně to, aby nedocházelo ke zpoždění (lagu). I sekunda je zde hodně. Právě hrané zápasy ukládáme do Redisu. Pracuje se s cachí a databází a dochází k synchronizaci.

Refaktoring je pro nás velké téma

Pro vývoj aplikace jsme původně využívali čistě LAMP, tedy Linux, Apache, MySQL a PHP. Šlo v podstatě o statický web, který se pod vlivem nároků na aktuální výsledky a informace postupně začal proměňovat a stávat dynamičtějším. Začali jsme tedy více využívat JavaScript. Historicky využíváme jQuery, toho se ale postupně zbavujeme a máme v plánu přejít k Reactu. Jsme v průzkumné fázi a zjišťujeme, k čemu a jak by se nám tato technologie mohla hodit. Poté ji chceme začleňovat na správná místa v rámci různých projektů.

Máme zaběhnutý systém a vždy, když integrujeme něco nového, musíme zohledňovat i to starší, aby všechno správně fungovalo vedle sebe. Neděláme vývoj na zelené louce a neustále vylepšujeme velkou funkční věc. Zastarávání kódu je u nás velké téma a úspěšně s tím bojujeme.

Máme vytvořenou roadmapu minimálně na rok dopředu a víme, co chceme dělat, co modernizovat, jaké technologie nasadit a jaké části systému přepsat. Firma nám na toto dává hodně prostoru a ví, že je třeba systém čistit a přepisovat staré věci.

Z toho plyne, že je pro nás důležitý refaktoring, u kterého trávíme i přes 50 % času. Nebojíme se přepisovat i velké části celého systému. Nyní například doděláváme přepis našeho klíčového nástroje LiveInput pro aktuální výsledky, přes který se u nás odvede kolem 80 % celkové práce. K přepisu kódu jsme se rozhodli po sedmi letech fungování a samotná akce trvala asi půl roku.

Příběh nástroje LiveInput

Předchozí verze nástroje došla do stavu, kdy ji nebylo možné dál smysluplně rozvíjet — byla pomalá a z dnešního pohledu UI zastaralá. Nová verze všechny tyto neduhy řeší. Při jejím návrhu jsme intenzivně komunikovali s administrátory. Hodně jsme mysleli na to, aby se nemuselo zbytečně klikat a všechno bylo po ruce a přehledné. Pokud se nástroj dobře udělá, může plničům ušetřit spoustu práce a jejich ušetřený čas tak lze využít na další věci. Snažíme se celkově mít co nejbohatší sportovní databázi a jít do co největších detailů. Z nového nástroje máme ohromnou radost a už dnes víme, že se investice do něj vyplatila. Naštěstí máme členy týmu, které baví řešit, jak něco předělat, vylepšit nebo jak kód čistit a promazávat.

LiveInput je nástroj, který vznikal od poloviny roku 2010. Následující rok byl poprvé použit na prezentování výsledků přímo na webu Livesportu při vítězném finále Petry Kvitové ve Wimbledonu.

Původní nástroj jsme tam tedy pokřtili tím nejlepším způsobem. Ale jak to někdy bývá, i když jsme na vývoji LiveInputu strávili tisíce hodin, nástroj pomalu zastarával.

Původní verze LiveInputu během let na sebe nabalovala další a další funkce…

Součinnost více lidí se během následujících let na LiveInputu podepsala i negativně — náš nástroj byl kvůli tomu pomalejší a graficky méně přehledný. Proto jsme se začátkem letošního roku sešli v týmu asi deseti lidí na schůzce, co s LiveInputem dál. Sepsali jsme si desítky bodů ke grafickým úpravám, výkonnostním problémům a uživatelským funkcím. Rozhodnutí pak bylo jednoduché: než to celé předělávat a opravovat, necháme původní nástroj dožít a postavíme nový nástroj od nuly.

Obrovskou výhodu jsme měli v tom, že kolem nás pracuje spousta lidí, kteří mají osobní zájem na tom, abychom posunuli původní nástroj o několik úrovní dopředu. Designerský tým nám poradil se spoustou stylistických „vychytávek“, s nápady na vylepšení samozřejmě přispěli také plniči. Současně nám ale řekli i to, co jim ve starém nástroji vyhovovalo. I to bylo velmi důležité; málokterý produkt má to štěstí, že uživatelská a vývojářská skupina jsou v úzkém kontaktu. Navíc my jsme programátoři, ne uživatelé, proto jsme si každý uživatelský požadavek pečlivě rozebrali, aby nás v budoucnu nic nezaskočilo.

A po pěti měsících — více než tisíci hodinách — vývoje, hraní si se systémem a snahou usnadnit plničům co nejvíc práci jsme vypustili do světa druhou verzi LiveInputu. Během testování jsme dostali zhruba 400 bodů k úpravě, ale s tím se počítalo už předem. Aplikace je to obrovská, desítky různých sportů, stovky plničů a roky používání starého systému nejde jen tak lehce obejít a je nutné zapracovat i několikrát opakované výjimky jednotlivých sportů a soutěží. To všechno se našemu týmu podařilo dovést do úspěšného konce.

Modernizovaná verze LiveInputu.
Střídání, nebo žlutou kartu lze plnit i v interaktivním hřišti.
V soupisce může plnič rychle označit i to, že hráč se právě zranil.

Náš systém obecně tvoří velké množství různých nástrojů, jsou jich stovky.

Je to dané tím, že tyto nástroje vznikaly v průběhu posledních několika let. Jde o různé výpisy, nástroje pro zadávání dat, kontrolní výpisy a podobně. Bojujeme s kvantitou a snažíme se tlačit na znovupoužitelnost kódu. Snažíme se nedělat věci duplicitně. Chceme mít přehled, co se v systému děje. Proto systém pečlivě monitorujeme, logujeme a sledujeme výkon. K tomu používáme věci jako InfluxDB, Elasticsearch nebo Grafana.

Nové technologie se postupně snažíme nasazovat na různých místech. U úložišť jsme dříve na vyhledávání používali Sphinx, nyní přecházíme na Elasticsearch. Pro vývoj a testování používáme již několik let Docker. V našem vývojovém Docker clusteru máme celé prostředí podobně jako na produkci. V kombinaci s Jenkinsem tak máme celkem komfortní prostředí pro spouštění unit a integračních testů. Máme i takový malý „bonzovací“ systém, který nám na obrazovce okamžitě říká, kdo něco rozbil.

Občas je potřeba opravit si rozbité testy.

Nový sport? Týdny, ale klidně i měsíce práce

Když chceme do naší nabídky přidat nový sport, musíme se ho nejdřív naučit. Někdy to jde poměrně rychle, mimo jiné proto, že velká část z nás jsou sportovci a fanoušci. Ale třeba u takového kriketu to není úplně jednoduché, přeci jenom jde o poněkud exotickou záležitost.

V rámci učení se daného sportu je třeba se podívat, jak se hraje, jak vypadá, jak hráči běhají po hřišti, jak se počítají statistiky a tak dále. Vytváří se logika toho, co se děje a co všechno se má počítat. V podstatě si děláme algoritmy na základě pozorování sportu.

Vždy je třeba zohledňovat řadu parametrů. U tenisu jsou mraky výjimek a některé soutěže mají vlastní pravidla. Ve sportu se vždy najde jedna soutěž na planetě, která si udělá vlastní výjimku a ta nám všechno rozbije. Implementace složitějšího sportu může trvat pár měsíců. Když jsou si sporty hodně podobné, je to klidně i otázka týdne — typickým příkladem jsou volejbal a plážový volejbal. Ale vývoj kriketu trval zhruba rok. Zároveň zde platí Paretův princip. Fotbal nám dal nejméně práce a sleduje ho 80 až 90 % lidí, zatímco kriket byl nejnáročnější a publikum u nás má výrazně nižší. Je ovšem pravdou, že potenciál v jeho případě je na Livesportu značný.

Při nasazování nového sportu do naší nabídky se nevytváří kompletní systém najednou. Často vyvíjíme prototypy, ověřujeme je, předěláváme, upravujeme a dolaďujeme. Vývoj koordinujeme s dalšími týmy v rámci Livesportu

Práce pro miliony uživatelů

Práce v Livesportu je obecně pro ty, kdo chtějí dělat na velkém produktu a dlouhodobě se o něj starat. Vyvíjíme stabilní produkt, který tady ještě dlouho bude a bude třeba ho udržovat a vylepšovat. Zároveň nejde pouze o udržování „legacy“ kódu, ale o neustálé a postupné inovace.

Výhodou je i to, že vaši práci uvidí miliony lidí po celém světě.

U nás v DataCore týmu, kde aktuálně pracuje šest lidí a který chceme rozšiřovat, se také uplatní lidé, kteří mají rádi data a rádi si s nimi hrají.

Pro naše zaměstnance je práce v Livesportu také ideálním skloubením dvou velkých koníčků, a sice informačních technologií a sportu.


Zaujalo tě, co v Livesportu děláme? Přidej se k nám!

Livesport Dev

Od vývojářů pro vývojáře.

Livesport

Written by

Livesport

Livesport Dev

Od vývojářů pro vývojáře.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade