Pag-optimize sa load sa usa ka Highload nga proyekto nga adunay ElasticSearch

Hello, Habr! Ang akong ngalan mao si Maxim Vasiliev, nagtrabaho ko isip analyst ug project manager sa FINCH. Karon gusto nako isulti kanimo kung giunsa, gamit ang ElasticSearch, naproseso namon ang 15 milyon nga mga pangutana sa 6 minuto ug gi-optimize ang adlaw-adlaw nga pagkarga sa site sa usa sa among mga kliyente. Ikasubo, kinahanglan namon nga buhaton nga wala’y mga ngalan, tungod kay kami adunay usa ka NDA, nanghinaut kami nga ang sulud sa artikulo dili mag-antos niini. Adto na ta.

Giunsa pagtrabaho ang proyekto

Sa among backend naghimo kami og mga serbisyo nga nagsiguro sa pagpaandar sa mga website ug mobile application sa among kliyente. Ang kinatibuk-ang istruktura makita sa diagram:

Pag-optimize sa load sa usa ka Highload nga proyekto nga adunay ElasticSearch

Sa proseso sa pagtrabaho, giproseso namon ang daghang mga transaksyon: mga pagpalit, pagbayad, mga transaksyon sa mga balanse sa tiggamit, diin kami nagtipig daghang mga troso, ug usab nag-import ug nag-eksport niini nga datos sa mga eksternal nga sistema.

Adunay usab mga reverse nga proseso kung makadawat kami mga datos gikan sa kliyente ug ipadala kini sa tiggamit. Dugang pa, adunay mga proseso usab alang sa pagtrabaho sa mga pagbayad ug mga programa sa bonus.

Mubo nga background

Sa sinugdan, gigamit namo ang PostgreSQL isip among bugtong pagtipig sa datos. Ang mga bentaha niini mao ang sumbanan alang sa usa ka DBMS: ang presensya sa mga transaksyon, usa ka naugmad nga pinulongan sa pagkuha sa datos, usa ka halapad nga mga himan alang sa paghiusa; inubanan sa maayong pasundayag nakatagbaw sa among mga panginahanglan sa medyo taas nga panahon.

Gitipigan namon ang tanan nga datos sa Postgres: gikan sa mga transaksyon hangtod sa balita. Apan ang gidaghanon sa mga tiggamit mitubo, ug uban niini ang gidaghanon sa mga hangyo.

Aron masabtan, ang tinuig nga gidaghanon sa mga sesyon sa 2017 sa desktop site lamang mao ang 131 milyon. Sa 2018 - 125 milyon. Sa 2019 pag-usab 130 milyon. Pagdugang og laing 100-200 milyon gikan sa mobile nga bersyon sa site ug mobile application, ug ikaw makadawat sa usa ka dako nga gidaghanon sa mga hangyo.

Samtang nagkadako ang proyekto, ang mga Postgres dili na makasagubang sa karga; dili kami makapadayon - daghang lain-laing mga pangutana ang mitungha, diin wala kami makahimo og igong gidaghanon sa mga indeks.

Nakaamgo kami nga adunay panginahanglan alang sa ubang mga tindahan sa datos nga makatubag sa among mga panginahanglanon ug kuhaon ang load sa PostgreSQL. Ang Elasticsearch ug MongoDB gikonsiderar nga posible nga mga kapilian. Ang ulahi napildi sa mosunod nga mga punto:

  1. Hinay nga katulin sa pag-indeks samtang nagkadako ang gidaghanon sa datos sa mga indeks. Uban sa Elastic, ang katulin wala magdepende sa gidaghanon sa datos.
  2. Walay kompletong pagpangita sa teksto

Mao nga gipili namon ang Elastic para sa among kaugalingon ug nangandam alang sa pagbalhin.

Pagbalhin sa Elastic

1. Gisugdan namo ang transisyon sa usa ka serbisyo sa pagpangita sa point-of-sale. Ang among kliyente adunay kinatibuk-an nga mga 70 nga mga punto sa pagbaligya, ug sa samang higayon daghang mga matang sa pagpangita ang gikinahanglan sa website ug sa aplikasyon:

  • Pangitag text pinaagi sa ngalan sa lokalidad
  • Geosearch sulod sa gihatag nga radius gikan sa usa ka punto. Pananglitan, kung gusto sa usa ka tiggamit kung unsang mga punto sa pagbaligya ang labing duol sa iyang balay.
  • Pagpangita pinaagi sa gihatag nga kuwadrado - ang gumagamit naglatid sa usa ka kuwadrado sa mapa, ug ang tanan nga mga punto sa kini nga radius gipakita kaniya.
  • Pangita pinaagi sa dugang nga mga pagsala. Ang mga punto sa pagpamaligya lahi sa usag usa sa lainlaing lahi

