Optimasi beban dina proyék Highload sareng ElasticSearch

Héy Habr! Nami abdi Maxim Vasiliev, abdi damel salaku analis sareng manajer proyék di FINCH. Dinten ieu kuring hoyong nyarioskeun ka anjeun kumaha, nganggo ElasticSearch, kami tiasa ngolah 15 juta pamundut dina 6 menit sareng ngaoptimalkeun beban sapopoé dina situs salah sahiji klien kami. Hanjakalna, urang kedah ngalakukeun tanpa nami, sabab urang gaduh NDA, kami ngarepkeun yén eusi tulisan éta moal sangsara tina ieu. Hayu angkat.

Kumaha karya proyék

Dina backend urang, urang nyieun jasa nu mastikeun kinerja situs web klien urang jeung aplikasi mobile. Struktur umum bisa ditempo dina diagram:

Optimasi beban dina proyék Highload sareng ElasticSearch

Dina prosés gawé, urang ngolah angka nu gede ngarupakeun transaksi: purchases, pangmayaran, operasi kalawan balances pamaké, nu urang nyimpen loba log, kitu ogé impor jeung ékspor data ieu sistem éksternal.

Aya ogé prosés ngabalikeun nalika kami nampi data ti klien sareng nransperkeunana ka pangguna. Sajaba ti éta, aya kénéh prosés pikeun gawé bareng pangmayaran jeung program bonus.

Latar singket

Mimitina, kami nganggo PostgreSQL salaku hiji-hijina toko data. Kaunggulan standar na pikeun DBMS: ayana transaksi, basa sampling data dimekarkeun, rupa-rupa parabot pikeun integrasi; digabungkeun sareng kinerja anu saé nyugemakeun kabutuhan urang pikeun waktos anu lami.

Urang nyimpen leres pisan sadaya data dina Postgres: ti transaksi ka warta. Tapi jumlah pamaké tumuwuh, sarta kalawan éta jumlah requests.

Pikeun pamahaman, jumlah taunan sesi di 2017 ngan dina situs desktop nyaéta 131 juta. Dina 2018 - 125 juta. 2019 deui 130 juta. Tambahkeun sejen 100-200 juta ti versi mobile loka jeung aplikasi mobile, jeung anjeun bakal meunang jumlah badag requests.

Kalayan tumuwuhna proyék, Postgres dieureunkeun coping jeung beban, urang teu boga waktu - sajumlah badag rupa queries mucunghul, nu urang teu bisa nyieun jumlah cukup indéks.

Kami ngartos yén aya peryogi pikeun toko data sanés anu bakal nyayogikeun kabutuhan urang sareng ngaleungitkeun beban PostgreSQL. Elasticsearch sareng MongoDB dianggap salaku pilihan anu mungkin. Anu terakhir kaleungitan dina titik-titik ieu:

  1. Lambat laju indéks nalika jumlah data dina indéks ningkat. Kalayan Elastis, laju henteu gumantung kana jumlah data.
  2. Taya pilarian téks lengkep

Janten urang milih Elastis kanggo diri urang sorangan sareng disiapkeun pikeun transisi.

Transisi ka elastis

1. Urang dimimitian transisi tina titik layanan pilarian diobral. Klién kami ngagaduhan jumlahna sakitar 70 titik penjualan, sareng ieu peryogi sababaraha jinis panéangan dina situs sareng dina aplikasi:

  • Pilarian téks dumasar nami kota
  • Geosearch dina radius tinangtu tina sababaraha titik. Salaku conto, upami pangguna hoyong ningali titik jual mana anu pangdeukeutna ka bumina.
  • Pilarian ku alun-alun anu dipasihkeun - pangguna ngagambar alun-alun dina peta, sareng sadaya titik dina radius ieu ditingalikeun ka anjeunna.
  • Pilarian ku saringan tambahan. Titik jual béda-béda dina rupa-rupa

Upami urang ngobrol ngeunaan organisasi, maka di Postgres kami gaduh sumber data pikeun peta sareng warta, sareng dina Snapshots elastis dicandak tina data asli. Kanyataan yén mimitina Postgres teu bisa Cope jeung pilarian ku sagala kriteria. Henteu ngan ukur aya seueur indéks, aranjeunna ogé tiasa tumpang tindih, janten penjadwal Postgres leungit sareng henteu ngartos indéks mana anu dianggo.

2. Satuluyna baris aya bagian warta. Publikasi muncul dina situs unggal dinten supados pangguna henteu leungit dina aliran inpormasi, data kedah diurutkeun sateuacan dikaluarkeun. Ieu naon pilarian nyaéta pikeun: Anjeun tiasa milarian dina situs ku cocok téks, sarta sakaligus nyambung saringan tambahan, saprak maranéhna ogé dijieun ngaliwatan elastis.

3. Teras we dipindahkeun processing urus. Pamaké bisa meuli produk tangtu dina loka jeung ilubiung dina undian hadiah. Saatos purchases misalna, urang ngolah jumlah badag data, utamana dina weekends jeung libur. Pikeun babandingan, lamun dina poé biasa jumlah purchases antara 1,5-2 juta, mangka dina libur angka bisa ngahontal 53 juta.

Dina waktos anu sami, data kedah diolah dina waktos anu paling pondok - pangguna henteu resep ngantosan hasilna sababaraha dinten. Teu aya cara pikeun ngahontal wates waktu sapertos Postgres - kami sering nampi konci, sareng nalika kami ngolah sadaya pamundut, pangguna henteu tiasa pariksa naha aranjeunna nampi hadiah atanapi henteu. Ieu henteu pikaresepeun pisan pikeun bisnis, janten kami ngalihkeun pamrosésan ka Elasticsearch.

Périodik

