Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Чӣ метавонад чунин як ширкати бузурге ба мисли Ламодаро, ки раванди соддашуда ва даҳҳо хидматҳои ба ҳам алоқамандро дорад, маҷбур кунад, ки муносибати худро ба таври назаррас тағйир диҳад? Ҳавасмандкунӣ метавонад комилан гуногун бошад: аз қонунгузорӣ то хоҳиши озмоиш ба ҳама барномасозон хос аст.

Аммо ин маънои онро надорад, ки шумо ба имтиёзҳои иловагӣ умед баста наметавонед. Сергей Зайка ба шумо мегӯяд, ки агар шумо API-и аз рӯйдодҳо асосёфтаро дар Кафка татбиқ кунед, маҳз чӣ ғолиб шуда метавонед (каме). Инчунин бешубҳа дар бораи аксҳои калон ва кашфиётҳои ҷолиб сӯҳбат хоҳанд шуд - таҷриба бидуни онҳо анҷом дода намешавад.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Радди масъулият: Ин мақола ба маводҳои вохӯрие, ки Сергей моҳи ноябри соли 2018 дар HighLoad++ баргузор шуда буд, асос ёфтааст. Таҷрибаи зиндаи Ламода дар бораи кор бо Кафка шунавандагонро на камтар аз гузоришҳои дигари ҷадвал ҷалб кард. Мо фикр мекунем, ки ин як намунаи олиҷаноби он аст, ки шумо ҳамеша метавонед ва бояд одамони ҳамфикрро пайдо кунед ва созмондиҳандагони HighLoad++ минбаъд низ кӯшиш хоҳанд кард, то фазои мусоид барои ин эҷод кунанд.

Дар бораи раванд

Lamoda як платформаи бузурги тиҷорати электронӣ мебошад, ки дорои маркази тамос, хидматрасонии интиқол (ва бисёре аз филиалҳо), студияи аксҳо, анбори бузург аст ва ҳамаи ин бо нармафзори худ кор мекунад. Даҳҳо усулҳои пардохт вуҷуд доранд, шарикони b2b, ки метавонанд баъзе ё ҳама аз ин хидматҳоро истифода баранд ва мехоҳанд маълумоти навтаринро дар бораи маҳсулоти худ бидонанд. Илова бар ин, Lamoda ба ғайр аз Федератсияи Русия дар се кишвар фаъолият мекунад ва дар он ҷо ҳама чиз каме фарқ мекунад. Дар маҷмӯъ, эҳтимолан зиёда аз сад роҳҳо барои танзими фармоиши нав вуҷуд доранд, ки бояд ба таври худ коркард карда шаванд. Ҳамаи ин бо ёрии даҳҳо хидматҳо кор мекунад, ки баъзан бо роҳҳои ғайриоддӣ муошират мекунанд. Инчунин як системаи марказӣ вуҷуд дорад, ки масъулияти асосии он мақоми фармоиш аст. Мо ӯро БОБ меномем, ман бо ӯ кор мекунам.

Асбоби баргардонидан бо API аз рӯйдодҳо асосёфта

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

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

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

Аммо баргардонидани он бо тағирот дар қонун мушкилтар шуд ва мо маҷбур шудем, ки барои он микросервиси алоҳида ҷорӣ кунем.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Ҳавасмандии мо:

  1. Қонун ФЗ-54 - хулоса, қонун талаб мекунад, ки ба идораи андоз дар бораи ҳар як амалиёти пулӣ, хоҳ баргардонида бошад, хоҳ квитансия, дар давоми чанд дақиқаи кӯтоҳмуддати SLA гузориш диҳед. Мо, ҳамчун як ширкати тиҷорати электронӣ, амалиётҳои зиёдеро анҷом медиҳем. Аз ҷиҳати техникӣ, ин маънои масъулияти нав (ва аз ин рӯ хидмати нав) ва такмил додани ҳама системаҳои ҷалбшударо дорад.
  2. тақсимоти BOB як лоиҳаи дохилии ширкат барои озод кардани BOB аз шумораи зиёди масъулиятҳои ғайриасосии ва кам кардани мураккабии умумии он мебошад.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Ин диаграмма системаҳои асосии Lamoda-ро нишон медиҳад. Ҳоло аксарияти онҳо бештаранд як бурҷи 5-10 microservices дар атрофи monolith коҳишёбанда. Онҳо оҳиста-оҳиста афзоиш меёбанд, аммо мо кӯшиш мекунем, ки онҳоро хурдтар созем, зеро ҷойгиркунии порчаи дар мобайн интихобшуда даҳшатнок аст - мо наметавонем афтад. Мо маҷбурем, ки ҳама мубодила (тирҳо) -ро захира кунем ва ба назар гирем, ки ҳар кадоми онҳо дастнорас шуда метавонанд.

BOB инчунин мубодилаи хеле зиёд дорад: системаҳои пардохт, системаҳои интиқол, системаҳои огоҳӣ ва ғайра.

Аз ҷиҳати техникӣ BOB ин аст:

  • ~150к сатри код + ~100к сатри санҷишҳо;
  • php7.2 + Zend 1 & Компонентҳои Symfony 3;
  • > 100 API & ~ 50 ҳамгироии содиротӣ;
  • 4 кишвар бо мантиқи тиҷорати худ.

