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:
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:
- 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.
- 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:
- Punti di vendita. Appena avemu ricevutu dati da una fonte esterna, avemu principiatu subitu l 'aghjurnamentu.
- 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:
- 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.
- 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.
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