Оптимизатсияро дар лоиҳаи Highload бо ElasticSearch бор кунед

Салом, Хабр! Номи ман Максим Васильев, ман ҳамчун таҳлилгар ва менеҷери лоиҳа дар FINCH кор мекунам. Имрӯз ман мехоҳам ба шумо бигӯям, ки чӣ гуна бо истифода аз ElasticSearch мо тавонистем дар 15 дақиқа 6 миллион дархостро коркард кунем ва сарбории ҳаррӯзаи сайти яке аз муштариёнамонро оптимизатсия кунем. Мутаассифона, мо бояд бе ном кор кунем, зеро мо NDA дорем, умедворем, ки мундариҷаи мақола аз ин зарар намебинад. Рафтем.

Чӣ тавр лоиҳа кор мекунад

Дар паси худ мо хидматҳое эҷод мекунем, ки фаъолияти вебсайтҳо ва замимаи мобилии муштарии моро таъмин мекунанд. Сохтори умумиро дар диаграмма дидан мумкин аст:

Оптимизатсияро дар лоиҳаи Highload бо ElasticSearch бор кунед

Дар ҷараёни кор мо миқдори зиёди транзаксияҳоро коркард мекунем: харидҳо, пардохтҳо, муомилот бо тавозуни корбарон, ки барои онҳо мо гузоришҳои зиёдеро нигоҳ медорем, инчунин ин маълумотро ба системаҳои беруна ворид ва содир мекунем.

Инчунин равандҳои баръакс мавҷуданд, вақте ки мо маълумотро аз муштарӣ мегирем ва онро ба корбар интиқол медиҳем. Илова бар ин, равандҳои кор бо пардохтҳо ва барномаҳои бонус вуҷуд доранд.

Заминаи мухтасар

Дар аввал мо PostgreSQL-ро ҳамчун ягона нигаҳдории маълумот истифода мебурдем. Бартариҳои он барои МДМ стандартӣ мебошанд: мавҷудияти транзаксияҳо, забони таҳияшудаи ҷустуҷӯи маълумот, доираи васеи абзорҳо барои ҳамгироӣ; дар якҷоягӣ бо иҷрои хуб ниёзҳои моро дар муддати хеле тӯлонӣ қонеъ кард.

Мо комилан ҳама маълумотро дар Postgres нигоҳ медоштем: аз транзаксияҳо то ахбор. Аммо шумораи корбарон афзоиш ёфт ва бо ин шумораи дархостҳо низ афзоиш ёфт.

Барои фаҳмидан, шумори солонаи сессияҳо дар соли 2017 танҳо дар сайти мизи корӣ 131 миллион буд. Дар соли 2018 - 125 миллион. Соли 2019 боз 130 миллион. Аз версияи мобилии сайт ва замимаи мобилӣ 100-200 миллиони дигар илова кунед ва шумо шумораи зиёди дархостҳо мегиранд.

Вақте ки лоиҳа афзоиш ёфт, Postgres дигар сарборӣ карда наметавонист; мо наметавонистем, ки онро риоя кунем - шумораи зиёди дархостҳои гуногун пайдо шуданд, ки мо натавонистем шумораи кофии индексҳоро эҷод кунем.

Мо фаҳмидем, ки ба дигар мағозаҳои додаҳо эҳтиёҷ вуҷуд дорад, ки ниёзҳои моро қонеъ мекунанд ва бори PostgreSQL-ро бартараф мекунанд. Elasticsearch ва MongoDB ҳамчун вариантҳои имконпазир баррасӣ шуданд. Охирин аз рӯи нуқтаҳои зерин мағлуб шуд:

  1. Суръати сусти индексатсия бо афзоиши ҳаҷми маълумот дар индексҳо. Бо Elastic, суръат аз миқдори маълумот вобаста нест.
  2. Ҷустуҷӯи пурраи матн нест

Ҳамин тавр, мо барои худ Elastic-ро интихоб кардем ва барои гузариш омода шудем.

Гузариш ба Elastic

1. Мо гузаришро бо хадамоти ҷустуҷӯии нуқтаи фурӯш оғоз кардем. Мизоҷи мо дар маҷмӯъ тақрибан 70 000 нуқтаи фурӯш дорад ва ҳамзамон дар вебсайт ва барнома якчанд намуди ҷустуҷӯ лозим аст:

  • Ҷустуҷӯи матн аз рӯи номи маҳал
  • Ҷустуҷӯи географӣ дар радиуси додашуда аз нуқтаи муайян. Масалан, агар корбар мехоҳад бубинад, ки кадом нуқтаи фурӯш ба хонаи ӯ наздиктар аст.
  • Ҷустуҷӯ аз рӯи квадрати додашуда - корбар дар харита як мураббаъро нишон медиҳад ва ҳамаи нуқтаҳои ин радиус ба ӯ нишон дода мешаванд.
  • Ҷустуҷӯ бо филтрҳои иловагӣ. Нуқтаҳои фурӯш аз ҳамдигар аз рӯи ассортимент фарқ мекунанд