Ҷойгиркунии BOB гарон ва дардовар аст, миқдори рамзҳо ва мушкилоте, ки он ҳал мекунад, то ҳадде аст, ки ҳеҷ кас наметавонад ҳама чизро ба сари худ гузорад. Умуман, барои содда кардани он сабабҳои зиёд мавҷуданд.

Раванди бозгашт

Дар аввал, ду система дар ин раванд иштирок мекунанд: BOB ва Payment. Ҳоло дуи дигар пайдо мешаванд:

  • Хадамоти фискализатсия, ки мушкилоти фискализатсия ва иртибот бо хидматҳои берунаро ҳал мекунад.
  • Воситаи баргардонидан, ки танҳо мубодилаи навро дар бар мегирад, то BOB-ро пур накунед.

Акнун раванд чунин менамояд:

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

  1. BOB дархост барои баргардонидани маблағ қабул мекунад.
  2. BOB дар бораи ин абзори баргардонидан сӯҳбат мекунад.
  3. Воситаи баргардонидан ба пардохт мегӯяд: "Пулро баргардонед."
  4. Пардохт пулро бармегардонад.
  5. Асбоби баргардонидан ва BOB вазъиятҳоро бо ҳамдигар ҳамоҳанг мекунанд, зеро ҳоло ҳардуи онҳо ба он ниёз доранд. Мо ҳоло омода нестем, ки пурра ба Асбоби Баргардонида гузарем, зеро BOB дорои интерфейси интерфейси корбар, ҳисоботҳо барои баҳисобгирӣ ва дар маҷмӯъ маълумоти зиёде дорад, ки ба осонӣ интиқол дода намешаванд. Шумо бояд дар ду курсӣ нишинед.
  6. Дархост барои фискализатсия аз байн меравад.

Дар натиҷа, мо як навъ автобуси чорабиниҳоро дар Кафка сохтем - event-автобус, ки ҳама чиз дар он оғоз ёфт. Оре, ҳоло мо як нуқтаи нокомӣ дорем (сарказм).

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Тарафҳо ва манфиҳо хеле равшананд. Мо автобус сохтем, яъне акнун тамоми хизматрасонй ба он вобаста аст. Ин тарҳро содда мекунад, аммо як нуқтаи нокомиро дар система ҷорӣ мекунад. Кафка вайрон мешавад, раванд қатъ мешавад.

API-и ба рӯйдодҳо асосёфта чист

Ҷавоби хуб ба ин савол дар гузориши Мартин Фаулер аст (GOTO 2017) "Маъноҳои зиёди меъмории ба рӯйдодҳо асосёфта".

Ба таври мухтасар чӣ кор кардем:

  1. Ҳама мубодилаи асинхронӣ тавассути нигаҳдории рӯйдодҳо. Ба ҷои огоҳ кардани ҳар як истеъмолкунандаи манфиатдор дар бораи тағирёбии вазъ дар шабака, мо воқеаеро дар бораи тағирёбии вазъ ба анбори мутамарказ менависем ва истеъмолкунандагоне, ки ба мавзӯъ таваҷҷӯҳ доранд, ҳама чизеро, ки аз он ҷо пайдо мешаванд, мехонанд.
  2. Ҳодиса дар ин ҳолат огоҳинома мебошад (огоҳиҳо) ки чизе дар ягон чо тагьир ёфтааст. Масалан, ҳолати фармоиш тағйир ёфт. Истеъмолкунандае, ки ба баъзе маълумоте, ки бо тағирёбии вазъ, ки ба огоҳинома дохил карда нашудааст, манфиатдор аст, метавонад ҳолати онро худаш фаҳмад.
  3. Варианти максималӣ сарчашмаи пурраи чорабиниҳо мебошад, интиқоли давлатӣ, дар кадом ҳолат тамоми маълумоти барои коркард заруриро дар бар мегирад: он аз куҷо пайдо шуд ва ба кадом мақом рафт, маълумот чӣ гуна маҳз тағйир ёфт ва ғайра. Ягона савол ин имконпазирӣ ва ҳаҷми иттилоотест, ки шумо метавонед нигоҳ доред.

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

Хидмати асбоби баргардонидан бор карда нашудааст, Пас Кафка таъми қалам бештар аз зарурат вуҷуд дорад. Ман фикр намекунам, ки агар хидмати баргардонидани маблағ як лоиҳаи пурбор шавад, тиҷорат хушбахт хоҳад буд.

Мубодилаи асинхронӣ ТО КИ АСТ

Барои мубодилаи асинхронӣ, шӯъбаи PHP одатан RabbitMQ -ро истифода мебарад. Мо маълумотро барои дархост ҷамъоварӣ кардем, онро ба навбат гузоштем ва истеъмолкунандаи ҳамон хидмат онро хонд ва фиристод (ё нафиристод). Барои худи API, Lamoda Swagger-ро фаъолона истифода мебарад. Мо API тарроҳӣ мекунем, онро дар Swagger тавсиф мекунем ва рамзи муштарӣ ва сервер тавлид мекунем. Мо инчунин каме такмилёфтаи JSON RPC 2.0 -ро истифода мебарем.

Дар баъзе ҷойҳо автобусҳои ESB истифода мешаванд, баъзеҳо дар activeMQ зиндагӣ мекунанд, аммо дар маҷмӯъ, RabbitMQ - стандартӣ.

Мубодилаи асинкӣ ТО BE

