Tere, Habr! Minu nimi on Maksim Vasiljev, töötan analĂŒĂŒtiku ja projektijuhina FINCHis. TĂ€na tahan rÀÀkida, kuidas me ElasticSearch'i abil suutsime töödelda 15 miljonit pĂ€ringut kuue minutiga ja optimeerida iga pĂ€ev koormust meie kliendi veebisaidil. Kahjuks peame hakkama ilma nimedeta, kuna meil on NDA, loodan, et artikli sisu sellest ei kannata. alustame.
Kuidas projekt on korraldatud
Meie tagaosas loome teenuseid, mis tagavad meie kliendi veebisaitide ja mobiilirakenduse toimimise. Ălevaate struktuurist saab nĂ€ha skeemilt:

Töötamise kĂ€igus töötleme suurt hulka tehinguid: oste, vĂ€ljamakseid, kasutajate saldooperatsioone, mille kohta sĂ€ilitame palju logisid, samuti impordime ja ekspordime neid andmeid vĂ€listesse sĂŒsteemidesse.
Samuti toimuvad tagasiprotsessid, kui saame andmeid kliendilt ja edastame need kasutajatele. Lisaks on veel maksete ja boonuste programmidega seonduvad protsessid.
LĂŒhikene eelajaloo
Alguses kasutasime ainulaadse andmete salvestusena PostgreSQLi. Selle standardseid andmebaaside eeliseid: tehingud, arenenud andmete pÀringukeel, lai integreerimise tööriistade kogum; koos hea jÔudlusega rahuldas meie vajadusi piisavalt kaua.
SÀilitasime Postgresis absoluutselt kÔik andmed: tehingutest kuni uudisteni. Kuid kasutajate arv kasvas ja koos sellega ka pÀringute arv.
Arusaamiseks, aastane seansside arv 2017. aastal ainult lauaarvutite veebisaidil - 131 miljonit. 2018 - 125 miljonit. 2019, jÀlle 130 miljonit. Lisage sinna veel 100-200 miljonit mobiiliversiooni ja mobiilirakenduse pÀringutest ning saate tohutu hulga pÀringuid.
Kuna projekt kasvas, ei suutnud Postgres koormusega enam toime tulla, me jÀime maha - ilmus suur hulk erinevaid pÀringuid, mille jaoks ei suutnud me piisavalt indekseid luua.
MÔistsime, et on vajadus teiste andmete salvestamise lahenduste jÀrele, mis tagaksid meie vajadused ja leevendaksid PostgreSQL-i koormust. VÔimalike variantidena kaalume Elasticsearch'i ja MongoDB-d. Viimane kaotas jÀrgmistes punktides:
- Andmete indekseerimise aeglustumine koos indeksi mahu kasvuga. Elasticis kiirus ei sÔltu andmete mahust.
- Puudub tÀisteksti otsing
Nii valisime endale Elasticu ja valmistusime ĂŒleminekuks.
Ăleminek Elasticule
1. Alustasime ĂŒleminekut mĂŒĂŒgikohtade otsinguteenusele. Meie kliendil on kokku umbes 70 000 mĂŒĂŒgikohta ja samas on veebilehe ja rakenduse jaoks vajalikud mitmed otsingu tĂŒĂŒbid:
- Tekstiotsing asula nime jÀrgi
- Geotsing mÀÀratud raadiuses mĂ”nest punktist. NĂ€iteks, kui kasutaja soovib nĂ€ha, millised mĂŒĂŒgikohad on tema kodule kĂ”ige lĂ€hemal.
- Otsing mÀÀratud ruudu jĂ€rgi â kasutaja joonistab kaardile ruudu ja talle nĂ€idatakse kĂ”iki punkte selle raadiuse sees.
- Otsing tĂ€iendavate filtrite jĂ€rgi. MĂŒĂŒgikohad erinevad omavahel tootevaliku poolest.
Kui rÀÀkida organiseerimisest, siis Postgresis on meil andmeallikas nii kaardi kui ka uudiste jaoks, ja Elasticis tehakse Snapshoot originaalandmetest. Asi on selles, et algselt Postgres ei suudnud kĂ”igi kriteeriumide jĂ€rgi otsingut teha. KĂŒll oli palju indekseid, mis vĂ”isid ka ĂŒksteisega kattuda, seetĂ”ttu kadus Postgresi planeerija Ă€ra ja ei saanud aru, millist indeksit kasutada.
2. JĂ€rgmine oli uudiste rubriik. Veebilehel ilmuvad iga pĂ€ev publikatsioonid, et kasutaja ei eksiks informatsiooni tulvas, tuleb andmed enne esitlust sorteerida. Selleks ongi vaja otsingut: veebilehel saab otsida tekstiĂŒhenduse jĂ€rgi ning samal ajal aktiveerida tĂ€iendavad filtrid, kuna need on samuti tehtud lĂ€bi Elasticu.
3. Siis viisime ĂŒle tehingute töötlemise. Kasutajad saavad veebilehe kaudu osta teatud kaupu ja osaleda auhindade loosimises. PĂ€rast selliseid oste töötleme me suurt hulka andmeid, eriti nĂ€dalavahetustel ja pĂŒhal. Kui vĂ”rrelda, siis tavapĂ€evadel on ostude arv umbes 1,5-2 miljonit, siis pĂŒhal vĂ”ib number ulatuda 53 miljoni juurde.
Samuti tuleb andmeid töödelda minimaalse aja jooksul - kasutajad ei tunne oodatud tulemusi mitu pÀeva. Postgresi kaudu selliseid tÀhtaegu kuidagi ei saavutada - me saime tihti lukustusi ja kuni me töötlesime kÔiki pÀringuid, ei saanud kasutajad kontrollida, kas nad said auhindu vÔi mitte. See ei ole Àri jaoks mugav, seetÔttu viisime töötlemise Elasticsearchi.
Sagedus
Praegu on vĂ€rskendused seadistatud sĂŒndmuspĂ”hiselt jĂ€rgmiste tingimuste alusel:
- MĂŒĂŒgikohad. Niikaua kui me saame andmeid vĂ€listest allikatest, kĂ€ivitame me kohe vĂ€rskenduse.
- Uudised. Kui veebisaidil redigeeritakse mÔnda uudist, saadetakse see automaatselt Elasticusse.
Siin tasub veel kord mainida Elasticu eeliseid. Postgres'i puhul tuleb pÀringu esitamisel oodata, kuni see kÔiki kirjeid Ôiglaselt töötleb. Elasticus saab saata 10 tuhat kirjet ja alustada kohe töötamist, oodates, kuni kirjed kÔikide shardide vahel jaotuvad. Muidugi vÔib mÔni shardi vÔi koopiamoodul andmeid kohe mitte nÀha, kuid vÀga varsti on kÔik saadaval.
Integratsiooni viisid
Elasticusse integreerimiseks on kaks vÔimalust:
- Kasutades natiivset kliendi TCP kaudu. Natiivne draiver on jĂ€rk-jĂ€rgult kadumas: seda ei toetata enam, selle sĂŒntaks on vĂ€ga ebamugav. SeetĂ”ttu ei kasuta me seda praktiliselt ja pĂŒĂŒame sellest tĂ€ielikult loobuda.
- HTTP liidese kaudu, kus saab kasutada nii JSON pĂ€ringuid kui ka Lucene sĂŒntaksit. Viimane on tekstimootor, mida Elastic kasutab. Sellisel juhul saame Batch vĂ”imaluse kaudu HTTP kaudu JSON-pĂ€ringute abil. Just seda varianti pĂŒĂŒame kasutada.
TĂ€nu HTTP liidesele saame kasutada teeke, mis pakuvad asĂŒnkroonset HTTP kliendi teostust. Me saame kasutada Batch ja asĂŒnkroonse API eelist, mis lĂ”puks annab kĂ”rge tootlikkuse, mis aitas oluliselt suure aktsiooni pĂ€evadel (sellest allpool)
Veidi numbreid vÔrdlemiseks:
- Postgres'is kasutajate, kes said auhindu, salvestamine 20 lÔimes ilma grupeerimisteta: 460713 kirjet 42 sekundi jooksul
- Elastic + reaktiivne klient 10 lÔime + batch 1000 elementi: 596749 kirjet 11 sekundiga
- Elastic + reaktiivne klient 10 lÔime + batch 1000 elementi: 23801684 kirjet 4 minuti jooksul
Praegu oleme kirjutanud HTTP pĂ€ringute halduri, mis koostab JSON-i, olgu tegemist Batch'i/ne Batche'iga ja saadab selle igasuguse HTTP kliendi kaudu sĂ”ltumata teegist. Samuti saab valida, kas saata pĂ€ringud sĂŒnkroonselt vĂ”i asĂŒnkroonselt.
MĂ”nedes integreerimistes kasutame endiselt ametlikku transport klienti, kuid see on vaid kĂŒsimus lĂ€hituleviku refaktorimisest. Samuti kasutatakse töötlemiseks enda klienti, mis on ĂŒles ehitatud Spring WebClienti baasil.

