Bi ElasticSearch re optimîzasyona li ser projeyek Highload barkirin

Hey Habr! Navê min Maxim Vasiliev e, ez li FINCHê wekî analîst û rêvebirê projeyê dixebitim. Îro ez dixwazim ji we re vebêjim ka çawa, bi karanîna ElasticSearch, me karî di 15 hûrdeman de 6 mîlyon daxwazan bişopînin û li ser malpera yek ji xerîdarên xwe barkirinên rojane xweştir bikin. Mixabin, em ê neçar bimînin ku bêyî navan bikin, ji ber ku me NDA heye, em hêvî dikin ku naveroka gotarê ji vê yekê aciz nebe. De em herin.

Proje çawa dixebite

Li ser pişta xwe, em karûbaran diafirînin ku performansa malper û serîlêdana mobîl a xerîdarên me piştrast dikin. Struktura giştî dikare di diagramê de were dîtin:

Bi ElasticSearch re optimîzasyona li ser projeyek Highload barkirin

Di pêvajoya xebatê de, em hejmareke mezin danûstendinan pêvajoyê dikin: kirîn, drav, operasyonên bi hevsengiyên bikarhêneran re, ji bo ku em gelek têketin hilînin, û her weha van daneyan ji pergalên derveyî re derdixin û derdixin.

Dema ku em daneyan ji xerîdar distînin û vediguhezînin bikarhênerê jî pêvajoyên berevajî hene. Wekî din, hîn jî pêvajoyên ji bo xebata bi drav û bernameyên bonus hene.

Kurte paşnav

Di destpêkê de, me PostgreSQL wekî tenê dikana daneyê bikar anî. Feydeyên wê yên standard ji bo DBMS: hebûna danûstendinan, zimanek nimûneya daneyê ya pêşkeftî, cûrbecûr amûrên ji bo entegrasyonê; bi performansa baş re ji bo demek dirêj hewcedariyên me têr kirin.

Me bi tevahî daneyên li Postgres hilanîn: ji danûstandinan bigire heya nûçeyan. Lê hejmara bikarhêneran mezin bû, û bi wê re jî hejmara daxwazan.

Ji bo têgihiştinê, di sala 2017-an de hejmara danişînên salane tenê li ser malpera sermaseyê 131 mîlyon e. Di 2018 de - 125 mîlyon. 2019 dîsa 130 mîlyon. 100-200 mîlyonek din ji guhertoya mobîl a malperê û serîlêdana mobîl zêde bikin, û hûn dê hejmareke mezin ji daxwazan bistînin.

Bi mezinbûna projeyê re, Postgres dev ji barkirinê berda, wextê me tune bû - hejmareke mezin ji lêpirsînên cihêreng xuya bûn, ji bo ku me nekarî hejmarek têr indexan biafirîne.

Me fêm kir ku pêdivî bi firotgehên daneya din heye ku dê hewcedariyên me peyda bikin û barê PostgreSQL hilînin. Elasticsearch û MongoDB wekî vebijarkên mimkun hatin hesibandin. Ya paşîn di xalên jêrîn de winda kir:

  1. Her ku hêjmara daneyan di navnîşan de zêde dibe leza îndekskirinê hêdî dibe. Bi Elastic re, bilez bi hêjeya daneyê ve girêdayî nabe.
  2. Lêgerîna nivîsê ya tevahî tune

Ji ber vê yekê me ji bo xwe Elastic hilbijart û ji bo veguherînê amade kir.

Veguherîna Elastic

1. Me ji karûbarê lêgerîna xala firotanê dest bi veguhertina dest pê kir. Muwekîlê me bi tevahî nêzî 70 xalên firotanê hene, û ev hewce dike ku çend celeb lêgerîn li ser malperê û di serîlêdanê de:

  • Lêgerîna nivîsê li gorî navê bajêr
  • Geosegerî di nav radiusek diyarkirî de ji hin xalek. Mînakî, heke bikarhêner bixwaze bibîne ka kîjan xalên firotanê nêzî mala wî ne.
  • Li çargoşeyek diyar bigerin - bikarhêner li ser nexşeyê çarçoveyek xêz dike, û hemî xalên di vê radiusê de jê re têne destnîşan kirin.
  • Bi fîlterên zêde bigerin. Xalên firotanê di cûrbecûr de ji hev cûda dibin