Ҳангоми тарҳрезии мубодила тавассути рӯйдодҳои автобус, аналогияро метавон пайгирӣ кард. Мо ба ин монанд мубодилаи маълумоти ояндаро тавассути тавсифи сохтори рӯйдодҳо тавсиф мекунем. Формати yaml, мо маҷбур шудем, ки тавлиди кодро худамон анҷом диҳем, генератор мувофиқи мушаххасот DTO-ҳоро эҷод мекунад ва ба мизоҷон ва серверҳо кор бо онҳо таълим медиҳад. Насл ба ду забон мегузарад - голанг ва php. Ин барои муттасил нигоҳ доштани китобхонаҳо кӯмак мекунад. Генератор бо забони голанг навишта шудааст, бинобар ин он номи гогиро гирифтааст.

Сарчашмаи рӯйдодҳо дар Кафка як чизи маъмулист. Як роҳи ҳалли версияи асосии корхонаи Kafka Confluent вуҷуд дорад накади, ҳалли аз бародарони домени мо Заландо. мо ҳавасмандӣ барои оғоз бо ванилин Кафка - ин маънои онро дорад, ки ҳалли ройгонро то он даме, ки дар ниҳоят қарор қабул кунем, ки оё мо онро дар ҳама ҷо истифода мебарем ва инчунин барои маневр ва беҳбудиҳо барои худ ҷой гузорем: мо мехоҳем, ки барои мо дастгирӣ кунем. JSON RPC 2.0, генераторҳо барои ду забон ва биёед бубинем, ки боз чӣ.

Ачабовар аст, ки хатто дар чунин холати хурсандибахш, вакте ки корхонаи такрибан ба ин монанд вучуд дорад, Заландо, ки такрибан як хел карор додааст, мо аз он самаранок истифода бурда наметавонем.

Намунаи меъморӣ ҳангоми оғозёбӣ чунин аст: мо бевосита аз Кафка мехонем, аммо танҳо тавассути рӯйдодҳо-автобус менависем. Дар Кафка чизҳои зиёде барои хондан омодаанд: брокерҳо, мувозинаткунандагон ва он барои миқёси уфуқӣ каму беш омода аст, ман мехостам инро нигоҳ дорам. Мо мехостем, ки сабтро тавассути як Gateway aka Events-bus анҷом диҳем ва ин аст, ки чаро.

Ҳодисаҳо - автобус

Ё автобуси чорабиниҳо. Ин танҳо як дарвозаи http-и бешаҳрванд аст, ки якчанд нақшҳои муҳимро ба ӯҳда мегирад:

  • Истеҳсоли тасдиқ — мо тафтиш мекунем, ки чорабинихо ба талаботи мо мувофик бошанд.
  • Системаи Master Events, яъне ин системаи асосӣ ва ягона дар ширкат аст, ки ба саволи он, ки бо кадом сохторҳо эътиборнок ҳисобида мешаванд, ҷавоб медиҳад. Тасдиқ танҳо намудҳои маълумот ва рақамҳоро барои ба таври қатъӣ муайян кардани мундариҷа дар бар мегирад.
  • Функсияи хэш барои sharding - сохтори паёми Кафка калид-арзиш аст ва бо истифода аз хэши калид он ба куҷо гузоштани он ҳисоб карда мешавад.

чаро

Мо дар як ширкати калон бо раванди соддашуда кор мекунем. Чаро чизеро тағир диҳед? Ин як таҷриба аст, ва мо интизорем, ки якчанд фоида ба даст орем.

1:n+1 мубодила (як ба бисёр)

Кафка пайваст кардани истеъмолкунандагони навро ба API хеле осон мекунад.

Фарз мекунем, ки шумо феҳрист доред, ки шумо бояд дар як вақт дар якчанд система (ва дар баъзе системаҳои нав) навсозӣ кунед. Пештар, мо як бастаеро ихтироъ карда будем, ки set-API-ро амалӣ мекард ва системаи асосӣ аз суроғаҳои истеъмолкунандагон огоҳ карда мешуд. Акнун системаи магистрӣ навсозиҳои мавзӯъро мефиристад ва ҳар касе, ки таваҷҷӯҳ дорад, онро мехонад. Системаи нав пайдо шуд - мо онро барои мавзӯъ сабт кардем. Бале, инчунин баста, аммо соддатар.

Дар мавриди баргардонидани асбоб, ки як пораи BOB аст, барои мо қулай аст, ки онҳоро тавассути Кафка ҳамоҳанг созем. Пардохт мегӯяд, ки пул баргардонида шудааст: БОБ, ҶТ аз ин хабар ёфта, мақоми худро иваз карданд, Хадамоти фискализатсия аз ин хабар ёфта, чек дод.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Мо нақша дорем, ки Хадамоти ягонаи огоҳиномаро таъсис диҳем, ки мизоҷро дар бораи навигариҳо дар бораи фармоиш/бозгашти ӯ огоҳ созад. Холо ин масъулият дар байни системахо пахн карда шудааст. Барои мо кофӣ хоҳад буд, ки ба Хадамоти огоҳиномаҳо омӯзем, ки иттилооти мувофиқро аз Кафка гирифта, ба он посух гӯем (ва ин огоҳиҳоро дар системаҳои дигар хомӯш кунед). Ягон мубодилаи мустақими нав талаб карда намешавад.

Маълумот