Дар бораи созмон сухан гӯем, дар Postgres мо ҳам барои харита ва ҳам ахбор манбаи маълумот дорем ва дар Elastic мо аз маълумоти аслӣ аксҳо месозем. Далели он аст, ки дар аввал Postgres натавонист ба ҷустуҷӯи ҳама меъёрҳо тоб оварад. Индексҳо на танҳо зиёд буданд, балки онҳо метавонанд ҳамҷоя шаванд, аз ин рӯ ҷадвали Postgres гум шуд ва намефаҳмид, ки кадом индексро истифода бурдан лозим аст.

2. Дар навбат бахши ахбор буд. Нашрияҳо ҳамарӯза дар сайт пайдо мешаванд, то корбар дар ҷараёни иттилоот гум нашавад, маълумот бояд пеш аз интишор ба тартиб оварда шавад. Ҷустуҷӯ ин аст: дар сайт шумо метавонед аз рӯи мувофиқати матн ҷустуҷӯ кунед ва ҳамзамон филтрҳои иловагиро пайваст кунед, зеро онҳо инчунин тавассути Elastic сохта шудаанд.

3. Пас аз он мо коркарди транзаксияро кӯчидем. Истифодабарандагон метавонанд маҳсулоти мушаххасро дар сайт харидорӣ кунанд ва дар бозии бурд иштирок кунанд. Пас аз чунин харидҳо, мо миқдори зиёди маълумотро коркард мекунем, махсусан дар рӯзҳои истироҳат ва ид. Барои муќоиса, агар дар рўзњои маъмулї теъдоди хариду фурўшњо дар љое наздики 1,5-2 миллион бошад, дар рўзњои ид ин раќам ба 53 миллион мерасад.

Дар айни замон, маълумот бояд дар ҳадди ақали вақт коркард карда шавад - корбарон намехоҳанд чанд рӯз интизор шаванд, то натиҷаҳо интизор шаванд. Роҳи ба даст овардани чунин мӯҳлатҳо тавассути Postgres нест - мо аксар вақт блокҳоро мегирем ва ҳангоми коркарди ҳама дархостҳо корбарон наметавонистанд тафтиш кунанд, ки онҳо ҷоиза гирифтаанд ё не. Ин барои тиҷорат чандон гуворо нест, аз ин рӯ мо коркардро ба Elasticsearch гузаронидем.

Давомнокӣ

Ҳоло навсозиҳо дар асоси рӯйдодҳо мувофиқи шартҳои зерин танзим карда мешаванд:

  1. Нуқтаҳои фурӯш. Ҳамин ки мо маълумотро аз манбаи беруна мегирем, мо фавран навсозиро оғоз мекунем.
  2. Ахбор. Ҳамин ки ҳама гуна хабар дар сайт таҳрир карда мешавад, он ба таври худкор ба Elastic фиристода мешавад.

Дар ин ҷо бори дигар қайд кардан лозим аст, ки бартариҳои Elastic. Дар Postgres, ҳангоми фиристодани дархост, шумо бояд интизор шавед, ки он ҳама сабтҳоро ростқавлона коркард кунад. Шумо метавонед 10 ҳазор сабтро ба Elastic ирсол кунед ва бидуни мунтазири паҳн шудани сабтҳо ба ҳама Шардҳо фавран ба кор шурӯъ кунед. Албатта, баъзе Shard ё Replica метавонанд маълумотро фавран набинанд, аммо ба зудӣ ҳама чиз дастрас хоҳад шуд.

Усулҳои интегратсия

Ду роҳи ҳамгироӣ бо Elastic вуҷуд дорад:

  1. Тавассути муштарии ватанӣ тавассути TCP. Ронандаи ватанӣ тадриҷан аз байн меравад: он дигар дастгирӣ намешавад ва синтаксиси он хеле нороҳат аст. Бинобар ин, мо амалан аз он истифода намебарем ва кӯшиш мекунем, ки онро комилан тарк кунем.
  2. Тавассути интерфейси HTTP, ки дар он шумо метавонед ҳам дархостҳои JSON ва ҳам синтаксиси Lucene -ро истифода баред. Охирин муҳаррики матнист, ки Elastic истифода мебарад. Дар ин хосият, мо имкон дорем, ки тавассути дархостҳои JSON тавассути HTTP ҷамъоварӣ кунем. Ин вариантест, ки мо кӯшиш мекунем истифода барем.

