5. 12. 2016

Jak vypadá vnitřek středně velkého webu

Zajímá vás, jak se píše webová aplikace pro 20 tisíc e-shopů? Petr Novák, šéf vývoje služby Zboží.cz, představuje, jak funguje produktová databáze s 80 miliony nabídek a co je potřeba k tomu, aby uměla spolehlivě rozlišit například pračky s horním plněním od těch s plněním zepředu. Dozvíte se také, které technologie využívají roboti stahující XML feedy z e-shopů, a proč je Párovač jednou z nejdůležitějších komponent Zboží.cz.

Webovou aplikaci, která si skladuje data v MySQL, umí je vypisovat a přes administraci editovat, napsal v nějaké fázi svého života skoro každý programátor. Když ale přidáme zpracování XML z 20 tisíc e-shopů, fulltextové vyhledávání a statistiky zobrazení, a budeme chtít, aby to bez výpadků zobrazovalo přes milion stránek denně, přestane jeden webserver stačit.

V Seznam.cz píšeme všechny služby tak, aby přežily vyřazení celého datacentra. Pro komponenty neskladující data to znamená prosté spuštění více instancí v různých lokalitách. A tam, kde nějaké informace jsou, je třeba řešit replikaci. U MySQL používáme klasickou Master-slave s alespoň dvěma servery v každé lokalitě (kdyby shořelo jedno datacentrum, nenecháme se přece nachytat vypadlým serverem v tom zbylém).

V MySQL (resp. Percona) databázích na Zboží.cz skladujeme skoro všechna zajímavá data. Jde zejména o produktovou databázi a přes 80 milionů nabídek z jednotlivých e-shopů. Hlavní web však na databáze nesahá, protože většinu dat vydáváme přímo z fulltextového indexu. Důvodem je opět spolehlivost. Vyhledávání potřebujeme, a když už jej máme, je jednodušší z něj brát všechno. Jinak bychom byli závislí na dalších věcech, které se mohou rozbít. Využíváme naši fulltextovou technologii, která je od základu distribuovaná. Proto index žije na několika fyzických serverech, odkud se data přes další vyhledávací komponenty dostávají až na veřejné API a dál, na web napsaný v AngularJS.

Rozlišovat pračky s horním plněním, filtraci podle výdejních míst a jiné libůstky jsme fulltextový vyhledávač učili přes rok. A stálo to za to. Letos v létě jsme za měsíc napsali přednostní zobrazování zajímavých nabídek v kategorii Oblečení a móda. Můžeme také experimentovat s lepším řazením jednotlivých výsledků, například v AB testech.


Komponenty Zboží.cz

Mimo hlavní webové stránky má Zboží.cz i administraci, na které je jasně vidět, že jde o časem prověřený kus softwaru. Je napsaná v Pythonu, ze kterého přes firemní TEng generuje HTML. Postupně do ní připisujeme AJAXová volání, z nichž nejvýraznější jsou zatím asi statistiky provozoven. Naopak skoro neznatelný je přepis backendu statistik, které jsme z původní sady přeplněných SQL tabulek přestěhovali do Elasticsearch clusterů.

Téměř na druhém konci Zboží.cz jsou roboti stahující XML feedy z e-shopů. Roboti jsou v C++ a úlohy si berou z RabbitMQ. Jako mezi-úložiště dat používají Cassandru. Z té jsme o poznání méně šťastní než z Elasticu. Cassandra sice zvládá úctyhodné množství zápisů a při správném nastavení konzistence dokáže všechna zapsaná data i vrátit, ale nestíhá odmazávat zastaralé revize a musíme jí proto pomáhat ručně.

image

Mapování komponent Zboží (šipka označuje párovač). Obrázek ve větší kvalitě

Jednou z nejdůležitějších komponent je Párovač. Ten prochází nabídky e-shopů a přiřazuje je k produktům. Je napsaný v C++ a v ideálním světě by jeho jádrem byl jeden IF porovnávající EAN kódy. V praxi Párovač vyhodnocuje pro každou nabídku a každý produkt několik desítek signálů. Podle nich pak pomocí rozhodovacích stromů počítá míru jistoty, že jde o tu samou věc.

Fungování vývoje

Vývoj na Zboží.cz se příliš neliší od fungujících týmů kdekoli jinde. Používáme Scrum, máme vlastního scrum mastera a produktové manažery. Ti připravují a případně upřesňují zadání. Kód verzujeme v Gitu, na nový píšeme automatické testy (část jich pouští Jenkins, část Gitlab CI). Code reviews děláme v Review Boardu, stav sprintů sledujeme v Trellu, menší tasky v Tracu.

Seznam.cz jede na Debianu, takže administrátorům provozních serverů posíláme Debian balíčky. Časem asi aplikace poběží v Docker kontejnerech, dnes v nich pouštíme některé buildy.

Backend dnes dělají tři vývojové týmy: jeden v Brně, který pracuje hlavně na vyhledávání. Další dva Praze udržují zbytek backendu, od robotů až po administraci. Webmastera máme zatím jednoho v Praze.

V roce 2017 nás čeká další rozvoj technologií i funkčnosti, proto stále hledáme nové kolegy a kolegyně, kteří Zboží.cz budou spolu s námi dál posouvat. Na podrobnosti se koukněte na výpis volných pozic

Petr Novák,

Vedoucí týmu vývoje služby Zboží.cz

image

Fotka ve větší kvalitě ke stažení.