Ottimisazione di carica in un prughjettu Highload cù ElasticSearch

Ehi Habr! Mi chjamu Maxim Vasiliev, travagliu cum'è analista è capu di prughjettu in FINCH. Oghje vogliu dicu cumu, utilizendu ElasticSearch, pudemu processà 15 milioni di richieste in 6 minuti è ottimisimu i carichi di ogni ghjornu in u situ di unu di i nostri clienti. Sfurtunatamente, avemu da fà senza nomi, postu chì avemu un NDA, speremu chì u cuntenutu di l'articulu ùn soffre micca di questu. Andemu.

Cumu funziona u prughjettu

In u nostru backend, creemu servizii chì assicuranu u rendiment di i siti web di i nostri clienti è l'applicazione mobile. A struttura generale pò esse vistu in u schema:

Ottimisazione di carica in un prughjettu Highload cù ElasticSearch

In u prucessu di u travagliu, processemu un gran numaru di transazzione: compra, pagamenti, operazioni cù saldi di l'utilizatori, per quale avemu guardatu assai logs, è ancu impurtà è exportà sta dati à sistemi esterni.

Ci sò dinù prucessi inversa quandu avemu ricevutu dati da u cliente è trasfiriri lu à l 'utilizatori. Inoltre, ci sò sempre prucessi per travaglià cù pagamenti è prugrammi di bonus.

Breve sfondate

Inizialmente, avemu usatu PostgreSQL cum'è l'unicu magazzinu di dati. I so vantaghji standard per un DBMS: a prisenza di transazzione, una lingua di campionamentu di dati sviluppata, una larga gamma di arnesi per l'integrazione; cumminati cù una bona prestazione hà sappiutu i nostri bisogni per un bellu pezzu.

Avemu guardatu assolutamente tutte e dati in Postgres: da e transazzione à e nutizie. Ma u numeru di utilizatori cresce, è cun ellu u numeru di richieste.

Per capiscenu, u numeru annuale di sessioni in 2017 solu nantu à u situ di desktop hè 131 milioni. In 2018 - milioni 125. 2019 torna 130 milioni. Aggiungi un altru 100-200 milioni da a versione mobile di u situ è ​​l'applicazione mobile, è voi. riceverà un gran numaru di richieste.

Cù a crescita di u prugettu, Postgres hà cessatu di affruntà a carica, ùn avemu micca u tempu - un gran numaru di diverse dumande apparsu, per quale ùn pudemu micca creà un numeru suffirenziu d'indici.

Avemu capitu chì ci era bisognu di altre magazzini di dati chì furnisce i nostri bisogni è piglià a carica di PostgreSQL. Elasticsearch è MongoDB sò stati cunsiderati cum'è opzioni pussibuli. L'ultimi persu nantu à i seguenti punti:

  1. A velocità di indexazione lenta cum'è a quantità di dati in l'indici cresce. Cù Elastic, a vitezza ùn dipende micca di a quantità di dati.
  2. Nisuna ricerca di testu cumpletu

Allora avemu sceltu Elastic per noi stessi è preparatu per a transizione.

Transizione à Elastic

1. Avemu principiatu a transizione da u serviziu di ricerca di u puntu di vendita. U nostru cliente hà un totale di circa 70 000 punti di vendita, è questu richiede parechji tipi di ricerca in u situ è ​​in l'applicazione:

  • Ricerca di testu per nome di a cità
  • Geosearch in un raghju datu da qualchì puntu. Per esempiu, se l'utilizatore vole vede quale punti di vendita sò più vicinu à a so casa.
  • Ricerca per un quadratu datu - l'utilizatore disegna un quadratu nantu à a mappa, è tutti i punti in questu radiu li sò mostrati.
  • Ricerca per filtri supplementari. I punti di vendita sò diffirenti l'una di l'altru in l'assortimentu

Se parlemu di l'urganizazione, allora in Postgres avemu una fonte di dati per a mappa è a nutizia, è in Elastic Snapshots sò pigliati da i dati originali. U fattu hè chì, inizialmente, Postgres ùn pudia micca affruntà a ricerca per tutti i criteri. Ùn ci era micca solu assai indici, puderianu ancu sovrappone, cusì u pianificatore Postgres si perde è ùn hà micca capitu quale indice à utilizà.

2. In seguitu era a sezione di nutizie. Publicazioni appariscenu in u situ ogni ghjornu per chì l'utilizatore ùn si perde micca in u flussu di l'infurmazioni, i dati devenu esse ordenati prima di emissione. Questu hè ciò chì a ricerca hè: pudete cercà u situ per u testu, è à u stessu tempu cunnette filtri supplementari, postu chì sò ancu fatti per Elastic.

3. Allora avemu spustatu u prucessu di transazzione. L'utilizatori ponu cumprà un certu pruduttu in u situ è ​​participà à un sorte di premiu. Dopu tali acquisti, processemu una grande quantità di dati, soprattuttu in fine di settimana è vacanze. Per paragunà, se in i ghjorni ordinali u numeru di compra hè in un locu trà 1,5-2 milioni, in i vacanze, a figura pò ghjunghje à 53 milioni.

À u listessu tempu, i dati devenu esse processati in u più brevi tempu pussibule - l'utilizatori ùn piace micca aspittà u risultatu per parechji ghjorni. Ùn ci hè micca manera di ottene tali scadenze per mezu di Postgres - avemu spessu ricivutu chjusi, è mentre avemu trattatu tutte e dumande, l'utilizatori ùn puderanu micca verificà s'ellu anu ricevutu premi o micca. Questu ùn hè micca assai piacevule per l'affari, cusì avemu spustatu u prucessu à Elasticsearch.