Suur aktsioon
Kord iga aastas toimub projektis suur kampaania kasutajatele â see on see tĂ”eline Highload, kuna sel ajal töötame korraga kĂŒmnete miljonite kasutajatega.
Tavaliselt on koormuse tipud pĂŒhade pĂ€evadel, kuid see kampaania on hoopis teise taseme. Eelmise aasta kampaaniapĂ€eval mĂŒĂŒsime 27 580 890 toodet. Andmed töötleti ĂŒle poole tunni, mis tekitas kasutajatele ebamugavust. Kasutajad said osalemise eest auhindu, kuid oli selge, et protsessi tuleb kiirendada.
2019. aasta alguses otsustasime, et vajame ElasticSearchi. Kogu aasta korraldasime saadud andmete töötlemist Elasticus ja nende vÀljastamist mobiilirakenduse ja veebisaidi API kaudu. LÔpuks jÀrgmise aasta kampaania ajal töötlesime 15 131 783 kirjeid 6 minuti jooksul.
Kuna soovijaid osta tooteid ja osaleda auhindade loosimistes on meil vĂ€ga palju, on see ajutine lahendus. Praegu saadame asjakohast teavet Elasticusse, kuid tulevikus plaanime arhiiviandmed eelmiste kuude kohta viia Postgresse, kui pĂŒsivat ladustamist. Et mitte ummistada Elasticu indeksit, millel on samuti oma piirangud.
JĂ€reldus/ĂŒlevaated
Praeguseks oleme viinud Elasticusse kĂ”ik teenused, mida soovisime, ja oleme sellel hetkel teinud pausi. Praegu ehitame pĂ”hjaliku pĂŒsiva ladustamise kohal Postgress Elasticus indeksi, mis talub kasutaja koormust.
Tulevikus plaanime teenuste ĂŒleviimist, kui saame aru, et andmepĂ€ringud muutuvad liiga mitmekesisteks ja otsitakse piiramatul hulgal veerge. See on juba ĂŒlesanne mitte Postgrese jaoks.
Kui meil on vaja tÀisteksti otsingut funktsionaalsuses vÔi kui meil on palju erinevaid otsingukriteeriume, siis teame juba, et see tuleb viia Elasticusse.
âââ
AitĂ€h, et lugesite. Kui teie ettevĂ”ttes kasutatakse samuti ElasticSearchi ja teil on oma rakenduse juhtumeid, siis jagage seda. Huvitav oleks teada, kuidas teised seda teevad đ
Allikas: habr.com