Naghisgot bahin sa organisasyon, sa Postgres kami adunay gigikanan sa datos alang sa mapa ug balita, ug sa Elastic naghimo kami mga Snapshot gikan sa orihinal nga datos. Ang tinuod mao nga sa sinugdan ang mga Postgres dili makasagubang sa pagpangita sa tanang criteria. Dili lamang adunay daghang mga indeks, mahimo usab nga magsapaw, mao nga nawala ang scheduler sa Postgres ug wala makasabut kung unsang indeks ang gamiton.

2. Sunod sa linya mao ang seksyon sa balita. Ang mga publikasyon makita sa site kada adlaw aron ang tiggamit dili mawala sa dagan sa impormasyon, ang datos kinahanglan nga paghan-ay sa dili pa i-isyu. Mao kini ang pagpangita alang sa: sa site makapangita ka pinaagi sa pagpares sa teksto, ug sa samang higayon ikonektar ang dugang nga mga pagsala, tungod kay kini gihimo usab pinaagi sa Elastic.

3. Dayon gibalhin namo ang pagproseso sa transaksyon. Ang mga tiggamit mahimo’g makapalit usa ka piho nga produkto sa site ug makaapil sa usa ka premyo nga draw. Pagkahuman sa ingon nga mga pagpalit, giproseso namon ang daghang mga datos, labi na sa katapusan sa semana ug mga holiday. Alang sa pagtandi, kung sa normal nga mga adlaw ang gidaghanon sa mga gipamalit sa usa ka lugar sa palibot sa 1,5-2 milyon, nan sa mga holiday ang numero mahimong moabot sa 53 milyon.

Sa parehas nga oras, ang datos kinahanglan nga maproseso sa labing gamay nga oras-ang mga tiggamit dili gusto nga maghulat daghang mga adlaw alang sa mga resulta. Wala’y paagi aron makab-ot ang ingon nga mga deadline pinaagi sa Postgres - kanunay kami nakadawat mga bloke, ug samtang giproseso namon ang tanan nga mga hangyo, dili masusi sa mga tiggamit kung nakadawat ba sila mga premyo o wala. Dili kaayo kini makapahimuot sa negosyo, mao nga gibalhin namo ang pagproseso sa Elasticsearch.

Periodicity

Karon ang mga update gi-configure base sa panghitabo, sumala sa mga mosunud nga kondisyon:

  1. Mga punto sa pagbaligya. Sa diha nga kami makadawat og data gikan sa usa ka eksternal nga tinubdan, kami dayon maglunsad og usa ka update.
  2. Balita. Sa diha nga ang bisan unsang balita ma-edit sa site, kini awtomatiko nga ipadala sa Elastic.

Dinhi pag-usab angay nga hisgutan ang mga bentaha sa Elastic. Sa Postgres, kung magpadala usa ka hangyo, kinahanglan ka maghulat hangtod nga matinud-anon nga maproseso ang tanan nga mga rekord. Mahimo nimong ipadala ang 10 ka libo nga mga rekord sa Elastic ug magsugod dayon sa pagtrabaho, nga dili maghulat nga ipanghatag ang mga rekord sa tanan nga Shards. Siyempre, ang pipila ka Shard o Replica mahimong dili dayon makakita sa datos, apan sa dili madugay ang tanan magamit na.

Mga pamaagi sa paghiusa

Adunay 2 nga mga paagi sa pag-integrate sa Elastic:

  1. Pinaagi sa lumad nga kliyente pinaagi sa TCP. Ang lumad nga drayber anam-anam nga namatay: wala na kini gisuportahan, ug ang syntax niini dili kombenyente. Busa, halos dili namo kini gamiton ug naningkamot nga hingpit nga biyaan kini.
  2. Pinaagi sa usa ka interface sa HTTP diin mahimo nimong gamiton ang mga hangyo sa JSON ug syntax sa Lucene. Ang katapusan mao ang text engine nga gigamit sa Elastic. Niini nga opsyon, nakuha namo ang abilidad sa Batch pinaagi sa mga hangyo sa JSON sa HTTP. Kini ang kapilian nga among gisulayan nga gamiton.