Иттилоот байни системаҳо шаффоф мешавад - новобаста аз он ки шумо чӣ гуна "корхонаи хунин" доред ва новобаста аз он ки паси шумо то чӣ андоза пурқувват аст. Lamoda дорои шӯъбаи таҳлили додаҳо мебошад, ки маълумотро аз системаҳо ҷамъоварӣ мекунад ва онро ба шакли дубора истифодашаванда ҳам барои тиҷорат ва ҳам барои системаҳои интеллектуалӣ мегузорад. Кафка ба шумо имкон медиҳад, ки ба зудӣ ба онҳо маълумоти зиёде диҳед ва ҷараёни ин иттилоотро то ба имрӯз нигоҳ доред.

Сабти такрорӣ

Паёмҳо пас аз хондан нопадид намешаванд, чунон ки дар RabbitMQ. Вақте ки ҳодиса дорои маълумоти кофӣ барои коркард, мо таърихи тағйироти охирини объектро дорем ва агар хоҳед, қобилияти татбиқи ин тағиротро дорем.

Мӯҳлати нигоҳдории сабти нусхабардорӣ аз шиддати навиштан ба ин мавзӯъ вобаста аст; Кафка ба шумо имкон медиҳад, ки ба таври фасеҳ маҳдудиятҳои вақти нигоҳдорӣ ва ҳаҷми маълумотро муқаррар кунед. Барои мавзӯъҳои пуршиддат муҳим аст, ки ҳамаи истеъмолкунандагон вақт дошта бошанд, то маълумотро пеш аз нопадидшавӣ, ҳатто дар сурати корношоямии кӯтоҳмуддат мутолиа кунанд. Одатан барои нигоҳ доштани маълумот имконпазир аст воҳиди рӯз, ки барои дастгирй комилан кифоя аст.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Баъдан, каме бозгӯи ҳуҷҷатҳо, барои онҳое, ки бо Кафка ошно нестанд (расм низ аз ҳуҷҷатҳост)

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

Кафка низ чунин абстраксия дорад мавзӯъ, ки дар он шумо паём менависед, аммо пас аз хондан онҳо нопадид намешаванд. Бо нобаёнӣ, вақте ки шумо ба Кафка пайваст мешавед, шумо ҳама паёмҳоро қабул мекунед ва имкон доред, ки дар ҷои таваққуф нигоҳ дошта бошед. Яъне шумо пайдарпай мехонед, шумо метавонед паёмро ҳамчун хондашуда қайд накунед, аммо ID-ро захира кунед, ки аз он шумо метавонед хонданро идома диҳед. Id, ки шумо дар он қарор гирифтед, офсет номида мешавад ва механизм ҷуброн карда мешавад.

Мувофиқи он, мантиқи гуногунро амалӣ кардан мумкин аст. Масалан, мо дар 4 маврид барои кишварҳои гуногун BOB дорем - Ламода дар Русия, Қазоқистон, Украина, Беларус аст. Азбаски онҳо алоҳида ҷойгир карда шудаанд, онҳо конфигуратсияҳои каме гуногун ва мантиқи тиҷорати худро доранд. Мо дар паём нишон медиҳем, ки он ба кадом кишвар ишора мекунад. Ҳар як истеъмолкунандаи BOB дар ҳар як кишвар бо гурӯҳи ID-и гуногун мехонад ва агар паём ба онҳо дахл накунад, онҳо онро мегузаранд, яъне. фавран +1 ҷуброн мекунад. Агар ҳамон як мавзӯъро Хадамоти пардохти мо мехонад, он гоҳ ин корро бо гурӯҳи алоҳида анҷом медиҳад ва аз ин рӯ офсетҳо бурида намешаванд.

Талабот барои чорабинӣ:

  • Мукаммалии маълумот. Ман мехоҳам, ки чорабинӣ маълумоти кофӣ дошта бошад, то он коркард шавад.

  • Беайбӣ. Мо ба Events-bus тасдиқ мекунем, ки ин чорабинӣ мувофиқ аст ва он метавонад онро коркард кунад.
  • Тартиб муҳим аст. Дар сурати бозгашт мо маҷбурем бо таърих кор кунем. Бо огоҳиҳо, фармоиш муҳим нест, агар онҳо огоҳиномаҳои якхела бошанд, почтаи электронӣ новобаста аз он ки кадом фармоиш аввал расидааст, ҳамон хоҳад буд. Дар сурати баргардонидани маблағ, раванди возеҳ вуҷуд дорад; агар мо фармоишро тағир диҳем, истисноҳо ба вуҷуд меоянд, баргардонидани маблағ эҷод ё коркард карда намешавад - мо ба ҳолати дигар дучор мешавем.
  • Мутобиқати. Мо мағоза дорем ва ҳоло мо ба ҷои API рӯйдодҳо эҷод мекунем. Мо ба роҳи зуд ва арзон интиқол додани маълумот дар бораи рӯйдодҳои нав ва тағиротҳои мавҷуда ба хидматҳои мо ниёз дорем. Ин тавассути мушаххасоти умумӣ дар анбори алоҳидаи git ва генераторҳои код ба даст оварда мешавад. Аз ин рӯ, мизоҷон ва серверҳо дар хидматҳои гуногун ҳамоҳанг карда мешаванд.

Кафка дар Ламода

Мо се насби Кафка дорем:

  1. Сабтҳо;
  2. R&D;
  3. Ҳодисаҳо - автобус.

Имруз мо факат дар бораи нуктаи охирин сухан меронем. Дар чорабиниҳо-автобус, мо насби хеле калон надорем - 3 брокер (сервер) ва ҳамагӣ 27 мавзӯъ. Чун қоида, як мавзӯъ як раванд аст. Аммо ин нуктаи нозук аст ва мо хозир ба он дахл мекунем.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Дар боло графики rps аст. Раванди баргардонидани маблағ бо хати фирӯзӣ ишора шудааст (бале, дар меҳвари X) ва хати гулобӣ раванди навсозии мундариҷа мебошад.

