Optimizasyon chaj sou yon pwojè Highload ak ElasticSearch

Hey Habr! Non mwen se Maxim Vasiliev, mwen travay kòm yon analis ak manadjè pwojè nan FINCH. Jodi a mwen ta renmen di w kouman, lè l sèvi avèk ElasticSearch, nou te kapab trete 15 milyon demann nan 6 minit ak optimize chaj yo chak jou sou sit la nan youn nan kliyan nou yo. Malerezman, nou pral oblije fè san non, depi nou gen yon NDA, nou espere ke kontni an nan atik la pa pral soufri nan sa a. Ann ale.

Ki jan pwojè a mache

Sou backend nou an, nou kreye sèvis ki asire pèfòmans sit entènèt kliyan nou yo ak aplikasyon mobil. Ou ka wè estrikti jeneral la nan dyagram nan:

Optimizasyon chaj sou yon pwojè Highload ak ElasticSearch

Nan pwosesis travay la, nou trete yon gwo kantite tranzaksyon: acha, peman, operasyon ak balans itilizatè, pou ki nou estoke yon anpil nan mòso bwa, osi byen ke enpòte ak ekspòtasyon done sa yo nan sistèm ekstèn.

Genyen tou pwosesis ranvèse lè nou resevwa done nan men kliyan an epi transfere li bay itilizatè a. Anplis de sa, gen toujou pwosesis pou travay ak peman ak pwogram bonis.

Brèf background

Okòmansman, nou te itilize PostgreSQL kòm sèl magazen done. Avantaj estanda li yo pou yon DBMS: prezans nan tranzaksyon, yon lang devlope done echantiyon, yon pakèt zouti pou entegrasyon; konbine avèk bon pèfòmans satisfè bezwen nou yo pou yon tan long.

Nou estoke absoliman tout done nan Postgres: soti nan tranzaksyon ak nouvèl. Men, kantite itilizatè yo te grandi, e avèk li kantite demann yo.

Pou konprann, kantite anyèl la nan sesyon nan 2017 sèlman sou sit la Desktop se 131 milyon dola. Nan 2018 - 125 milyon dola. 2019 ankò 130 milyon dola. Ajoute yon lòt 100-200 milyon dola nan vèsyon an mobil nan sit la ak aplikasyon mobil lan, epi ou pral jwenn yon gwo kantite demann.

Ak kwasans lan nan pwojè a, Postgres sispann fè fas ak chaj la, nou pa t 'gen tan - yon gwo kantite demann divès kalite parèt, pou ki nou pa t' kapab kreye yon kantite ase nan endèks.

Nou te konprann ke te gen yon bezwen pou lòt magazen done ki ta bay bezwen nou yo epi retire chaj la nan PostgreSQL. Elasticsearch ak MongoDB te konsidere kòm opsyon posib. Lèt la pèdi sou pwen sa yo:

  1. Ralanti vitès Indexing kòm kantite done nan endèks ap grandi. Avèk Elastic, vitès la pa depann de kantite done.
  2. Pa gen rechèch tèks konplè

Se konsa, nou te chwazi Elastic pou tèt nou ak prepare pou tranzisyon an.

Tranzisyon nan elastik

1. Nou te kòmanse tranzisyon an soti nan sèvis la rechèch pwen nan vant. Kliyan nou an gen yon total apeprè 70 pwen lavant, e sa mande plizyè kalite rechèch sou sit la ak nan aplikasyon an:

  • Rechèch tèks pa non vil la
  • Geosearch nan yon reyon bay soti nan kèk pwen. Pa egzanp, si itilizatè a vle wè ki pwen lavant ki pi pre lakay li.
  • Chèche pa yon kare bay - itilizatè a trase yon kare sou kat la, epi yo montre li tout pwen nan reyon sa a.
  • Rechèch pa filtè adisyonèl. Pwen lavant yo diferan youn ak lòt nan varyete

Si nou pale sou òganizasyon an, Lè sa a, nan Postgres nou gen yon sous done pou tou de kat la ak nouvèl la, ak nan Snapshots elastik yo pran nan done orijinal yo. Reyalite a se ke okòmansman Postgres pa t 'kapab fè fas ak rechèch la pa tout kritè. Non sèlman te gen anpil endis, yo te kapab tou sipèpoze, kidonk pwogramè Postgres la te pèdi epi li pa t 'konprann ki endèks yo itilize.

2. Next nan liy te seksyon nouvèl la. Piblikasyon parèt sou sit la chak jou pou itilizatè a pa pèdi nan koule enfòmasyon yo, done yo dwe klase anvan yo bay yo. Sa a se sa rechèch se pou: ou ka fè rechèch sou sit la pa matche ak tèks, epi an menm tan an konekte filtè adisyonèl, paske yo te fè tou atravè Elastic.

3. Lè sa a, nou te deplase pwosesis tranzaksyon an. Itilizatè yo ka achte yon sèten pwodwi sou sit la epi patisipe nan yon tiraj prim. Apre acha sa yo, nou trete yon gwo kantite done, espesyalman nan wikenn ak jou ferye. Pou konparezon, si nan jou òdinè kantite acha se yon kote ant 1,5-2 milyon dola, Lè sa a, nan jou ferye figi a ka rive nan 53 milyon dola.

An menm tan an, done yo dwe trete nan tan ki pi kout posib - itilizatè yo pa renmen tann pou rezilta a pandan plizyè jou. Pa gen okenn fason pou reyalize dat limit sa yo atravè Postgres - nou souvan te resevwa kadna, epi pandan ke nou t ap trete tout demann, itilizatè yo pa t 'kapab tcheke si yo te resevwa pri oswa ou pa. Sa a pa trè bèl pou biznis, kidonk nou te deplase pwosesis la nan Elasticsearch.

