ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

KopÅ” 2019. gada Krievijā ir spēkā likums par obligāto marÄ·Ä“Å”anu. Likums neattiecas uz visām preču grupām, un preču grupu obligātā marķējuma spēkā stāŔanās datumi ir atŔķirÄ«gi. Tabaka, apavi un medikamenti pirmie tiks pakļauti obligātajam marķējumam, vēlāk tiks pievienoti citi produkti, piemēram, smaržas, tekstilizstrādājumi, piens. Å is likumdoÅ”anas jauninājums ir mudinājis izstrādāt jaunus IT risinājumus, kas ļaus izsekot visai produkta dzÄ«ves ķēdei no ražoÅ”anas lÄ«dz gala patērētājam lÄ«dz iegādei, lÄ«dz visiem procesa dalÄ«bniekiem: gan valstij, gan visām organizācijām, kas pārdod preces. ar obligātu marķējumu.

X5 sistēmā, kas izsekos marķētās preces un apmainÄ«sies ar datiem ar valsti un piegādātājiem, sauc par ā€œMarcusā€. PastāstÄ«sim secÄ«bā, kā un kas to izstrādāja, kāda ir tā tehnoloÄ£iju kopa un kāpēc mums ir ar ko lepoties.

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

ÄŖsta HighLoad

ā€œMarcusā€ risina daudzas problēmas, no kurām galvenā ir integrācijas mijiedarbÄ«ba starp X5 informācijas sistēmām un valsts informācijas sistēmu marķētiem produktiem (GIS MP), lai izsekotu marķēto produktu kustÄ«bai. Platforma saglabā arÄ« visus mÅ«su saņemtos marÄ·Ä“Å”anas kodus un visu Å”o kodu pārvietoÅ”anās vēsturi objektos, kā arÄ« palÄ«dz novērst marķēto produktu atkārtotu klasifikāciju. Izmantojot tabakas izstrādājumu piemēru, kas tika iekļauti pirmajās marķēto preču grupās, tikai vienā kravas automaŔīnā cigareÅ”u ir aptuveni 600 000 paciņu, katrai no kurām ir savs unikālais kods. Un mÅ«su sistēmas uzdevums ir izsekot un pārbaudÄ«t katras Ŕādas pakas kustÄ«bas likumÄ«bu starp noliktavām un veikaliem un galu galā pārbaudÄ«t to pārdoÅ”anas pieņemamÄ«bu gala pircējam. Un mēs fiksējam aptuveni 125 000 skaidras naudas darÄ«jumu stundā, kā arÄ« jāfiksē, kā katra Ŕāda paka nokļuva veikalā. Tādējādi, ņemot vērā visas kustÄ«bas starp objektiem, mēs sagaidām desmitiem miljardu ierakstu gadā.

Komanda M

Neskatoties uz to, ka Marcus tiek uzskatÄ«ts par projektu X5 ietvaros, tas tiek Ä«stenots, izmantojot produkta pieeju. Komanda strādā saskaņā ar Scrum. Projekts sākās pagājuÅ”ajā vasarā, bet pirmie rezultāti bija tikai oktobrÄ« - mÅ«su paÅ”u komanda tika pilnÄ«bā nokomplektēta, izstrādāta sistēmas arhitektÅ«ra un iegādāts aprÄ«kojums. Tagad komandā ir 16 cilvēki, no kuriem seÅ”i ir iesaistÄ«ti backend un frontend izstrādē, no kuriem trÄ«s ir iesaistÄ«ti sistēmas analÄ«zē. Vēl seÅ”i cilvēki ir iesaistÄ«ti manuālajā, ielādes, automatizētajā testÄ“Å”anā un produktu apkopē. Turklāt mums ir SRE speciālists.