Каталоги Lamoda миллионҳо маҳсулотро дар бар мегирад ва маълумот ҳама вақт нав карда мешавад. Баъзе коллексияҳо аз мӯд берун мешаванд, барои иваз кардани онҳо коллексияҳои нав бароварда мешаванд ва дар каталог мунтазам моделҳои нав пайдо мешаванд. Мо мекӯшем пешгӯӣ кунем, ки фардо барои муштариёни мо чӣ ҷолиб хоҳад буд, аз ин рӯ мо пайваста чизҳои нав мехарем, онҳоро аксбардорӣ мекунем ва дисплейро навсозӣ мекунем.

Қуллаҳои гулобӣ навсозиҳои маҳсулот, яъне тағирот дар маҳсулот мебошанд. Дидан мумкин аст, ки бачаҳо сурат гирифтанд, сурат гирифтанд ва баъд боз! — як бастаи чорабиниҳоро бор кард.

Ҳодисаҳои истифодаи Lamoda Events

Мо меъмории сохташударо барои амалҳои зерин истифода мебарем:

  • Бозгашти пайгирии ҳолати: даъват ба амал ва пайгирии вазъият аз ҳама системаҳои ҷалбшуда. Пардохт, вазъиятҳо, фискализатсия, огоҳиҳо. Дар ин ҷо мо равишро санҷидем, асбобҳо сохтем, ҳама хатоҳоро ҷамъ овардем, ҳуҷҷат навиштем ва ба ҳамкасбони худ чӣ гуна истифода бурдани онро нақл кардем.
  • Навсозии кортҳои маҳсулот: конфигуратсия, мета-маълумот, хусусиятҳо. Як система мехонад (ки намоиш медиҳад) ва якчанд менависанд.
  • Почтаи электронӣ, push ва sms: заказ чамъ шуд, заказ омад, баргардонда шуд ва гайра бисьёранд.
  • Захира, навсозии анбор — навсозии микдори ашьёхо, танхо ракамхо: ба анбор омадан, баргаштан. Зарур аст, ки ҳамаи системаҳои марбут ба захира кардани молҳо бо маълумоти ҷорӣ кор кунанд. Дар айни замон, системаи навсозии саҳмияҳо хеле мураккаб аст; Кафка онро содда мекунад.
  • Таҳлили маълумот (Шӯъбаи R&D), воситаҳои ML, таҳлил, омор. Мо мехоҳем, ки иттилоот шаффоф бошад - Кафка барои ин хеле мувофиқ аст.

Ҳоло қисми ҷолибтар дар бораи зарбаҳои калон ва кашфиётҳои ҷолибе, ки дар шаш моҳи охир ба амал омадаанд.

Проблемаҳои тарҳрезӣ

Фарз мекунем, ки мо мехоҳем як чизи нав кунем - масалан, тамоми раванди интиқолро ба Кафка интиқол диҳед. Ҳоло як қисми ин раванд дар коркарди фармоиш дар BOB амалӣ карда мешавад. Дар паси интиқоли фармоиш ба хидматрасонӣ, ҳаракат ба анбори мобайнӣ ва ғайра модели статус мавҷуд аст. Як монолити пурра, ҳатто ду ва инчунин як қатор APIҳо барои таҳвил бахшида шудаанд. Онҳо дар бораи интиқол бештар медонанд.

Чунин ба назар мерасад, ки ин соҳаҳо ба ҳам монанданд, аммо коркарди фармоиш дар BOB ва системаи интиқоли онҳо мақоми гуногун доранд. Масалан, баъзе хизматрасониҳои курьерӣ на мақоми фосилавӣ, балки танҳо охиринро мефиристанд: "супоридашуда" ё "гумшуда". Дигарон, баръакс, дар бораи харакати мол муфассал хабар медиханд. Ҳар як шахс қоидаҳои тасдиқи худро дорад: барои баъзеҳо, почтаи электронӣ эътибор дорад, яъне он коркард мешавад; барои дигарон ин эътибор надорад, аммо фармоиш то ҳол коркард мешавад, зеро рақами телефон барои тамос вуҷуд дорад ва касе мегӯяд, ки чунин фармоиш умуман коркард намешавад.

Ҷараёни маълумот

Дар мавриди Кафка масъалаи ташкили ҷараёни маълумот ба миён меояд. Ин вазифа интихоби стратегияро дар асоси якчанд нуктаҳо дар бар мегирад; биёед ҳамаи онҳоро дида бароем.

Дар як мавзӯъ ё дар мавзӯъҳои гуногун?

Мо мушаххасоти чорабинӣ дорем. Дар BOB мо менависем, ки фалон фармоиш бояд расонида шавад ва нишон диҳед: рақами фармоиш, таркиби он, баъзе SKU ва штрих-кодҳо ва ғайра. Вақте ки мол ба анбор ворид мешавад, интиқол метавонад статусҳо, тамғаҳои вақт ва ҳама чизҳои заруриро гирад. Аммо он гоҳ мо мехоҳем, ки навсозиҳои ин маълумотро дар BOB гирем. Мо раванди баръакси гирифтани маълумотро аз таҳвил дорем. Оё ин ҳамон ҳодиса аст? Ё ин мубодилаи алоҳидаест, ки сазовори мавзӯи худ аст?