Ба шарофати интерфейси HTTP, мо метавонем китобхонаҳоеро истифода барем, ки татбиқи асинхронии мизоҷи HTTP-ро таъмин мекунанд. Мо метавонем аз Batch ва API асинхронӣ истифода барем, ки дар ниҳоят иҷрои баланд медиҳад, ки дар рӯзҳои пешбурди калон кӯмаки зиёде кард (бештар дар ин бора дар зер)

Баъзе рақамҳо барои муқоиса:

  • Нигоҳ доштани корбароне, ки дар Postgres дар 20 ришта ҷоиза гирифтаанд, бидуни гурӯҳбандӣ: 460713 сабт дар 42 сония
  • Elastic + муштарии реактивӣ барои 10 ришта + партия барои 1000 элемент: 596749 сабт дар 11 сония
  • Эластики + муштарии реактивӣ барои 10 ришта + партия барои 1000 элемент: 23801684 дар 4 дақиқа сабт мекунад

Ҳоло мо менеҷери дархости HTTP навиштем, ки JSON-ро ҳамчун партия/ғайри партия месозад ва онро тавассути ҳама мизоҷи HTTP, новобаста аз китобхона мефиристад. Шумо инчунин метавонед фиристодани дархостҳоро ба таври синхронӣ ё асинхронӣ интихоб кунед.

Дар баъзе ҳамгироӣ мо то ҳол муштарии расмии нақлиётро истифода мебарем, аммо ин танҳо як масъалаи рефакторинги фаврӣ аст. Дар ин ҳолат барои коркард муштарии худи он, ки дар асоси Spring WebClient сохта шудааст, истифода мешавад.

Оптимизатсияро дар лоиҳаи Highload бо ElasticSearch бор кунед

Таблиғи калон

Дар як сол як маротиба, лоиҳа барои корбарон таблиғи калон баргузор мекунад - ин ҳамон Highload аст, зеро дар айни замон мо бо даҳҳо миллион корбарон ҳамзамон кор мекунем.

Одатан, сарборӣ дар рӯзҳои ид рух медиҳад, аммо ин таблиғ дар сатҳи комилан дигар аст. Соли гузашта, дар р27зи пешбарй мо 580 адад махсулот фурухтем. Барои коркарди маълумот беш аз ним соат вақт сарф шуд, ки боиси нороҳатии корбарон гардид. Истифодабарандагон барои иштирок мукофотҳо гирифтанд, аммо маълум шуд, ки ин равандро суръат бахшидан лозим аст.

Дар аввали соли 2019 мо қарор додем, ки ElasticSearch лозим аст. Дар тӯли як сол, мо коркарди маълумоти гирифташударо дар Elastic ва баромади онро ба API-и замимаи мобилӣ ва вебсайт ташкил кардем. Дар натиҷа, соли оянда дар давоми пешбурди мо коркард 15 сабт дар 131 дақиқа.

Азбаски мо шумораи зиёди одамоне дорем, ки мехоҳанд маҳсулотро харанд ва дар бозии бурднок дар аксияҳои мо иштирок кунанд, ин як чораи муваққатӣ аст. Ҳоло мо маълумоти ҷориро ба Elastic мефиристем, аммо дар оянда мо нақша дорем, ки маълумоти бойгониро барои моҳҳои гузашта ба Postgres ҳамчун нигаҳдории доимӣ интиқол диҳем. Барои он ки шохиси Элатикӣ баста нашавад, ки он низ маҳдудиятҳои худро дорад.

Хулоса / Хулоса

Дар айни замон, мо ҳама хидматҳоеро, ки мехостем ба Elastic интиқол додем ва ҳоло таваққуф кардем. Ҳоло мо дар болои анбори асосии доимӣ дар Postgres як индексро дар Elastic сохта истодаем, ки сарбории корбарро мегирад.

Дар оянда, мо нақша дорем, ки хидматҳоро интиқол диҳем, агар мо дарк кунем, ки дархости маълумот хеле гуногун шуда истодааст ва барои шумораи номаҳдуди сутунҳо ҷустуҷӯ карда мешавад. Ин дигар вазифаи Postgres нест.

Агар ба мо дар функсия ҷустуҷӯи пурраи матн лозим бошад ё агар мо меъёрҳои гуногуни ҷустуҷӯ дошта бошем, мо аллакай медонем, ки ин бояд ба Elastic тарҷума карда шавад.

⌘⌘⌘

Ташаккур барои хондан. Агар ширкати шумо низ ElasticSearch-ро истифода барад ва ҳолатҳои татбиқи худро дошта бошад, лутфан ба мо бигӯед. Донистани он ки дигарон чӣ кор мекунанд, ҷолиб хоҳад буд :)

Манбаъ: will.com

Илова Эзоҳ