Salamat sa interface sa HTTP, mahimo namong gamiton ang mga librarya nga naghatag ug asynchronous nga pagpatuman sa HTTP client. Mahimo natong pahimuslan ang Batch ug ang asynchronous nga API, nga sa katapusan naghatag og taas nga performance, nga nakatabang og dako sa mga adlaw sa usa ka dako nga promosyon (dugang niini sa ubos)

Pipila ka mga numero alang sa pagtandi:

  • Pagtipig sa mga tiggamit nga nakadawat mga premyo sa Postgres sa 20 nga mga thread nga wala’y mga grupo: 460713 nga mga rekord sa 42 segundos
  • Elastic + reactive nga kliyente para sa 10 ka thread + batch para sa 1000 ka elemento: 596749 records sa 11 segundos
  • Elastic + reactive nga kliyente para sa 10 ka thread + batch para sa 1000 ka elemento: 23801684 nga mga rekord sa 4 ka minuto

Karon nagsulat kami og HTTP request manager nga nagtukod og JSON isip Batch/non-Batch ug gipadala kini pinaagi sa bisan unsang HTTP client, bisan unsa pa ang library. Mahimo usab nimo pilion ang pagpadala sa mga hangyo nga dungan o asynchronously.

Sa pipila ka mga panagsama gigamit gihapon namo ang opisyal nga kliyente sa transportasyon, apan kini usa lamang ka butang sa diha-diha nga refactoring. Sa kini nga kaso, ang kaugalingon nga kliyente, nga gitukod base sa Spring WebClient, gigamit alang sa pagproseso.

Pag-optimize sa load sa usa ka Highload nga proyekto nga adunay ElasticSearch

Dako nga promosyon

Kausa sa usa ka tuig, ang proyekto nag-host sa usa ka dako nga promosyon alang sa mga tiggamit - parehas kini nga Highload, tungod kay niining panahona nagtrabaho kami sa napulo ka milyon nga mga tiggamit nga dungan.

Kasagaran, ang mga peak load mahitabo sa panahon sa mga holiday, apan kini nga promosyon anaa sa usa ka hingpit nga lahi nga lebel. Sa miaging tuig, sa adlaw sa promosyon, nakabaligya mig 27 ka unit sa mga butang. Ang datos mikuha ug kapin sa tunga sa oras aron maproseso, nga nakahatag ug kahasol sa mga tiggamit. Ang mga tiggamit nakadawat og mga premyo alang sa pag-apil, apan nahimong tin-aw nga ang proseso kinahanglan nga paspasan.

Sa sinugdanan sa 2019, nakahukom kami nga gikinahanglan ang ElasticSearch. Sulod sa tibuok tuig, among giorganisar ang pagproseso sa nadawat nga datos sa Elastic ug ang output niini ngadto sa API sa mobile application ug website. Ingon usa ka sangputanan, sa sunod nga tuig sa panahon sa promosyon among giproseso 15 entries sa 131 minutos.

Tungod kay kami adunay daghang mga tawo nga gusto mopalit sa produkto ug moapil sa premyo nga draw sa among mga promosyon, kini usa ka temporaryo nga lakang. Karon nagpadala kami karon nga kasayuran sa Elastic, apan sa umaabot nagplano kami nga ibalhin ang naka-archive nga kasayuran sa miaging mga bulan sa Postgres ingon permanente nga pagtipig. Aron dili mabara ang Elastic index, nga adunay mga limitasyon usab.

Konklusyon/Mga Konklusyon

Sa pagkakaron, gibalhin namo ang tanang serbisyo nga gusto namo sa Elastic ug mihunong na sa pagkakaron. Karon nagtukod kami usa ka indeks sa Elastic sa ibabaw sa panguna nga padayon nga pagtipig sa Postgres, nga nagkuha sa load sa gumagamit.

Sa umaabot, nagplano kami nga ibalhin ang mga serbisyo kung nahibal-an namon nga ang hangyo sa datos nahimo nga lainlain ug gipangita alang sa usa ka walay kutub nga gidaghanon sa mga kolum. Dili na kini buluhaton alang sa mga Postgres.

Kung kinahanglan namon ang tibuuk nga teksto nga pagpangita sa gamit o kung kami adunay daghang lainlaing mga pamatasan sa pagpangita, nan nahibal-an na namon nga kinahanglan kini hubaron sa Elastic.

⌘⌘⌘

Salamat sa pagbasa. Kung ang imong kompanya naggamit usab sa ElasticSearch ug adunay imong kaugalingon nga mga kaso sa pagpatuman, palihug sultihi kami. Makapaikag nga mahibal-an kung giunsa ang gibuhat sa uban :)

Source: www.habr.com

Idugang sa usa ka comment