Tere, Habr! Minu nimi on Maksim Vasiljev, olen analĂŒĂŒtik ja projektijuht ettevĂ”ttes FINCH. TĂ€na tahaksin rÀÀkida, kuidas suudame ElasticSearchi abil töödelda 15 miljonit pĂ€ringut kuue minutiga ning optimeerida igapĂ€evase koormuse ĂŒhele meie kliendi veebilehtedest. Kahjuks peame olude tĂ”ttu jÀÀma nimedeta, kuna meil on non-disclosure agreement (NDA), loodame, et artikli sisu sellest ei kannata. Alustame.
Kuidas projekt on korraldatud
Meie tagaplaanil loome teenuseid, mis tagavad meie kliendi veebisaitide ja mobiilirakenduse toimimise. Ăldstruktuuri saab nĂ€ha skeemilt:

Töö kĂ€igus töötleme suurt hulka tehinguid: ostud, vĂ€ljamaksed, kasutajate saldooperatsioonid, mille kohta hoiame palju logisid, samuti impordime ja eksportime neid andmeid vĂ€listesse sĂŒsteemidesse.
Samuti toimuvad vastupidised protsessid, kus saame andmeid kliendilt ja edastame need kasutajatele. Lisaks on olemas ka maksete ja boonuste programmidega seotud protsessid.
LĂŒhike taustalugu
Algul kasutati ainsana andmete salvestamiseks PostgreSQL-i. Selle standardsete andmebaaside eeliste hulka kuuluvad tehingute olemasolu, arendatud andmevaliku keel ja lai integreerimistööriistade komplekt; koos hea tootlikkusega rahuldasid need meie vajadusi pikemat aega.
Me hoidsime Postgresis absoluutselt kÔiki andmeid: tehingutest kuni uudisteni. Kuid kasutajate arv kasvas, samas suurenenud ka pÀringute arv.
Kuna mĂ”ista, oli 2017. aastal ainult lauaveebisaidil aastane seansside arv 131 miljonit. 2018. aastal 125 miljonit. 2019. aastal taas 130 miljonit. Lisage sinna veel 100â200 miljonit mobiiliversiooni ja mobiilirakenduse seansse, ja te saate tohutu pĂ€ringute arvu.
Projekti kasvu tĂ”ttu ei suudnud Postgres enam koormusega hakkama saada, me ei jĂ”udnud jĂ€rgi â ilmnes palju erinevaid pĂ€ringute, mille jaoks me ei suutnud luua piisavalt indekseid.
Me mÔistsime, et on vajadus teiste andmesalvestuslahenduste jÀrele, mis suudaksid rahuldada meie vajadusi ja vÀhendada PostgreSQL-i koormust. Vaatasime vÔimalike variantidena Elasticsearchi ja MongoDB-d. Viimane jÀi alla jÀrgmistes punktides:
- Aeglane indekseerimise kiirus andmemahu kasvades. Elasticu kiirus ei sÔltu andmemahust.
- Puudub tÀisteksti otsing
Nii valisime endale Elasticu ja valmistusime ĂŒleminekuks.
Ăleminek Elasticule
1. Alustasime ĂŒleminekut mĂŒĂŒgipunktide otsinguteenusest. Meie kliendil on kokku umbes 70 000 mĂŒĂŒgikohta ning nende hulgas on vajalik mitu tĂŒĂŒpi otsingut veebilehel ja rakenduses:
- TekstipÔhine otsing asula nime jÀrgi
- Geotöötlus antud raadiuses mingist punktist. NĂ€iteks, kui kasutaja soovib nĂ€ha, millised mĂŒĂŒgikohad on tema kodust lĂ€himad.
- Otsing antud ruudu piires â kasutaja joonistab kaardil ruudu ja talle nĂ€idatakse kĂ”iki punkte selles raadiuses.
- Otsing tĂ€iendavate filtrite pĂ”hjal. MĂŒĂŒgikohad erinevad ĂŒksteisest oma tootevalikute poolest.
Organisatsiooni kontekstis asub meil Postgres'is andmeallikas nii kaardi kui uudiste jaoks ning Elasticis tehakse originaalsetest andmetest Snapshot'e. Alguses ei tule Postgres kÔigi kriteeriumide otsinguga toime. Lisaks oli palju indekseid, mis vÔisid omavahel kattuda, mis tÔttu jÀi Postgres'i planeerija segadusse ja ei mÔistnud, millist indeksit kasutada.
JÀrgmine oligi uudiste osa. Igal pÀeval ilmuvad veebilehele avaldused ning et kasutajad ei kaotaks teabevoos suunda, on oluline andmete sorteerimine enne esitamist. Selle jaoks on vajalik otsing: veebilehel saab otsida tekstipÔhiste vasteid ja samas rakendada tÀiendavaid filtreid, kuna need on samuti tehtud lÀbi Elastic'i.
SeejĂ€rel korraldasime tehingute töötlemise ĂŒmber. Kasutajad saavad veebilehelt osta teatud kaupu ja osaleda auhindade loosimises. PĂ€rast selliseid oste töötleme me suures mahus andmeid, eriti nĂ€dalavahetusel ja pĂŒhade ajal. VĂ”rdluseks, kui tavapĂ€evadel on ostude arv umbes 1,5-2 miljonit, siis pĂŒhade ajal vĂ”ib see number ulatuda 53 miljoni juurde.
Kuna andmed tuleb töötada lĂ€bi vĂ”imalikult lĂŒhikese ajaga â kasutajad ei armasta tulemusi mitu pĂ€eva oodata. Postgres puhul ei ole selliseid tĂ€htaegu vĂ”imalik saavutada â me saime sageli lukustusi, ja seni kuni me töötlesime kĂ”iki pĂ€ringuid, ei saanud kasutajad kontrollida, kas nad said auhindu vĂ”i mitte. See ei ole Ă€ri jaoks hea, seega tĂ”stsime töötluse Elasticsearchi.
Perioodilisus
Praegu on uuenduste seadistus sĂŒndmustel pĂ”hinev, jĂ€rgmiste tingimustega:
- MĂŒĂŒgikohtadega. Niipea kui saame andmeid vĂ€lisest allikast, kĂ€ivitame kohe uuenduse.
- Uudised. Kui veebilehel muudetakse mÔnda uudist, saadetakse see automaatselt Elastic'usse.
Siin tasub veel kord rÀÀkida Elasticu eelistest. Postgres'is peab pÀringu saatmisel ootama, kuni see Ôiglaselt töötleb kÔik kirjed. Elastic's saab saata 10 tuhat kirjet ja kohe alustada tööd, ootamata, kuni kirjed kÔigile Shard'idele jaotatakse. Muidugi vÔib mÔni Shard vÔi Replica andmeid kohe mitte nÀha, kuid varsti on kÔik saadaval.
Integreerimise viisid
Elastic'uga integreerimiseks on 2 vÔimalust:
- TCP-natiivklienti kaudu. Natiivne draiver kaob jĂ€rk-jĂ€rgult: seda enam ei toetata ja selle sĂŒntaks on vĂ€ga ebamugav. SeetĂ”ttu kasutame seda praktiliselt mitte ja pĂŒĂŒame sellest tĂ€ielikult loobuda.
- HTTP-liidese kaudu, milles saab kasutada nii JSON-pĂ€ringuid kui ka Luceneâi sĂŒntaksit. Viimane on tekstimootor, mida kasutab Elastic. Sellisel variandil saame Batch vĂ”imaluse lĂ€bi JSON-pĂ€ringute HTTP kaudu. Just seda varianti pĂŒĂŒame kasutada.
HTTP-liidese tĂ”ttu saame kasutada raamatukogusid, mis pakuvad asĂŒnkroonset HTTP-kliendi rakendust. Saame kasutada Batch'i ja asĂŒnkroonse API eeliseid, mis lĂ”puks annab kĂ”rge jĂ”udluse, mis aitas vĂ€ga suurte kampaaniate pĂ€evadel (sellest allpool)
MÔned numbrid vÔrdlemiseks:
- Kasutajate salvestamine, kes said auhindu Postgresis 20 voos ilma grupeerimise: 460713 kirjet 42 sekundi jooksul
- Elastic + reaktiivne klient 10 voo + partiid 1000 elementi: 596749 kirjet 11 sekundi jooksul
- Elastic + reaktiivne klient 10 voo + partiid 1000 elementi: 23801684 kirjet 4 minuti jooksul
Praegu oleme kirjutanud HTTP pĂ€ringute halduri, mis koostab JSON-i, nagu Batch/Batch mitte, ja saadab selle lĂ€bi mistahes HTTP kliendi, sĂ”ltumata raamatukogust. Samuti on vĂ”imalik valida, kas saata pĂ€ringud sĂŒnkroonselt vĂ”i asĂŒnkroonselt.
MĂ”ningates integratsioonides kasutame me endiselt ametlikku transportkliendi, kuid see on vaid lĂ€hitulevikus toimuva refaktoreerimise kĂŒsimus. Sellegipoolest kasutatakse töötlemiseks meie enda klienti, mis on ĂŒles ehitatud Spring WebClient'i baasil.