Эҳтимол, онҳо хеле монанд хоҳанд буд ва васвасаи сохтани як мавзӯъ беасос нест, зеро мавзӯи алоҳида маънои истеъмолкунандагони алоҳида, конфигуратсияҳои алоҳида, насли алоҳидаи ҳамаи инҳоро дорад. Аммо факт нест.

Майдони нав ё чорабинии нав?

Аммо агар шумо ҳамон рӯйдодҳоро истифода баред, пас мушкилоти дигар ба миён меояд. Масалан, на ҳама системаҳои интиқол метавонанд намуди DTO-ро, ки BOB тавлид карда метавонанд, тавлид кунанд. Мо ба онҳо ID мефиристем, аммо онҳо онро захира намекунанд, зеро онҳо ба он ниёз надоранд ва аз нуқтаи назари оғози раванди автобусҳо, ин майдон талаб карда мешавад.

Агар мо қоидаеро барои ҳодиса-автобус ҷорӣ кунем, ки ин майдон талаб карда мешавад, пас мо маҷбур мешавем, ки дар BOB ё коркардкунандаи рӯйдодҳои оғоз қоидаҳои тасдиқи иловагиро муқаррар кунем. Санҷиш дар тамоми хидмат паҳн мешавад - ин чандон қулай нест.

Мушкилоти дигар ин васвасаи рушди афзоянда мебошад. Ба мо мегуянд, ки ба ин чорабинй чизе илова кардан лозим аст ва шояд, агар фикр кунем, бояд як вокеаи алохида бошад. Аммо дар схемаи мо вокеаи алохида мавзуи алохида аст. Мавзӯи алоҳида тамоми равандест, ки ман дар боло тавсиф кардам. Таҳиягар васвасаи он аст, ки танҳо майдони дигарро ба схемаи JSON илова кунад ва онро дубора тавлид кунад.

Дар сурати баргардонидани маблағ, мо дар давоми ним сол ба рӯйдодҳо расидем. Мо як мета-чорабинӣ доштем, ки навсозии баргардонида номида мешавад, ки дар он майдони намуд мавҷуд буд, ки дар асл чӣ будани ин навсозиро тавсиф мекунад. Аз ин рӯ, мо гузаргоҳҳои "аҷоиб" бо валидаторҳо доштем, ки ба мо гуфтанд, ки чӣ гуна ин ҳодисаро бо ин намуд тасдиқ кунем.

Версияи рӯйдодҳо

Барои тасдиқи паёмҳо дар Кафка шумо метавонед истифода баред Avro, вале зарур буд, ки фавран ба он фидо ва истифода Confluent. Дар ҳолати мо, мо бояд бо версия эҳтиёткор бошем. На ҳама вақт дубора хондани паёмҳо аз сабти такрорӣ имконпазир хоҳад буд, зеро модел "чап" кардааст. Асосан, он рӯй медиҳад, ки версияҳо сохта шаванд, то модел ба ақиб мувофиқ бошад: масалан, майдонро муваққатан ихтиёрӣ созед. Агар фарқиятҳо хеле қавӣ бошанд, мо дар мавзӯи нав навиштанро оғоз мекунем ва муштариёнро ҳангоми хондани мавзӯи кӯҳна интиқол медиҳем.

Тартиби хондани қисмҳо кафолат дода мешавад

Мавзӯъҳо дар дохили Кафка ба қисмҳо тақсим мешаванд. Ҳангоми тарҳрезии субъектҳо ва биржаҳо, ин чандон муҳим нест, аммо ҳангоми тасмимгирӣ дар бораи истеъмол ва миқёси он муҳим аст.

Дар сурати маъмулӣ шумо як мавзӯъро дар Кафка менависед. Бо нобаёнӣ, як қисм истифода мешавад ва ҳама паёмҳои ин мавзӯъ ба он мераванд. Ва истеъмолкунанда дар натиҷа ин паёмҳоро пайдарпай мехонад. Биёед бигӯем, ки ҳоло мо бояд системаро васеъ кунем, то паёмҳоро ду истеъмолкунандаи гуногун хонанд. Агар, масалан, шумо SMS мефиристед, пас шумо метавонед ба Кафка бигӯед, ки қисмати иловагӣ созад ва Кафка ба тақсим кардани паёмҳо ба ду қисм оғоз мекунад - нисфи ин ҷо, нисфи ин ҷо.

Кафка онҳоро чӣ гуна тақсим мекунад? Ҳар як паём дорои маҷмӯа (дар он мо JSON нигоҳ дошта мешавад) ва калид дорад. Шумо метавонед ба ин калид функсияи hash замима кунед, ки он муайян мекунад, ки паём ба кадом қисмат ворид мешавад.

Дар ҳолати мо бо баргардонидани маблағ, ин муҳим аст, агар мо ду қисмро гирем, пас имкон дорад, ки истеъмолкунандаи мувозӣ ҳодисаи дуюмро пеш аз аввал коркард кунад ва мушкилот ба вуҷуд ояд. Функсияи hash кафолат медиҳад, ки паёмҳои дорои як калид дар як қисм хотима меёбанд.

Ҳодисаҳо ва фармонҳо