Ger em behsa rêxistinê bikin, wê hingê di Postgres de hem ji bo nexşeyê hem jî ji bo nûçeyan çavkaniyek daneyê heye, û di Elastic Snapshots de ji daneyên orîjînal têne girtin. Rastî ev e ku di destpêkê de Postgres nekarî bi hemî pîvanan bi lêgerînê re mijûl bibe. Ne tenê gelek navnîşan hebûn, ew di heman demê de dikarin li hev bikevin, ji ber vê yekê plansazkerê Postgres winda bû û fam nekir ku kîjan index bikar bîne.

2. Di rêzê de beşa nûçeyan bû. Weşan her roj li ser malperê têne xuyang kirin da ku bikarhêner di herikîna agahdariyan de winda nebe, berî weşandinê divê dane bêne rêz kirin. Lêgerîn ji bo vê yekê ye: hûn dikarin li malperê li gorî berhevoka nivîsê bigerin, û di heman demê de fîlterên din jî girêdin, ji ber ku ew jî bi Elastic ve têne çêkirin.

3. Dûv re me pêvajoya danûstendinê bar kir. Bikarhêner dikarin hilberek diyarkirî li ser malperê bikirin û beşdarî kêşana xelatê bibin. Piştî kirînên weha, em bi taybetî di dawiya hefte û betlaneyan de hejmareke mezin a daneyan pêvajoyê dikin. Ji bo berhevdanê, heke di rojên asayî de hejmara kirînê di navbera 1,5-2 mîlyonî de be, wê hingê di betlaneyê de ev hejmar dikare bigihîje 53 mîlyon.

Di heman demê de, pêdivî ye ku dane di demek herî kin de bêne hilberandin - bikarhêner hez nakin çend rojan li benda encamê bisekinin. Rêyek tune ku meriv bi Postgres re bigihîje muhletên weha - me pir caran qefle werdigirt, û dema ku me hemî daxwazan pêvajo dikir, bikarhêner nekarin kontrol bikin ka wan xelat wergirtine an na. Ev ji bo karsaziyê ne pir xweş e, ji ber vê yekê me pêvajoyê bar kir Elasticsearch.

Demjimêr

Naha nûvekirin li gorî şert û mercên jêrîn li ser bingeha bûyerê têne mîheng kirin:

  1. xalên firotanê. Gava ku em daneyan ji çavkaniyek derveyî werdigirin, em tavilê dest bi nûvekirinê dikin.
  2. Nûçe. Hema ku nûçeyek li ser malperê were sererast kirin, ew bixweber ji Elastic re tê şandin.

Li vir dîsa hêjayî gotinê ye ku avantajên Elastic. Di Postgres de, dema ku daxwazek dişîne, divê hûn li bendê bimînin heya ku ew bi dilsozî hemî tomaran pêvajoyê bike. Hûn dikarin 10 tomar ji Elastic re bişînin û tavilê dest bi xebatê bikin, bêyî ku li bendê bin ku tomar li hemî Shards bêne belavkirin. Bê guman, dibe ku hin Shard an Replica tavilê daneyan nebînin, lê her tişt dê di demek nêzîk de peyda bibe.

Rêbazên entegrasyonê

2 awayên entegrasyona bi Elastic hene:

  1. Bi xerîdarek xwecî ya li ser TCP. Ajokarê xwecî hêdî hêdî dimire: ew êdî nayê piştgirî kirin, hevoksaziyek wê ya pir nerehet heye. Ji ber vê yekê, em bi pratîkî wê bikar nakin û hewl didin ku bi tevahî dev jê berdin.
  2. Bi navgînek HTTP-ê ku dikare hem daxwazên JSON û hem jî hevoksaziya Lucene bikar bîne. Ya paşîn motorek nivîsê ye ku Elastic bikar tîne. Di vê guhertoyê de, em jêhatîbûnê digirin ku bi daxwazên JSON-ê li ser HTTP-ê tevbigerin. Ev vebijêrk e ku em hewl didin ku bikar bînin.

Bi saya pêwendiya HTTP, em dikarin pirtûkxaneyên ku pêkanîna asynchronous ya muwekîlê HTTP peyda dikin bikar bînin. Em dikarin ji Batch û API-ya asynchronous sûd werbigirin, ku di encamê de performansa bilind çêdibe, ku di rojên pêşkeftina mezin de pir alîkar bû (li ser wê yekê li jêr bêtir)