MÅ«su komandā kodu raksta ne tikai izstrādātāji; gandrÄ«z visi puiÅ”i zina, kā programmēt un rakstÄ«t automātiskos testus, ielādēt skriptus un automatizācijas skriptus. Mēs tam pievērÅ”am Ä«paÅ”u uzmanÄ«bu, jo pat produktu atbalstam ir nepiecieÅ”ams augsts automatizācijas lÄ«menis. Mēs vienmēr cenÅ”amies ieteikt un palÄ«dzēt kolēģiem, kuri iepriekÅ” nav programmējuÅ”i, un uzdodam viņiem dažus nelielus uzdevumus, pie kuriem strādāt.

KoronavÄ«rusa pandēmijas dēļ mēs visu komandu pārcēlām uz attālinātu darbu; visu izstrādes pārvaldÄ«bas rÄ«ku pieejamÄ«ba, Jira un GitLab iebÅ«vētā darbplÅ«sma ļāva viegli pārvarēt Å”o posmu. Attālināti pavadÄ«tie mēneÅ”i liecināja, ka komandas produktivitāte lÄ«dz ar to necieta, daudziem paaugstinājās komforts darbā, pietrÅ«ka tikai dzÄ«vās komunikācijas.

Attālā komandas sanāksme

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

TikŔanās attālinātā darba laikā

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

Risinājuma tehnoloģiju kaudze

X5 standarta repozitorijs un CI/CD rÄ«ks ir GitLab. Mēs to izmantojam koda glabāŔanai, nepārtrauktai testÄ“Å”anai un izvietoÅ”anai testÄ“Å”anas un ražoÅ”anas serveros. Mēs izmantojam arÄ« koda pārskatÄ«Å”anas praksi, kad vismaz 2 kolēģiem ir jāapstiprina izstrādātāja veiktās izmaiņas kodā. Statiskie kodu analizatori SonarQube un JaCoCo palÄ«dz mums uzturēt mÅ«su kodu tÄ«ru un nodroÅ”ināt nepiecieÅ”amo vienÄ«bu testa pārklājuma lÄ«meni. Visām koda izmaiņām ir jāveic Ŕīs pārbaudes. Visi testa skripti, kas tiek palaisti manuāli, pēc tam tiek automatizēti.

Lai ā€œMarcusā€ veiksmÄ«gi Ä«stenotu biznesa procesus, mums bija jāatrisina vairākas tehnoloÄ£iskas problēmas, apmēram katra secÄ«bā.

1. uzdevums. Sistēmas horizontālās mērogojamÄ«bas nepiecieÅ”amÄ«ba

Lai atrisinātu Å”o problēmu, mēs izvēlējāmies mikropakalpojumu pieeju arhitektÅ«rai. Vienlaikus ļoti svarÄ«gi bija izprast dienestu atbildÄ«bas jomas. Mēs centāmies tos sadalÄ«t biznesa operācijās, ņemot vērā procesu specifiku. Piemēram, pieņemÅ”ana noliktavā ir ne pārāk bieža, bet ļoti apjomÄ«ga darbÄ«ba, kuras laikā no valsts regulatora ātri jāiegÅ«st informācija par pieņemtajām preču vienÄ«bām, kuru skaits vienā piegādē sasniedz 600000 XNUMX , pārbaudiet Ŕīs preces pieņemÅ”anas noliktavā pieļaujamÄ«bu un atdodiet visu nepiecieÅ”amo informāciju noliktavas automatizācijas sistēmai. Bet sÅ«tÄ«jumiem no noliktavām ir daudz lielāka intensitāte, bet tajā paŔā laikā tas darbojas ar nelielu datu apjomu.

Mēs ievieÅ”am visus pakalpojumus uz bezvalstniecÄ«bas principa un pat cenÅ”amies sadalÄ«t iekŔējās darbÄ«bas posmos, izmantojot tā dēvētās Kafkas paÅ”tēmas. Tas ir tad, kad mikropakalpojums nosÅ«ta sev ziņojumu, kas ļauj lÄ«dzsvarot slodzi uz resursietilpÄ«gākām darbÄ«bām un vienkārÅ”o produkta apkopi, bet par to vēlāk.