Suur kampaania
Kord aastas toimub projektis suur kampaania kasutajatele â see on see Hiilakoormus, kuna sel ajal töötame samaaegselt kĂŒmnete miljonite kasutajatega.
Tavaliselt esinevad koormuse tipud pĂŒhade ajal, kuid see kampaania on hoopis teisel tasemel. Eelmisel aastal, kampaania pĂ€eval, mĂŒĂŒsime 27 580 890 kaupa. Andmete töötlemine kests viis ĂŒle poole tunni, mis tekitas kasutajate seas ebamugavust. Kasutajad said osalemise eest auhindu, kuid selgeks sai, et protsessi tuleb kiirendada.
2019. aasta alguses otsustasime, et vajame ElasticSearch'i. Kogu aasta korraldasime saadud andmete töötlemise Elasticus ja nende edastamise mobiilirakenduse ja veebisaidi API-le. LÔpuks jÀrgmisel aastal kampaania ajal töötlesime 15 131 783 kirjet 6 minuti jooksul.
Kuna meil on palju soovijaid osta kaupu ja osaleda loosimistel, on see ajutine lahendus. Praegu saadame vĂ€rsket teavet Elasticusse, kuid tulevikus plaanime arhiivida eelmiste kuude andmed Postgres'i, kui pĂŒsivasse salvestusse. Et mitte ummistada Elasticu indeksi, millel on samuti oma piirangud.
KokkuvÔtted/jÀreldused
KĂ€esoleval hetkel oleme Elasticusse viinud kĂ”ik teenused, mida soovisime, ja nĂŒĂŒd oleme teinud pausi. Praegu ehitame pĂ”hikindla salvestuse peale Postgres'is indeksit Elasticus, mis vĂ”tab enda alla kasutajate koormuse.
Tulevikus plaanime teenuste ĂŒleviimist, kui mĂ”istame, et andmete pĂ€ringud muutuvad liiga mitmekesisteks ja otsitakse piiramatul hulgal veerge. See on juba ĂŒlesanne, mis ei sobi Postgres'ile.
Kui meil on vaja tÀisteksti otsingut vÔi kui meil on palju erinevaid otsingukriteeriume, siis teame juba, et seda tuleb tÔlkida Elasticusse.
âââ
AitĂ€h, et lugesite. Kui teie ettevĂ”ttes kasutatakse samuti ElasticSearch'i ja teil on oma rakenduste nĂ€iteid, siis jagage neid. Oleks huvitav teada, kuidas teised seda teevad đ
Allikas: habr.com