Ji bo berhevdanê çend hejmar:

  • Bikarhênerên xelata Postgres di 20 mijaran de bêyî komkirinê tomar bikin: 460713 tomar di 42 çirkeyan de
  • Muwekîlê elastîk + reaktîf ji bo 10 têlan + berhevok ji bo 1000 hêmanan: 596749 tomar di 11 çirkeyan de
  • Xerîdar Elastic + reaktîf ji bo 10 têlan + hevîng ji bo 1000 hêmanan: 23801684 têketin di 4 hûrdeman de

Naha me rêveberek daxwaznameya HTTP nivîsandiye ku JSON wekî Batch / ne Batch ava dike û bi her muwekîlê HTTP-ê re dişîne, bêyî ku pirtûkxane hebe. Her weha hûn dikarin hilbijêrin ku daxwazan bi hevdemî an asynchronous bişînin.

Di hin entegrasyonê de, em hîn jî xerîdarê veguheztina fermî bikar tînin, lê ev tenê mijarek nûvekirina paşîn e. Di vê rewşê de, xerîdarek xwerû ya ku li ser bingeha Spring WebClient hatî çêkirin ji bo pêvajoyê tê bikar anîn.

Bi ElasticSearch re optimîzasyona li ser projeyek Highload barkirin

danasîna mezin

Salê carekê, proje pêşwaziyek mezin ji bikarhêneran re dike - ev heman Highload e, ji ber ku di vê demê de em di heman demê de bi deh mîlyon bikarhêneran re dixebitin.

Bi gelemperî lûtkeyên bargiraniyê di dema betlaneyê de çêdibin, lê ev pêşkeftin di astek bi tevahî cûda de ye. Salek berê, di roja danasînê de, me 27 yekeyên kelûpel firot. Daneyên zêdetirî nîv saetê hatin pêvajo kirin, ku bû sedema nerehetiya bikarhêneran. Bikarhêneran ji bo beşdariyê xelat wergirtin, lê diyar bû ku pêdivî ye ku pêvajo bilez were kirin.

Di destpêka 2019-an de, me biryar da ku hewcedariya me bi ElasticSearch heye. Ji bo salek tevahî, me hilberandina daneyên wergirtî li Elastic û derxistina wan di api ya serîlêdana mobîl û malperê de organîze kir. Di encamê de, sala pêş di dema kampanyayê de, me pêvajoyê kir 15 navnîşan di 131 hûrdeman de.

Ji ber ku gelek kesên me hene ku dixwazin tiştan bikirin û beşdarî kêşana xelatan di promosyonên de bibin, ev tedbîrek demkî ye. Naha em agahdariya nûjen ji Elastic re dişînin, lê di pêşerojê de em plan dikin ku agahdariya arşîvkirî ya mehên borî veguhezînin Postgres wekî depoyek mayînde. Ji bo ku pêwendiya Elasticê neyê girtin, ku ew jî sînorên wê hene.

Encam / Encam

Heya nuha, me hemî karûbarên ku me dixwest ji Elasticê re veguheztin û heya niha li ser vê yekê sekinîn. Naha em li ser embara domdar a sereke ya li Postgres, ku barkirina bikarhêner digire ser xwe, di Elastic de indexek ava dikin.

Di pêşerojê de, em plan dikin ku karûbaran veguhezînin ger em fêm bikin ku daxwaza daneyê pir cihêreng dibe û li hejmarek bêsînor stûnan tê lêgerîn. Ev êdî ji bo Postgres ne peywirek e.

Ger di fonksiyonê de hewcedariya me bi lêgerîna tev-nivîsê hebe an heke me gelek pîvanên lêgerînê yên cihêreng hebin, wê hingê em jixwe dizanin ku ev pêdivî ye ku li Elastic were wergerandin.

⌘⌘⌘

Spas ji bo xwendinê. Ger pargîdaniya we jî ElasticSearch bikar tîne û dozên xwe yên bicîhkirinê hene, wê hingê ji me re bibêjin. Dê balkêş be ku hûn zanibin yên din çawa ne 🙂

Source: www.habr.com

Add a comment