Mēs nolēmām nodalÄ«t moduļus mijiedarbÄ«bai ar ārējām sistēmām atseviŔķos pakalpojumos. Tas ļāva atrisināt ārējo sistēmu bieži mainÄ«go API problēmu, praktiski neietekmējot pakalpojumus ar biznesa funkcionalitāti.

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

Visi mikropakalpojumi tiek izvietoti OpenShift klasterÄ«, kas atrisina gan katra mikropakalpojuma mērogoÅ”anas problēmu, gan ļauj neizmantot treŔās puses pakalpojumu noteikÅ”anas rÄ«kus.

2. uzdevums. NepiecieÅ”amÄ«ba uzturēt augstu slodzi un ļoti intensÄ«vu datu apmaiņu starp platformas pakalpojumiem: Projekta palaiÅ”anas posmā vien tiek veiktas aptuveni 600 operācijas sekundē. Mēs sagaidām, ka Ŕī vērtÄ«ba palielināsies lÄ«dz 5000 op./s, kad mazumtirdzniecÄ«bas vietas pievienosies mÅ«su platformai.

Å Ä« problēma tika atrisināta, izvietojot Kafka klasteru un gandrÄ«z pilnÄ«bā atsakoties no sinhronās mijiedarbÄ«bas starp platformas mikropakalpojumiem. Tas prasa ļoti rÅ«pÄ«gu sistēmas prasÄ«bu analÄ«zi, jo ne visas darbÄ«bas var bÅ«t asinhronas. Tajā paŔā laikā mēs ne tikai pārraidām notikumus ar brokera starpniecÄ«bu, bet arÄ« pārsÅ«tām visu nepiecieÅ”amo biznesa informāciju ziņojumā. Tādējādi ziņojuma lielums var sasniegt vairākus simtus kilobaitu. Ziņojuma lieluma ierobežojums Kafkā liek mums precÄ«zi paredzēt ziņojumu lielumu, un, ja nepiecieÅ”ams, mēs tos sadalām, taču sadalÄ«jums ir loÄ£isks, saistÄ«ts ar biznesa operācijām.
Piemēram, preces, kas pienāk automaŔīnā, sadalām kastēs. Sinhronām darbÄ«bām tiek pieŔķirti atseviŔķi mikropakalpojumi un tiek veikta rÅ«pÄ«ga slodzes pārbaude. Kafka izmantoÅ”ana mums radÄ«ja vēl vienu izaicinājumu - mÅ«su pakalpojuma darbÄ«bas pārbaude, ņemot vērā Kafka integrāciju, padara visas mÅ«su vienÄ«bu pārbaudes asinhronas. Mēs atrisinājām Å”o problēmu, rakstot savas utilÄ«ta metodes, izmantojot Embedded Kafka Broker. Tas nenovērÅ” nepiecieÅ”amÄ«bu rakstÄ«t atseviŔķu metožu vienÄ«bas testus, taču mēs dodam priekÅ”roku sarežģītu gadÄ«jumu testÄ“Å”anai, izmantojot Kafku.

Liela uzmanÄ«ba tika pievērsta žurnālu izsekoÅ”anas veikÅ”anai, lai to TraceId nepazustu, kad pakalpojumu darbÄ«bas laikā vai strādājot ar Kafka partiju rodas izņēmumi. Un, ja ar pirmo nebija Ä«paÅ”u problēmu, tad otrajā gadÄ«jumā mēs esam spiesti reÄ£istrēt visus traceIds, ar kuriem tika piegādāta partija, un atlasÄ«t vienu, lai turpinātu izsekoÅ”anu. Pēc tam, veicot meklÄ“Å”anu pēc sākotnējā TraceId, lietotājs viegli uzzinās, ar kuru izsekoÅ”anu turpinājās.