Periodicità

Avà l'aghjurnamenti sò cunfigurati basatu annantu à l'avvenimenti, secondu e seguenti cundizioni:

  1. Punti di vendita. Appena avemu ricevutu dati da una fonte esterna, avemu principiatu subitu l 'aghjurnamentu.
  2. News. Appena ogni nutizia hè editata nantu à u situ, hè automaticamente mandata à Elastic.

Quì dinò vale a pena menzionate i vantaghji di Elastic. In Postgres, quandu invià una dumanda, duvete aspittà finu à chì processa onestamente tutti i registri. Pudete mandà 10 dischi à Elastic è cumincià à travaglià immediatamente, senza aspittà chì i dischi sò distribuiti in tutti i Shards. Di sicuru, alcuni Shard o Replica ùn ponu micca vede i dati subitu, ma tuttu serà dispunibule assai prestu.

I metudi di integrazione

Ci hè 2 modi per integrà cù Elastic:

  1. Per mezu di un cliente nativu nantu à TCP. U cunduttore nativu hè mortu à pocu à pocu: ùn hè più supportatu, hà una sintassi assai inconveniente. Dunque, praticamente ùn l'utilizamu micca è pruvate d'abbandunà completamente.
  2. Per mezu di una interfaccia HTTP chì pò utilizà sia richieste JSON sia sintassi Lucene. L'ultimu hè un mutore di testu chì usa Elastic. In questa versione, avemu a capacità di Batch through JSON requests over HTTP. Questa hè l'opzione chì pruvemu d'utilizà.

Grazie à l'interfaccia HTTP, pudemu usà biblioteche chì furnisce una implementazione asincrona di u cliente HTTP. Pudemu prufittà di Batch è di l'API asincrona, chì risultatu in un altu rendiment, chì hà aiutatu assai in i ghjorni di a grande promozione (più nantu à quì sottu)

Certi numeri per paragunà:

  • Salvà l'utilizatori di Bounty Postgres in 20 fili senza raggruppamenti: 460713 record in 42 seconde
  • Cliente elasticu + reattivu per 10 fili + batch per 1000 elementi: 596749 record in 11 seconde
  • Cliente elasticu + reattivu per 10 fili + batch per 1000 elementi: 23801684 entrate in 4 minuti

Avà avemu scrittu un gestore di richieste HTTP chì custruisce JSON cum'è Batch / micca Batch è l'invia per qualsiasi cliente HTTP, indipendentemente da a biblioteca. Pudete ancu sceglie di mandà richieste in modu sincronu o asincronu.

In certi integrazioni, avemu sempre aduprà u cliente di trasportu ufficiale, ma questu hè solu una questione di u prossimu refactoring. In questu casu, un cliente persunalizatu custruitu nantu à a basa di Spring WebClient hè utilizatu per u processu.

Ottimisazione di carica in un prughjettu Highload cù ElasticSearch

grande prumuzione

Una volta à l'annu, u prughjettu ospitu una grande prumuzione per l'utilizatori - questu hè u stessu Highload, postu chì à questu tempu avemu travagliatu cù decine di milioni d'utilizatori à u stessu tempu.

Di solitu i picchi di carichi si trovanu durante e vacanze, ma sta prumuzione hè in un livellu completamente diversu. L'annu prima, u ghjornu di a prumuzione, avemu vindutu 27 580 890 unità di merchenzie. I dati sò stati trattati per più di una meza ora, chì hà causatu inconvenienti per l'utilizatori. L'utilizatori ricevenu premi per a participazione, ma hè diventatu chjaru chì u prucessu deve esse acceleratu.

À u principiu di 2019, avemu decisu chì avemu bisognu di ElasticSearch. Per un annu sanu, avemu urganizatu u trattamentu di e dati ricevuti in Elastic è a so emissione in l'api di l'applicazione mobile è u situ web. In u risultatu, l'annu dopu durante a campagna, avemu processatu 15 entrate in 131 minuti.

Siccomu avemu assai persone chì volenu cumprà bè è participà à u disegnu di premii in promozioni, questu hè una misura temporale. Avà mandemu infurmazione aghjurnata à Elastic, ma in u futuru avemu intenzione di trasfiriri l'infurmazioni archiviate per i mesi passati à Postgres cum'è un almacenamiento permanente. Per ùn impiccà l'indici Elastic, chì hà ancu e so limitazioni.

Conclusioni/Conclusioni

À u mumentu, avemu trasferitu tutti i servizii chì vuliamu à Elastic è avemu pause nantu à questu per avà. Avà custruemu un indice in Elastic in cima à u principale almacenamiento persistente in Postgres, chì piglia a carica di l'utilizatori.

In u futuru, pensamu di trasfiriri servizii si capisce chì a dumanda di dati diventa troppu diversa è hè cercata per un numaru illimitatu di colonne. Questu ùn hè più un compitu per Postgres.

Sè avemu bisognu di ricerca di testu sanu in funziunalità o s'ellu avemu assai criterii di ricerca diffirenti, allora sapemu digià chì questu deve esse traduttu in Elastic.

⌘⌘⌘

Grazie per leghje. Se a vostra cumpagnia usa ancu ElasticSearch è hà i so propiu casi di implementazione, allora diteci. Sarà interessante sapè cumu sò l'altri 🙂

Source: www.habr.com

Add a comment