Ayeuna apdet dikonpigurasikeun dumasar-kajadian, dumasar kana kaayaan ieu:

  1. titik jualan. Pas kami nampi data tina sumber éksternal, kami langsung ngamimitian apdet.
  2. Warta. Pas sagala warta diédit dina loka, eta otomatis dikirim ka Elastis.

Di dieu deui patut nyebut kaunggulan Elastis. Dina Postgres, nalika ngirim pamundut, anjeun kedah ngantosan dugi ka jujur ​​​​ngolah sadaya rékaman. Anjeun tiasa ngirim 10 rékaman ka Elastis sareng mimitian damel langsung, tanpa ngantosan rékaman disebarkeun ka sadaya Shards. Tangtosna, sababaraha Shard atanapi Replica panginten henteu langsung ningali datana, tapi sadayana bakal sayogi pas.

Métode integrasi

Aya 2 cara pikeun ngahijikeun sareng Elastis:

  1. Ngaliwatan klien asli leuwih TCP. Supir asli laun-laun maot: teu didukung deui, gaduh sintaksis anu teu merenah. Ku alatan éta, urang praktis teu make eta jeung nyoba sagemblengna abandon eta.
  2. Ngaliwatan antarbeungeut HTTP anu tiasa nganggo pamundut JSON sareng sintaksis Lucene. Anu terakhir nyaéta mesin téks anu nganggo Elastis. Dina versi ieu, urang meunang kamampuhan pikeun bets ngaliwatan requests JSON ngaliwatan HTTP. Ieu mangrupikeun pilihan anu urang badé dianggo.

Hatur nuhun kana antarmuka HTTP, urang tiasa nganggo perpustakaan anu nyayogikeun palaksanaan asynchronous tina klien HTTP. Urang tiasa ngamangpaatkeun Batch sareng API Asynchronous, anu nyababkeun kinerja anu luhur, anu ngabantosan pisan dina dinten-dinten promosi ageung (langkung seueur ngeunaan éta di handap)

Sababaraha angka pikeun ngabandingkeun:

  • Nyimpen pamaké bounty Postgres dina 20 utas tanpa ngagolongkeun: 460713 rékaman dina 42 detik
  • Elastis + klien réaktif pikeun 10 threads + bets pikeun 1000 elemen: 596749 rékaman dina 11 detik
  • Elastis + klien réaktif pikeun 10 threads + bets pikeun 1000 elemen: 23801684 éntri dina 4 menit

Ayeuna kami geus ditulis hiji manajer pamundut HTTP nu ngawangun JSON sakumaha bets / teu bets sarta ngirimkeunana ngaliwatan sagala klien HTTP, paduli perpustakaan. Anjeun oge bisa milih ngirim requests sinkron atawa asynchronously.

Dina sababaraha integrasi, urang masih nganggo klien angkutan resmi, tapi ieu ngan masalah refactoring salajengna. Dina hal ieu, klien custom diwangun dina dasar Spring WebClient dipaké pikeun ngolah.

Optimasi beban dina proyék Highload sareng ElasticSearch

promotion badag

Sataun sakali, proyék éta nyayogikeun promosi anu ageung pikeun pangguna - ieu mangrupikeun Highload anu sami, sabab dina waktos ayeuna urang damel sareng puluhan juta pangguna dina waktos anu sami.

Biasana puncak beban lumangsung nalika liburan, tapi promosi ieu dina tingkat anu béda. Taun saméméh panungtungan, dina poé promosi, urang ngajual 27 unit barang. Data diolah pikeun leuwih ti satengah jam, nu ngabalukarkeun kasulitan pikeun pamaké. Pamaké nampi hadiah pikeun partisipasi, tapi janten jelas yén prosésna kedah digancangan.

Dina awal 2019, kami mutuskeun yén kami peryogi ElasticSearch. Sapanjang taun, urang ngatur ngolah data anu ditampi dina Elastis sareng ngaluarkeunana dina api aplikasi mobile sareng halaman wéb. Hasilna, taun hareup salila kampanye, urang diolah 15 éntri dina 131 menit.

Kusabab urang gaduh seueur jalma anu hoyong mésér barang sareng ngiringan ngagambar hadiah dina promosi, ieu mangrupikeun ukuran samentawis. Ayeuna kami ngirimkeun inpormasi énggal ka Elastis, tapi ka hareup urang ngarencanakeun pikeun mindahkeun inpormasi anu diarsipkeun salami sababaraha bulan ka Postgres salaku panyimpenan permanén. Dina raraga teu bakiak indéks elastis, nu ogé boga watesan na.

Kacindekan / Kacindekan

Ayeuna, kami parantos mindahkeun sadaya jasa anu kami hoyong Elastis sareng parantos ngareureuhkeun ieu ayeuna. Ayeuna urang ngawangun hiji indéks dina elastis dina luhureun gudang pengkuh utama dina Postgres, nu nyokot alih beban pamaké.

Ka hareupna, urang ngarencanakeun pikeun mindahkeun jasa upami urang ngartos yén pamundut data janten rupa-rupa teuing sareng milarian jumlah kolom anu henteu terbatas. Ieu henteu deui tugas pikeun Postgres.

Upami urang peryogi milarian téks lengkep dina fungsionalitas atanapi upami urang gaduh seueur kriteria milarian anu béda, maka urang parantos terang yén ieu kedah ditarjamahkeun kana Elastis.

⌘⌘⌘

Hatur nuhun pikeun maca. Upami perusahaan anjeun ogé nganggo ElasticSearch sareng gaduh kasus palaksanaan nyalira, teras wartosan kami. Éta bakal pikaresepeun pikeun terang kumaha batur 🙂

sumber: www.habr.com

Tambahkeun komentar