3. uzdevums. NepiecieÅ”amÄ«ba uzglabāt lielu datu apjomu: Vairāk nekā 1 miljards tabakas etiÄ·eÅ”u gadā vien nonāk X5. Viņiem nepiecieÅ”ama pastāvÄ«ga un ātra piekļuve. Kopumā sistēmai ir jāapstrādā aptuveni 10 miljardi ierakstu par Å”o marķēto preču kustÄ«bas vēsturi.

TreŔās problēmas risināŔanai tika izvēlēta NoSQL datubāze MongoDB. Mēs esam izveidojuÅ”i 5 mezglu fragmentu, un katram mezglam ir 3 serveru kopiju komplekts. Tas ļauj mērogot sistēmu horizontāli, pievienojot klasterim jaunus serverus un nodroÅ”ināt tā kļūdu toleranci. Å eit mēs saskārāmies ar citu problēmu - transakciju nodroÅ”ināŔana mongo klasterÄ«, ņemot vērā horizontāli mērogojamu mikropakalpojumu izmantoÅ”anu. Piemēram, viens no mÅ«su sistēmas uzdevumiem ir identificēt mēģinājumus tālāk pārdot produktus ar vienādiem marķējuma kodiem. Å eit tiek parādÄ«ti pārklājumi ar kļūdainiem skenÄ“Å”anas gadÄ«jumiem vai kļūdainām kasieru darbÄ«bām. Mēs atklājām, ka Ŕādi dublikāti var rasties gan vienā Kafka partijā, kas tiek apstrādāta, gan divās paralēli apstrādātajās partijās. Tādējādi dublikātu pārbaude, vaicājot datu bāzē, neko nedeva. Katram mikropakalpojumam problēmu atrisinājām atseviŔķi, pamatojoties uz Ŕī pakalpojuma biznesa loÄ£iku. Piemēram, pārbaudēm mēs pievienojām čeku partijas iekÅ”pusē un atseviŔķu apstrādi, lai ievietoÅ”anas laikā tiktu parādÄ«ti dublikāti.

Lai lietotāju darbs ar darbÄ«bas vēsturi nekādā veidā neietekmētu paÅ”u svarÄ«gāko ā€“ mÅ«su biznesa procesu funkcionÄ“Å”anu, visus vēsturiskos datus esam izdalÄ«juÅ”i atseviŔķā servisā ar atseviŔķu datu bāzi, kas arÄ« saņem informāciju caur Kafka . Tādā veidā lietotāji strādā ar izolētu pakalpojumu, neietekmējot pakalpojumus, kas apstrādā datus par notiekoÅ”ajām darbÄ«bām.

4. uzdevums: rindas atkārtota apstrāde un uzraudzība:

SadalÄ«tās sistēmās problēmas un kļūdas neizbēgami rodas datu bāzu, rindu un ārējo datu avotu pieejamÄ«bas ziņā. Markusa gadÄ«jumā Ŕādu kļūdu avots ir integrācija ar ārējām sistēmām. Bija jāatrod risinājums, kas ļautu atkārtoti pieprasÄ«t kļūdainas atbildes ar kādu noteiktu taimautu, bet tajā paŔā laikā nepārstātu sekmÄ«go pieprasÄ«jumu apstrādi galvenajā rindā. Å im nolÅ«kam tika izvēlēta tā sauktā ā€œtēmā balstÄ«ta atkārtota mēģinājumaā€ koncepcija. Katrai galvenajai tēmai tiek izveidota viena vai vairākas atkārtotas tēmas, uz kurām tiek nosÅ«tÄ«ti kļūdaini ziņojumi un vienlaikus tiek novērsta galvenās tēmas ziņojumu apstrādes aizkave. MijiedarbÄ«bas shēma -

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