Ин боз як мушкилиест, ки мо дучор шудем. Ҳодиса як ҳодисаи муайян аст: мо мегӯем, ки чизе дар ҷое рух додааст (чизе_рӯй дод), масалан, ашё бекор карда шуд ё баргардонида шуд. Агар касе ба ин рӯйдодҳо гӯш диҳад, мувофиқи "маълумоти бекоршуда", субъекти баргардонида мешавад ва дар ҷое дар танзимот "баргардонида шуд" навишта мешавад.

Аммо одатан, вақте ки шумо рӯйдодҳоро тарҳрезӣ мекунед, шумо онҳоро беҳуда навиштан намехоҳед - шумо ба он боварӣ доред, ки касе онҳоро мехонад. Васвасаи зиёд вуҷуд дорад, ки на чизеро_рӯй дод (беэътибор_шуда, баргардонидашуда), балки чизе_бояд иҷро шавад. Масалан, ашё барои баргардонидан омода аст.

Аз як тараф, он пешниҳод мекунад, ки ин чорабинӣ чӣ гуна истифода мешавад. Аз тарафи дигар, он ба номи муқаррарии ҳодиса камтар монанд аст. Ғайр аз ин, он аз ин ҷо ба фармони do_something дур нест. Аммо шумо кафолат надоред, ки касе ин воқеаро мехонад; ва агар шумо онро хонед, пас онро бомуваффақият хонед; ва агар шумо онро бомуваффақият хонед, пас шумо чизе кардед ва он чизе муваффақ буд. Лаҳзае, ки рӯйдод ба коре табдил меёбад, фикру мулоҳиза зарур мешавад ва ин мушкилот аст.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Дар мубодилаи асинхронӣ дар RabbitMQ, вақте ки шумо паёмро мехонед, ба http равед, шумо ҷавоб доред - ҳадди аққал ин паём гирифта шудааст. Вақте ки шумо ба Кафка менависед, паёме ҳаст, ки шумо ба Кафка навиштаед, аммо шумо дар бораи коркарди он чизе намедонед.

Аз ин рӯ, дар мавриди мо мо маҷбур шудем, ки як чорабинии ҷавобӣ ҷорӣ кунем ва мониторинг ташкил кунем, ки агар ин қадар ҳодиса фиристода шавад, пас аз фалон вақт ҳамон миқдор ҳодисаҳои ҷавобӣ биёянд. Агар ин рӯй надиҳад, пас ба назар чунин менамояд, ки чизе нодуруст рафтааст. Масалан, агар мо ҳодисаи "ready_to_refund" -ро фиристем, мо интизорем, ки баргардонида мешавад, пул ба муштарӣ баргардонида мешавад ва ҳодисаи "money_refunded" ба мо фиристода мешавад. Аммо ин дақиқ нест, бинобар ин мониторинг лозим аст.

Равшанҳо

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

Мо дар ин бора медонистем, ба он умед мебандем, вале ин тавр шуд. Ва ин аз он сабаб рӯй дод, ки ҳодиса аз нуқтаи назари рӯйдодҳо-автобус дуруст буд, ҳодиса аз нуқтаи назари валидатори барнома дуруст буд, аммо аз нуқтаи назари PostgreSQL эътибор надошт, зеро дар як системаи мо MySQL бо UNSIGNED INT ва дар системаи нав навишташуда PostgreSQL танҳо бо INT дошт. Андозаи ӯ каме хурдтар аст ва Id мувофиқат намекард. Симфони ба истиснои ҳолатҳо фавтид. Мо, албатта, истисноро ба даст овардем, зеро мо ба он такя мекардем ва ин ҷуброн карданӣ будем, аммо пеш аз ин мо мехостем ҳисобкунаки мушкилотро афзоиш диҳем, зеро паём бомуваффақият коркард карда шуд. Ҳисобкунакҳо дар ин лоиҳа низ дар пойгоҳи додаҳо ҳастанд ва Symfony аллакай иртиботро бо пойгоҳи додаҳо бастааст ва истиснои дуюм тамоми равандро бидуни имкони ҷуброн кардани офсет кушт.

Хидмат чанд муддат хобид - хушбахтона, бо Кафка ин чандон бад нест, зеро паёмҳо боқӣ мемонанд. Вақте ки кор барқарор мешавад, шумо метавонед онҳоро хонданро анҷом диҳед. Ин бароҳат аст.

Кафка дорои қобилияти муқаррар кардани ҷуброни ихтиёрӣ тавассути асбобҳо мебошад. Аммо барои ин ба шумо лозим аст, ки ҳамаи истеъмолкунандагонро қатъ кунед - дар ҳолати мо, як нашри алоҳида омода кунед, ки дар он истеъмолкунандагон, ҷойгиркунӣ вуҷуд надоранд. Он гоҳ дар Кафка шумо метавонед офсетро тавассути асбобҳо иваз кунед ва паём тавассути он мегузарад.

Боз як нюанс - сабти такрорӣ против rdkafka.so — ба хусусиятхои лоихаи мо дахл дорад. Мо PHP-ро истифода мебарем ва дар PHP, чун ќоида, њамаи китобхонањо бо Кафка тавассути анбори rdkafka.so муошират мекунанд ва он гоњ як навъ печанда мављуд аст. Шояд ин душвориҳои шахсии мо бошад, аммо маълум шуд, ки танҳо аз нав хондани як пораи он чизе, ки қаблан хонда будем, чандон осон нест. Умуман, мушкилоти нармафзор вуҷуд дошт.