Peryodikite

Koulye a, mizajou yo konfigirasyon ki baze sou evènman, dapre kondisyon sa yo:

  1. Pwen lavant yo. Le pli vit ke nou resevwa done ki soti nan yon sous ekstèn, nou imedyatman kòmanse aktyalizasyon a.
  2. Nouvèl. Le pli vit ke nenpòt nouvèl modifye sou sit la, li otomatikman voye bay Elastic.

Isit la ankò li vo mansyone avantaj ki genyen nan Elastik. Nan Postgres, lè w ap voye yon demann, ou dwe tann jiskaske li onètman trete tout dosye yo. Ou ka voye 10 dosye bay Elastic epi kòmanse travay imedyatman, san w pa tann dosye yo distribye atravè tout Shards. Natirèlman, kèk Shard oswa Replik ka pa wè done yo touswit, men tout bagay ap disponib trè byento.

Metòd entegrasyon

Gen 2 fason pou entegre ak Elastic:

  1. Atravè yon kliyan natif natal sou TCP. Chofè natif natal la ap mouri piti piti: li pa sipòte ankò, li gen yon sentaks trè konvenyan. Se poutèt sa, nou pratikman pa sèvi ak li epi eseye konplètman abandone li.
  2. Atravè yon koòdone HTTP ki ka itilize tou de demann JSON ak sentaks Lucene. Dènye a se yon motè tèks ki sèvi ak elastik. Nan vèsyon sa a, nou jwenn kapasite nan pakèt atravè demann JSON sou HTTP. Sa a se opsyon nou ap eseye itilize.

Mèsi a koòdone HTTP a, nou ka itilize bibliyotèk ki bay yon aplikasyon asynchrone nan kliyan an HTTP. Nou ka pran avantaj de pakèt ak API asynchrone a, ki rezilta nan pèfòmans segondè, ki te ede anpil nan jou yo nan pwomosyon nan gwo (plis sou sa ki anba a)

Kèk nimewo pou konparezon:

  • Sove itilizatè Bounty Postgres nan 20 fil san gwoupman: 460713 dosye nan 42 segonn
  • Elastik + reyaktif kliyan pou 10 fil + pakèt pou 1000 eleman: 596749 dosye nan 11 segonn
  • Elastik + reyaktif kliyan pou 10 fil + pakèt pou 1000 eleman: 23801684 antre nan 4 minit

Koulye a, nou te ekri yon manadjè demann HTTP ki bati JSON kòm pakèt / pa pakèt epi voye li atravè nenpòt kliyan HTTP, kèlkeswa bibliyotèk la. Ou ka chwazi tou pou voye demann synchrone oswa asynchrone.

Nan kèk entegrasyon, nou toujou sèvi ak kliyan transpò ofisyèl la, men sa a se jis yon kesyon de refactoring kap vini an. Nan ka sa a, yo itilize yon kliyan koutim ki bati sou baz Spring WebClient pou trete.

Optimizasyon chaj sou yon pwojè Highload ak ElasticSearch

gwo pwomosyon

Yon fwa pa ane, pwojè a òganize yon gwo pwomosyon pou itilizatè yo - sa a se menm Highload la, depi nan moman sa a nou travay ak dè dizèn de milyon itilizatè an menm tan.

Anjeneral pik chaj yo rive pandan jou ferye yo, men pwomosyon sa a se sou yon nivo konplètman diferan. Ane anvan dènye, jou pwomosyon an, nou te vann 27 inite machandiz yo. Done yo te trete pou plis pase yon demi èdtan, ki te lakòz deranjman pou itilizatè yo. Itilizatè yo te resevwa prim pou patisipasyon, men li te vin klè ke pwosesis la te bezwen akselere.

Nan kòmansman ane 2019 la, nou te deside ke nou bezwen ElasticSearch. Pou yon ane antye, nou te òganize pwosesis la nan done yo resevwa nan Elastic ak emisyon yo nan api a nan aplikasyon an mobil ak sit entènèt. Kòm yon rezilta, ane kap vini an pandan kanpay la, nou trete 15 antre nan 131 minit.

Depi nou gen anpil moun ki vle achte machandiz ak patisipe nan tiraj la nan prim nan pwomosyon, sa a se yon mezi tanporè. Koulye a, nou ap voye enfòmasyon ajou nan Elastic, men nan lavni an nou planifye transfere enfòmasyon achiv pou mwa ki sot pase yo nan Postgres kòm yon depo pèmanan. Yo nan lòd yo pa bouche endèks la elastik, ki tou gen limit li yo.

Konklizyon/Konklizyon

Nan moman sa a, nou te transfere tout sèvis yo ke nou te vle nan Elastic epi yo te pran yon poz sou sa a pou kounye a. Koulye a, nou ap bati yon endèks nan Elastic sou tèt depo prensipal la ki pèsistan nan Postgres, ki pran sou chaj itilizatè a.

Nan lavni, nou planifye transfere sèvis si nou konprann ke demann done a vin twò divès epi yo chèche yon kantite kolòn san limit. Sa a se pa yon travay ankò pou Postgres.

Si nou bezwen rechèch konplè tèks nan fonksyonalite oswa si nou gen yon anpil nan kritè rechèch diferan, Lè sa a, nou deja konnen ke sa a bezwen yo dwe tradui nan Elastik.

⌘⌘⌘

Mèsi pou lekti. Si konpayi ou a sèvi ak ElasticSearch tou epi li gen pwòp ka aplikasyon li yo, Lè sa a, di nou. Li pral enteresan pou konnen kijan lòt moun ye 🙂

Sous: www.habr.com

Add nouvo kòmantè