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.
ÄŖ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
TikÅ”anÄs attÄlinÄtÄ darba laikÄ
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.
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 -
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
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.
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.
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