Äau Habr! Mani sauc Maksims Vasiļjevs, es strÄdÄju par analÄ«tiÄ·i un projektu vadÄ«tÄju uzÅÄmumÄ FINCH. Å odien es vÄlos jums pastÄstÄ«t, kÄ, izmantojot ElasticSearch, mÄs varÄjÄm apstrÄdÄt 15 miljonus pieprasÄ«jumu 6 minÅ«tÄs un optimizÄt ikdienas slodzes viena mÅ«su klienta vietnÄ. DiemžÄl nÄksies iztikt bez nosaukumiem, jo āāmums ir NDA, ceram, ka raksta saturs no tÄ necietÄ«s. Ejam.
KÄ projekts darbojas
SavÄ aizmugurÄ mÄs veidojam pakalpojumus, kas nodroÅ”ina mÅ«su klientu vietÅu un mobilÄs aplikÄcijas veiktspÄju. VispÄrÄjo struktÅ«ru var redzÄt diagrammÄ:
Darba procesÄ apstrÄdÄjam lielu skaitu darÄ«jumu: pirkumus, maksÄjumus, operÄcijas ar lietotÄju bilancÄm, par kurÄm glabÄjam daudz žurnÄlu, kÄ arÄ« importÄjam un eksportÄjam Å”os datus uz ÄrÄjÄm sistÄmÄm.
Ir arÄ« reversie procesi, kad mÄs saÅemam datus no klienta un nododam tos lietotÄjam. TurklÄt joprojÄm pastÄv procesi darbam ar maksÄjumiem un bonusu programmÄm.
ÄŖss fons
SÄkotnÄji mÄs izmantojÄm PostgreSQL kÄ vienÄ«go datu krÄtuvi. TÄ standarta priekÅ”rocÄ«bas DBVS: transakciju klÄtbÅ«tne, izstrÄdÄta datu izlases valoda, plaÅ”s integrÄcijas rÄ«ku klÄsts; apvienojumÄ ar labu sniegumu diezgan ilgu laiku apmierinÄja mÅ«su vajadzÄ«bas.
MÄs Postgres glabÄjÄm pilnÄ«gi visus datus: no darÄ«jumiem lÄ«dz ziÅÄm. TaÄu pieauga lietotÄju skaits un lÄ«dz ar to arÄ« pieprasÄ«jumu skaits.
Lai saprastu, 2017. gadÄ ikgadÄjais sesiju skaits tikai galddatora vietnÄ ir 131 miljons. 2018. gadÄ - 125 miljoni. 2019. gadÄ atkal 130 miljoni. Pievienojiet vÄl 100-200 miljonus no vietnes mobilÄs versijas un mobilÄs aplikÄcijas, un jÅ«s saÅems milzÄ«gu skaitu pieprasÄ«jumu.
Projektam augot, Postgres pÄrstÄja tikt galÄ ar slodzi, mums nebija laika - parÄdÄ«jÄs liels skaits dažÄdu vaicÄjumu, kuriem nevarÄjÄm izveidot pietiekamu skaitu indeksu.
MÄs sapratÄm, ka ir nepiecieÅ”ami citi datu krÄtuves, kas nodroÅ”inÄtu mÅ«su vajadzÄ«bas un noÅemtu PostgreSQL slodzi. KÄ iespÄjamÄs iespÄjas tika uzskatÄ«tas Elasticsearch un MongoDB. PÄdÄjais zaudÄja ar Å”Ädiem punktiem:
- LÄns indeksÄÅ”anas Ätrums, jo pieaug datu apjoms indeksos. Izmantojot Elastic, Ätrums nav atkarÄ«gs no datu apjoma.
- Nav pilna teksta meklÄÅ”anas
TÄpÄc mÄs izvÄlÄjÄmies Elastic sev un gatavojÄmies pÄrejai.
PÄreja uz elastÄ«go
1. SÄkÄm pÄreju no tirdzniecÄ«bas vietu meklÄÅ”anas servisa. MÅ«su klientam kopumÄ ir aptuveni 70 000 tirdzniecÄ«bas vietu, un tas prasa vairÄku veidu meklÄÅ”anu vietnÄ un lietojumprogrammÄ:
- Teksta meklÄÅ”ana pÄc pilsÄtas nosaukuma
- Ä¢eomeklÄÅ”ana noteiktÄ rÄdiusÄ no kÄda punkta. PiemÄram, ja lietotÄjs vÄlas redzÄt, kuras tirdzniecÄ«bas vietas atrodas vistuvÄk viÅa mÄjÄm.
- MeklÄt pÄc dotÄ kvadrÄta ā lietotÄjs uzzÄ«mÄ kvadrÄtu kartÄ, un viÅam tiek parÄdÄ«ti visi punkti Å”ajÄ rÄdiusÄ.
- MeklÄt pÄc papildu filtriem. TirdzniecÄ«bas vietas atŔķiras viena no otras sortimentÄ
Ja mÄs runÄjam par organizÄciju, tad Postgres mums ir datu avots gan kartei, gan ziÅÄm, un elastÄ«gajos momentuzÅÄmumos tiek Åemti no sÄkotnÄjiem datiem. Fakts ir tÄds, ka sÄkotnÄji Postgres nevarÄja tikt galÄ ar meklÄÅ”anu pÄc visiem kritÄrijiem. Ne tikai bija daudz indeksu, tie varÄja arÄ« pÄrklÄties, tÄpÄc Postgres plÄnotÄjs apmaldÄ«jÄs un nesaprata, kuru indeksu izmantot.
2. NÄkamÄ rindÄ bija ziÅu sadaļa. PublikÄcijas vietnÄ parÄdÄs katru dienu, lai lietotÄjs nepazustu informÄcijas plÅ«smÄ, dati ir jÄsakÄrto pirms izdoÅ”anas. Å Ä« ir meklÄÅ”ana: jÅ«s varat meklÄt vietnÄ pÄc teksta atbilstÄ«bas un tajÄ paÅ”Ä laikÄ pievienot papildu filtrus, jo arÄ« tie tiek veikti, izmantojot Elastic.
3. PÄc tam mÄs pÄrcÄlÄm darÄ«jumu apstrÄdi. LietotÄji vietnÄ var iegÄdÄties noteiktu produktu un piedalÄ«ties balvu izlozÄ. PÄc Å”Ädiem pirkumiem mÄs apstrÄdÄjam lielu datu apjomu, Ä«paÅ”i brÄ«vdienÄs un svÄtku dienÄs. SalÄ«dzinÄjumam, ja parastÄs dienÄs pirkumu skaits ir kaut kur starp 1,5-2 miljoniem, tad brÄ«vdienÄs Å”is rÄdÄ«tÄjs var sasniegt 53 miljonus.
TajÄ paÅ”Ä laikÄ dati ir jÄapstrÄdÄ pÄc iespÄjas Ä«sÄkÄ laikÄ ā lietotÄjiem nepatÄ«k gaidÄ«t rezultÄtu vairÄkas dienas. Izmantojot Postgres, Å”Ädus termiÅus nevar sasniegt ā mÄs bieži saÅÄmÄm slÄdzenes, un, kamÄr mÄs apstrÄdÄjÄm visus pieprasÄ«jumus, lietotÄji nevarÄja pÄrbaudÄ«t, vai viÅi ir saÅÄmuÅ”i balvas. Tas nav Ä«paÅ”i patÄ«kami biznesam, tÄpÄc mÄs pÄrcÄlÄm apstrÄdi uz Elasticsearch.
Periodiskums
Tagad atjauninÄjumi ir konfigurÄti, pamatojoties uz notikumiem, saskaÅÄ ar Å”Ädiem nosacÄ«jumiem:
- TirdzniecÄ«bas vietas. TiklÄ«dz mÄs saÅemam datus no ÄrÄja avota, mÄs nekavÄjoties sÄkam atjauninÄÅ”anu.
- Jaunumi. TiklÄ«dz kÄds jaunums tiek rediÄ£Äts vietnÄ, tas tiek automÄtiski nosÅ«tÄ«ts uz Elastic.
Å eit atkal ir vÄrts pieminÄt Elastic priekÅ”rocÄ«bas. Postgres, nosÅ«tot pieprasÄ«jumu, ir jÄgaida, lÄ«dz tas godÄ«gi apstrÄdÄ visus ierakstus. Varat nosÅ«tÄ«t 10 XNUMX ierakstu uz Elastic un nekavÄjoties sÄkt darbu, negaidot, kamÄr ieraksti tiks izplatÄ«ti pa visÄm Shards. Protams, daži Shard vai Replica var neredzÄt datus uzreiz, taÄu viss bÅ«s pieejams ļoti drÄ«z.
IntegrÄcijas metodes
Ir 2 veidi, kÄ integrÄt ar Elastic:
- Izmantojot vietÄjo klientu, izmantojot TCP. VietÄjais draiveris pamazÄm izmirst: tas vairs netiek atbalstÄ«ts, tam ir ļoti neÄrta sintakse. TÄpÄc mÄs to praktiski neizmantojam un cenÅ”amies pilnÄ«bÄ atteikties.
- Izmantojot HTTP saskarni, kas var izmantot gan JSON pieprasÄ«jumus, gan Lucene sintaksi. PÄdÄjais ir teksta dzinÄjs, kas izmanto Elastic. Å ajÄ versijÄ mÄs iegÅ«stam iespÄju pakeÅ”ot, izmantojot JSON pieprasÄ«jumus, izmantojot HTTP. Å o iespÄju mÄs cenÅ”amies izmantot.
Pateicoties HTTP interfeisam, mÄs varam izmantot bibliotÄkas, kas nodroÅ”ina HTTP klienta asinhronu ievieÅ”anu. MÄs varam izmantot Batch un asinhronÄs API priekÅ”rocÄ«bas, kas nodroÅ”ina augstu veiktspÄju, kas ļoti palÄ«dzÄja lielÄs reklÄmas dienÄs (vairÄk par to tÄlÄk).
Daži skaitļi salÄ«dzinÄjumam:
- Postgres bounty lietotÄju saglabÄÅ”ana 20 pavedienos bez grupÄÅ”anas: 460713 ieraksti 42 sekundÄs
- ElastÄ«gs + reaktÄ«vs klients 10 pavedieniem + partija 1000 elementiem: 596749 ieraksti 11 sekundÄs
- ElastÄ«gs + reaktÄ«vs klients 10 pavedieniem + partija 1000 elementiem: 23801684 ieraksti 4 minÅ«tÄs
Tagad esam uzrakstÄ«juÅ”i HTTP pieprasÄ«jumu pÄrvaldnieku, kas veido JSON kÄ pakeÅ”u/nevis pakeÅ”u un nosÅ«ta to caur jebkuru HTTP klientu neatkarÄ«gi no bibliotÄkas. Varat arÄ« izvÄlÄties sÅ«tÄ«t pieprasÄ«jumus sinhroni vai asinhroni.
DažÄs integrÄcijÄs mÄs joprojÄm izmantojam oficiÄlo transporta klientu, taÄu tas ir tikai nÄkamÄs pÄrveidoÅ”anas jautÄjums. Å ajÄ gadÄ«jumÄ apstrÄdei tiek izmantots pielÄgots klients, kas izveidots, pamatojoties uz Spring WebClient.
liela akcija
Reizi gadÄ projekts rÄ«ko lielu reklÄmu lietotÄjiem - Ŕī ir tÄ pati Highload, jo Å”obrÄ«d mÄs strÄdÄjam ar desmitiem miljonu lietotÄju vienlaikus.
Parasti slodžu maksimumi notiek brÄ«vdienÄs, taÄu Ŕī akcija ir pavisam citÄ lÄ«menÄ«. AizpÄrn akcijas dienÄ pÄrdevÄm 27 580 890 preÄu vienÄ«bas. Dati tika apstrÄdÄti vairÄk nekÄ pusstundu, kas lietotÄjiem sagÄdÄja neÄrtÄ«bas. LietotÄji saÅÄma balvas par dalÄ«bu, taÄu kļuva skaidrs, ka process ir jÄpaÄtrina.
2019. gada sÄkumÄ mÄs nolÄmÄm, ka mums ir nepiecieÅ”ams ElasticSearch. Veselu gadu organizÄjÄm saÅemto datu apstrÄdi Elastic un to izsniegÅ”anu mobilÄs aplikÄcijas un mÄjaslapas api. RezultÄtÄ nÄkamajÄ gadÄ kampaÅas laikÄ mÄs apstrÄdÄjÄm 15 131 783 ieraksti 6 minÅ«tÄs.
TÄ kÄ mums ir daudz cilvÄku, kas vÄlas iegÄdÄties preces un piedalÄ«ties balvu izlozÄ akcijÄs, tad Å”is ir pagaidu pasÄkums. Tagad mÄs nosÅ«tÄm jaunÄko informÄciju Elastic, bet nÄkotnÄ plÄnojam arhivÄto informÄciju par pÄdÄjiem mÄneÅ”iem nodot Postgres kÄ pastÄvÄ«gu krÄtuvi. Lai neaizsprostotu Elastic indeksu, kam arÄ« ir savi ierobežojumi.
SecinÄjums/SecinÄjumi
Å obrÄ«d esam pÄrcÄluÅ”i uz Elastic visus pakalpojumus, kurus vÄlÄjÄmies, un pagaidÄm esam to apturÄjuÅ”i. Tagad mÄs veidojam Elastic indeksu virs galvenÄs pastÄvÄ«gÄs krÄtuves Postgres, kas pÄrÅem lietotÄja slodzi.
NÄkotnÄ plÄnojam pÄrsÅ«tÄ«t pakalpojumus, ja sapratÄ«sim, ka datu pieprasÄ«jums kļūst pÄrÄk daudzveidÄ«gs un tiek meklÄts neierobežotÄ skaitÄ kolonnu. Tas vairs nav Postgres uzdevums.
Ja mums ir nepiecieÅ”ama pilna teksta meklÄÅ”ana funkcionalitÄtÄ vai ja mums ir daudz dažÄdu meklÄÅ”anas kritÄriju, tad mÄs jau zinÄm, ka tas ir jÄpÄrtulko elastÄ«gajÄ valodÄ.
āāā
Paldies, ka izlasÄ«jÄt. Ja arÄ« jÅ«su uzÅÄmums izmanto ElasticSearch un tam ir savi ievieÅ”anas gadÄ«jumi, pastÄstiet mums. BÅ«s interesanti uzzinÄt, kÄ klÄjas citiem š
Avots: www.habr.com