Lai ieviestu Ŕādu shēmu, mums bija nepiecieÅ”ams: integrēt Å”o risinājumu ar Spring un izvairÄ«ties no koda dublÄ“Å”anās. Sērfojot tÄ«meklÄ«, sastapāmies ar lÄ«dzÄ«gu risinājumu, kura pamatā ir Spring BeanPostProccessor, taču tas mums Ŕķita nevajadzÄ«gi apgrÅ«tinoÅ”s. MÅ«su komanda ir izveidojusi vienkārŔāku risinājumu, kas ļauj integrēties patērētāju veidoÅ”anas pavasara ciklā un papildus pievienot Retry Consumers. Pavasara komandai piedāvājām sava risinājuma prototipu, to varat redzēt Å”eit. Retry Consumers skaits un mēģinājumu skaits katram patērētājam tiek konfigurēts caur parametriem atkarÄ«bā no biznesa procesa vajadzÄ«bām, un, lai viss darbotos, atliek tikai pievienot anotāciju org.springframework.kafka.annotation.KafkaListener , kas ir pazÄ«stama visiem pavasara izstrādātājiem.

Ja ziņojumu nevarēja apstrādāt pēc visiem atkārtotā mēģinājuma mēģinājumiem, tas tiek pārsÅ«tÄ«ts uz DLT (miruÅ”o burtu tēmu), izmantojot Spring DeadLetterPublishingRecoverer. Pēc atbalsta pieprasÄ«juma mēs paplaÅ”inājām Å”o funkcionalitāti un izveidojām atseviŔķu pakalpojumu, kas ļauj skatÄ«t DLT, stackTrace, traceId iekļautos ziņojumus un citu noderÄ«gu informāciju par tiem. Turklāt uzraudzÄ«ba un brÄ«dinājumi tika pievienoti visām DLT tēmām, un tagad faktiski ziņojuma parādÄ«Å”anās DLT tēmā ir iemesls analizēt un novērst defektu. Tas ir ļoti ērti - pēc tēmas nosaukuma mēs uzreiz saprotam, kurā procesa posmā radās problēma, kas ievērojami paātrina tās pamatcēloņa meklÄ“Å”anu.

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

Pavisam nesen esam ieviesuÅ”i saskarni, kas ļauj atkārtoti nosÅ«tÄ«t ziņojumus, izmantojot mÅ«su atbalstu, pēc to cēloņu novērÅ”anas (piemēram, ārējās sistēmas funkcionalitātes atjaunoÅ”anas) un, protams, attiecÄ«gā defekta konstatÄ“Å”anas analÄ«zei. Å eit noder mÅ«su paÅ”tēmas: lai neatsāktu garu apstrādes ķēdi, varat to restartēt no vēlamā soļa.

ā€œPastaiga manās kurpēsā€ - pagaidiet, vai tie ir atzÄ«mēti?

Platformas darbība

Platforma jau ir produktÄ«vā darbÄ«bā, katru dienu veicam piegādes un sÅ«tÄ«jumus, savienojam jaunus izplatÄ«Å”anas centrus un veikalus. Izmēģinājuma ietvaros sistēma darbojas ar produktu grupām ā€œTabakaā€ un ā€œApaviā€.

Visa mÅ«su komanda piedalās izmēģinājumu veikÅ”anā, analizē raduŔās problēmas un sniedz ieteikumus mÅ«su produkta uzlaboÅ”anai, sākot no žurnālu uzlaboÅ”anas lÄ«dz procesu maiņai.

Lai mÅ«su kļūdas neatkārtotos, visi pilota laikā konstatētie gadÄ«jumi tiek atspoguļoti automatizētajos testos. Liela skaita automātisko testu un vienÄ«bu testu klātbÅ«tne ļauj veikt regresijas testÄ“Å”anu un instalēt labojumfailu burtiski dažu stundu laikā.

Tagad mēs turpinām attīstīt un uzlabot savu platformu un pastāvīgi saskaramies ar jauniem izaicinājumiem. Ja jūs interesē, mēs pastāstīsim par mūsu risinājumiem turpmākajos rakstos.

Avots: www.habr.com

Pievieno komentāru