Бозгашт ба мушаххасоти кор бо қисмҳо, он дуруст дар ҳуҷҷатҳо навишта шудааст истеъмолкунандагон >= қисмҳои мавзӯъ. Аммо ман дар ин бора хеле дертар фаҳмидам, ки ман мехостам. Агар шумо хоҳед, ки миқёс кунед ва ду истеъмолкунанда дошта бошед, ба шумо ҳадди аққал ду қисм лозим аст. Яъне, агар шумо як қисме дошта бошед, ки дар он 20 ҳазор паём ҷамъ шуда буд ва шумо як қисми нав сохтед, шумораи паёмҳо ба зудӣ баробар карда намешаванд. Аз ин рӯ, барои доштани ду истеъмолкунандаи мувозӣ, шумо бояд бо қисмҳо кор кунед.

Мониторинг

Ман фикр мекунам, ки тарзи назорати мо боз ҳам равшантар мешавад, ки дар равиши мавҷуда чӣ мушкилот вуҷуд дорад.

Масалан, мо ҳисоб мекунем, ки чанд маҳсулот дар пойгоҳи додаҳо мақоми худро тағйир додаанд ва мувофиқан, воқеаҳо бояд дар асоси ин тағирот рух медоданд ва мо ин рақамро ба системаи мониторинги худ мефиристем. Пас аз Кафка рақами дуюмро мегирем, ки воқеан чанд ҳодиса сабт шудааст. Аён аст, ки фарқияти байни ин ду рақам ҳамеша бояд сифр бошад.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Илова бар ин, шумо бояд назорат кунед, ки истеҳсолкунанда чӣ гуна кор мекунад, оё воқеаҳо-автобус паёмҳоро гирифтаанд ва чӣ тавр истеъмолкунанда кор мекунад. Масалан, дар диаграммаҳои зер, Воситаи баргардонидан хуб кор мекунад, аммо BOB ба таври возеҳ баъзе мушкилот дорад (қуллаҳои кабуд).

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Ман аллакай ақибмонии гурӯҳи истеъмолкунандагонро зикр кардам. Тахминан, ин шумораи паёмҳои нохонда аст. Умуман, истеъмолкунандагони мо зуд кор мекунанд, бинобар ин ақибмонӣ одатан 0 аст, аммо баъзан метавонад авҷи кӯтоҳмуддат бошад. Кафка метавонад инро аз қуттӣ иҷро кунад, аммо шумо бояд фосилаи муайянро муқаррар кунед.

Лоиҳа вуҷуд дорад Бурроки ба шумо дар бораи Кафка маълумоти бештар медихад. Он танҳо API-и гурӯҳи истеъмолкунандагонро барои додани вазъи ин гурӯҳ истифода мебарад. Илова ба OK ва Failed, огоҳӣ мавҷуд аст ва шумо метавонед фаҳмед, ки истеъмолкунандагони шумо ба суръати истеҳсолот тоб оварда наметавонанд - онҳо барои тафтиш кардани чизҳои навишташуда вақт надоранд. Система хеле оқил аст ва истифодааш осон аст.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Чунин аст посухи API ба назар мерасад. Дар ин ҷо гурӯҳи bob-live-fifa, partition refund.update.v1, ҳолати OK, lag 0 - охирин ҷуброн кардани чунин ва ғайра.

Таҷриба дар таҳияи хидмати Бозгашти Асбоб бо API асинхронӣ дар Кафка

Мониторинг updated_at SLA (часпида) Ман аллакай зикр кардам. Масалан, маҳсулот ба ҳолати омодагии бозгашт табдил ёфтааст. Мо Cron-ро насб мекунем, ки мегӯяд, ки агар дар тӯли 5 дақиқа ин объект баргардонида нашавад (мо пулро тавассути системаҳои пардохт хеле зуд бармегардонем), пас чизе бешубҳа хато кард ва ин бешубҳа як парванда барои дастгирӣ аст. Аз ин рӯ, мо танҳо Cron-ро мегирем, ки ин чизҳоро мехонад ва агар онҳо аз 0 зиёдтар бошанд, он огоҳӣ мефиристад.

Барои ҷамъбаст, истифодаи рӯйдодҳо қулай аст, вақте ки:

  • иттилоот ба якчанд система лозим аст;
  • натиҷаи коркард муҳим нест;
  • ходисахо ва ё вокеахои хурд каманд.

Чунин ба назар мерасад, ки мақола як мавзӯи хеле мушаххас дорад - API-и асинхронӣ дар Кафка, аммо дар робита ба он ман мехоҳам дар як вақт бисёр чизҳоро тавсия диҳам.
Аввалан, оянда HighLoad++ мо бояд то моҳи ноябр интизор шавем, дар моҳи апрел версияи Санкт-Петербург хоҳад буд ва дар моҳи июн мо дар бораи бори баланд дар Новосибирск сӯҳбат хоҳем кард.
Сониян, муаллифи гузориш Сергей Зайка узви Кумитаи барномавии конфронси нави мо оид ба идоракунии дониш мебошад. KnowledgeConf. Конференция якруза аст, 26 апрель барпо мегардад, вале программаи он хеле пуршиддат аст.
Ва он дар моҳи май хоҳад буд PHP Русия и RIT++ (бо DevOpsConf дохил карда шудааст) - шумо инчунин метавонед мавзӯи худро дар он ҷо пешниҳод кунед, дар бораи таҷрибаи худ сӯҳбат кунед ва аз конусҳои пуркардашуда шикоят кунед.

Манбаъ: will.com

Илова Эзоҳ