{"id":87372,"date":"2020-07-07T13:42:34","date_gmt":"2020-07-07T11:42:34","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye"},"modified":"2020-07-07T13:42:34","modified_gmt":"2020-07-07T11:42:34","slug":"walking-in-my-shoes-stop-a-oni-markirovannye","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","title":{"rendered":"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Din 2019, \u00een Rusia este \u00een vigoare o lege privind etichetarea obligatorie. Legea nu se aplic\u0103 tuturor categoriilor de produse, iar termenele de implementare a etichet\u0103rii obligatorii variaz\u0103 pentru diferitele grupuri de produse. Primele produse care intr\u0103 sub inciden\u021ba acestei reglement\u0103ri sunt tutunul, \u00eenc\u0103l\u021b\u0103mintea \u0219i medicamentele, iar ulterior vor fi ad\u0103ugate \u0219i alte produse, cum ar fi parfumurile, textilele \u0219i laptele. Aceast\u0103 inova\u021bie legislativ\u0103 a stimulat dezvoltarea de noi solu\u021bii IT care vor permite urm\u0103rirea \u00eentregii lan\u021buri de via\u021b\u0103 a produsului, de la produc\u021bie p\u00e2n\u0103 la achizi\u021bia final\u0103 de c\u0103tre consumator, pentru to\u021bi participan\u021bii la proces: at\u00e2t statul, c\u00e2t \u0219i toate organiza\u021biile care v\u00e2nd produse cu etichetare obligatorie.<\/p>\n<p>\u00cen cadrul H5, sistemul care va urm\u0103ri produsele etichetate \u0219i va schimba date cu statul \u0219i furnizorii se nume\u0219te \u201eMarcus\u201d. V\u0103 vom explica \u00een ordinea corect\u0103 cum \u0219i cine l-a dezvoltat, ce tehnologie folose\u0219te \u0219i de ce avem motive de m\u00e2ndrie.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/522382bab9b8d133f3657baea6175357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Adev\u0103rat HighLoad<\/h3>\n<p>\n\u201eMarcus\u201d rezolv\u0103 numeroase probleme, cea mai important\u0103 fiind interac\u021biunea de integrare \u00eentre sistemele informa\u021bionale H5 \u0219i sistemul informatic de stat pentru produsele etichetate (GIS MP) pentru a urm\u0103ri mi\u0219carea produselor etichetate. De asemenea, platforma stocheaz\u0103 toate codurile de etichetare primite \u0219i \u00eentreaga istorie a mi\u0219c\u0103rilor acestor coduri \u00eentre obiecte, ajut\u00e2nd la eliminarea confuziei \u00een ceea ce prive\u0219te produsele etichetate. De exemplu, \u00een cazul produselor din tutun, care fac parte din primele grupuri de produse etichetate, doar un camion de \u021big\u0103ri con\u021bine aproximativ 600.000 de pachete, fiecare av\u00e2nd un cod unic. Sarcina sistemului nostru este s\u0103 urm\u0103reasc\u0103 \u0219i s\u0103 verifice legalitatea mi\u0219c\u0103rilor fiec\u0103rui pachet \u00eentre magazine \u0219i depozite, \u0219i, \u00een cele din urm\u0103, s\u0103 verifice permisiunea de v\u00e2nzare a acestora c\u0103tre consumatorul final. \u00cen fiecare or\u0103, \u00eenregistr\u0103m aproximativ 125.000 de opera\u021biuni de cas\u0103, iar fiecare pachet trebuie s\u0103 fie \u00eenregistrat cum a ajuns \u00een magazin. Prin urmare, av\u00e2nd \u00een vedere toate mi\u0219c\u0103rile \u00eentre obiecte, ne a\u0219tept\u0103m la zeci de miliarde de \u00eenregistr\u0103ri pe an.<\/p>\n<h3>Echipa M<\/h3>\n<p>\nDe\u0219i \u201eMarkus\u201d este considerat un proiect \u00een cadrul H5, acesta este realizat printr-o abordare de tip produs. Echipa lucreaz\u0103 dup\u0103 metodologia Scrum. Proiectul a \u00eenceput \u00een vara anului trecut, dar primele rezultate au venit abia \u00een octombrie \u2014 a fost complet constituit\u0103 o echip\u0103 dedicat\u0103, a fost dezvoltat\u0103 arhitectura sistemului \u0219i achizi\u021bionate echipamentele. Acum echipa are 16 membri, dintre care \u0219ase se ocup\u0103 cu dezvoltarea backend \u0219i frontend, iar trei cu analiza sistemului. Alte \u0219ase persoane se ocup\u0103 de testarea manual\u0103, de stres \u0219i de automatizare, precum \u0219i de suportul produsului. \u00cen plus, avem un specialist SRE. <\/p>\n<p>Codul \u00een echipa noastr\u0103 este scris nu doar de dezvoltatori, practic to\u021bi colegii \u0219tiu s\u0103 programeze \u0219i scriu teste automate, scripturi de stres \u0219i scripturi de automatizare. Acord\u0103m o aten\u021bie deosebit\u0103 acestui aspect, deoarece chiar \u0219i suportul produsului necesit\u0103 un nivel \u00eenalt de automatizare. Colegilor care nu au programat anterior, \u00eencerc\u0103m \u00eentotdeauna s\u0103 le suger\u0103m \u0219i s\u0103 \u00eei ajut\u0103m, oferindu-le sarcini mici de lucru.<\/p>\n<p>\u00cen contextul pandemiei de coronavirus, am mutat \u00eentreaga echip\u0103 \u00een regim de munc\u0103 la distan\u021b\u0103, disponibilitatea tuturor instrumentelor pentru gestionarea dezvolt\u0103rii, fluxul de lucru construit \u00een Jira \u0219i GitLab au permis trecerea u\u0219oar\u0103 prin acest etap\u0103. Lunile petrecute \u00een regim de telemunc\u0103 au dovedit c\u0103 productivitatea echipei nu a fost afectat\u0103, pentru mul\u021bi confortul muncii s-a \u00eembun\u0103t\u0103\u021bit, singurul lucru care lipse\u0219te este interac\u021biunea fa\u021b\u0103 \u00een fa\u021b\u0103.<\/p>\n<h3>\u00cent\u00e2lnirea echipei \u00eenainte de telemunc\u0103<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/c1095316fd5e3dcc147b3dd968013152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00cent\u00e2lniri \u00een timpul telemuncii<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/0c705ebbe28afbecd439c0ce2fcf04cb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Tehnologiile utilizate \u00een solu\u021bie<\/h3>\n<p>\nRepository-ul standard \u0219i instrumentul CI\/CD pentru H5 este GitLab. \u00cel folosim pentru stocarea codului, testarea continu\u0103, desf\u0103\u0219urarea pe servere de testare \u0219i de produc\u021bie. De asemenea, practic\u0103m revizuirea codului, \u00een care cel pu\u021bin doi colegi trebuie s\u0103 aprobe modific\u0103rile aduse de dezvoltator \u00een cod. Analizatorii statici de cod SonarQube \u0219i JaCoCo ne ajut\u0103 s\u0103 men\u021binem codul curat \u0219i s\u0103 asigur\u0103m nivelul necesar de acoperire cu teste unitare. Toate modific\u0103rile din cod trebuie s\u0103 treac\u0103 neap\u0103rat prin aceste verific\u0103ri. Toate scenariile de testare care sunt rulate manual sunt ulterior automatizate.<\/p>\n<p>Pentru a \u00eendeplini cu succes procesele de afaceri ale \u201eMarkus\u201d, a trebuit s\u0103 rezolv\u0103m o serie de probleme tehnologice, pe fiecare pe r\u00e2nd. <\/p>\n<p><b>Sarcina 1. Necesitatea scalabilit\u0103\u021bii orizontale a sistemului<\/b><\/p>\n<p>Pentru a aborda aceast\u0103 problem\u0103, am ales o abordare arhitectural\u0103 bazat\u0103 pe microservicii. A fost foarte important s\u0103 \u00een\u021belegem domeniile de responsabilitate ale serviciilor. Am \u00eencercat s\u0103 le \u00eemp\u0103r\u021bim pe opera\u021biuni de afaceri, av\u00e2nd \u00een vedere specificitatea proceselor. De exemplu, recep\u021bia \u00een depozit este o opera\u021biune rar\u0103, dar foarte voluminoas\u0103, \u00een cadrul c\u0103reia trebuie s\u0103 ob\u021binem c\u00e2t mai repede informa\u021bii de la regimul de stat despre unit\u0103\u021bile de produs recep\u021bionate, al c\u0103ror num\u0103r \u00eentr-o livrare poate ajunge p\u00e2n\u0103 la 600000, s\u0103 verifice acceptabilitatea recep\u021biei acestor bunuri \u00een depozit \u0219i s\u0103 transmit\u0103 toate informa\u021biile necesare sistemului de automatizare a depozitului. \u00cen schimb, expedierea din depozite are o intensitate mult mai mare, dar opereaz\u0103 cu volume de date mai mici. <\/p>\n<p>Toate serviciile le implement\u0103m conform principiului stateless \u0219i chiar \u0219i opera\u021biunile interne \u00eencerc\u0103m s\u0103 le \u00eemp\u0103r\u021bim \u00een pa\u0219i, folosind, a\u0219a cum le numim noi, self-topic-uri Kafka. Acest lucru \u00eei permite microserviciului s\u0103 trimit\u0103 un mesaj lui \u00eensu\u0219i, ceea ce permite echilibrarea \u00eenc\u0103rc\u0103rii pe opera\u021biunile mai intensive din punct de vedere al resurselor \u0219i simplific\u0103 \u00eentre\u021binerea produsului, dar despre asta mai t\u00e2rziu. <\/p>\n<p>Am decis s\u0103 separ\u0103m modulele de interac\u021biune cu sistemele externe \u00een servicii distincte. Acest lucru a permis rezolvarea problemei API-urilor externe care se schimb\u0103 frecvent, practic f\u0103r\u0103 a afecta serviciile cu func\u021bionalitate de afaceri.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/da1dc58791fa28e89e289528e0fd2550.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nToate microserviciile sunt desf\u0103\u0219urate \u00een clusterul OpenShift, care rezolv\u0103 at\u00e2t problema scalabilit\u0103\u021bii fiec\u0103rui microserviciu, c\u00e2t \u0219i ne permite s\u0103 nu folosim instrumente externe de descoperire a serviciilor.<\/p>\n<p><b>Sarcina 2. Necesitatea de a men\u021bine o \u00eenc\u0103rcare ridicat\u0103 \u0219i un schimb de date foarte intens \u00eentre serviciile platformei:<\/b> doar \u00een faza de lansare a proiectului se realizeaz\u0103 aproximativ 600 de opera\u021biuni pe secund\u0103. Ne a\u0219tept\u0103m ca aceast\u0103 valoare s\u0103 creasc\u0103 p\u00e2n\u0103 la 5000 ops\/sec pe m\u0103sur\u0103 ce obiectivele comerciale se conecteaz\u0103 la platforma noastr\u0103.<\/p>\n<p>Aceast\u0103 problem\u0103 a fost rezolvat\u0103 prin desf\u0103\u0219urarea unui cluster Kafka \u0219i practic renun\u021barea complet\u0103 la interac\u021biunea sincron\u0103 \u00eentre microserviciile platformei. Acest lucru necesit\u0103 o analiz\u0103 foarte atent\u0103 a cerin\u021belor sistemului, deoarece nu toate opera\u021biunile pot fi asincrone. De asemenea, nu ne limit\u0103m la transmiterea evenimentelor prin broker, ci transmitem \u00een mesaj toate informa\u021biile de afaceri necesare. Astfel, dimensiunea mesajului poate ajunge la c\u00e2teva sute de kilobytes. Limitarea volumului mesajelor \u00een Kafka ne oblig\u0103 la o prognoz\u0103 precis\u0103 a dimensiunii mesajelor, iar, dac\u0103 este necesar, le \u00eemp\u0103r\u021bim, \u00eens\u0103 aceast\u0103 \u00eemp\u0103r\u021bire este logic\u0103 \u0219i legat\u0103 de opera\u021biunile de afaceri. <br \/>\nDe exemplu, un produs care sose\u0219te cu ma\u0219ina, \u00eel \u00eemp\u0103r\u021bim pe cutii. Pentru opera\u021biunile sincronizate sunt alocate microservicii separate \u0219i se efectueaz\u0103 teste de \u00eenc\u0103rcare riguroase. Utilizarea Kafka ne-a pus \u00een fa\u021ba unei alte provoc\u0103ri \u2014 verificarea func\u021bion\u0103rii serviciului nostru cu integrarea Kafka face ca toate testele unitare s\u0103 fie asincrone. Aceast\u0103 problem\u0103 a fost solu\u021bionat\u0103 prin scrierea unor metode utilitare proprii folosind Embedded Kafka Broker. Aceasta nu anuleaz\u0103 necesitatea de a scrie teste unitare pentru metodele separate, dar pentru cazurile complexe prefer\u0103m s\u0103 test\u0103m folosind Kafka.<\/p>\n<p>Am acordat mult\u0103 aten\u021bie tras\u0103rii jurnalelor, astfel \u00eenc\u00e2t TraceId-urile lor s\u0103 nu se piard\u0103 \u00een cazul apari\u021biei unor excep\u021bii \u00een timpul func\u021bion\u0103rii serviciilor sau \u00een timpul lucrului cu Kafka batch. \u0218i dac\u0103 la prima problem\u0103 nu au ap\u0103rut \u00eentreb\u0103ri speciale, \u00een al doilea caz am fost nevoi\u021bi s\u0103 \u00eenregistr\u0103m \u00een jurnal toate TraceId-urile cu care a sosit batch-ul \u0219i s\u0103 alegem unul pentru continuarea tras\u0103rii. Astfel, prin c\u0103utarea dup\u0103 TraceId-ul ini\u021bial, utilizatorul va descoperi cu u\u0219urin\u021b\u0103 cu ce a continuat trasarea.<\/p>\n<p><b>Sarcina 3. Necesitatea stoc\u0103rii unui volum mare de date: <\/b> peste 1 miliard de etichete pe an doar pentru tutun ajunge la X5. Acestea necesit\u0103 acces constant \u0219i rapid. Sistemul trebuie s\u0103 proceseze aproximativ 10 miliarde de \u00eenregistr\u0103ri privind istoricul mi\u0219c\u0103rilor de produse etichetate.<\/p>\n<p>Pentru a rezolva a treia sarcin\u0103, a fost aleas\u0103 baza de date NoSQL MongoDB. Am construit un shard din 5 noduri \u0219i \u00een fiecare nod exist\u0103 un Replica Set din 3 servere. Acest lucru permite scalarea orizontal\u0103 a sistemului, ad\u0103ug\u00e2nd <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/server\/\"   title=\"servere noi\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"781\">servere noi<\/a> \u00een cluster \u0219i a asigura rezilien\u021ba acesteia. Aici ne-am confruntat cu o alt\u0103 problem\u0103 \u2013 asigurarea tranzac\u021bionalit\u0103\u021bii \u00een clusterul Mongo \u021bin\u00e2nd cont de utilizarea microserviciilor scalabile orizontal. De exemplu, una dintre sarcinile sistemului nostru este de a detecta \u00eencerc\u0103rile de rev\u00e2nzare a produselor cu acela\u0219i cod de identificare. Aici apar suprapunerile cu scan\u0103ri gre\u0219ite sau cu opera\u021biuni eronate ale casierilor. Am descoperit c\u0103 astfel de dubluri pot ap\u0103rea at\u00e2t \u00een cadrul unui lot Kafka procesat, c\u00e2t \u0219i \u00een cadrul a dou\u0103 loturi procesate \u00een paralel. Prin urmare, verificarea existen\u021bei dublurilor prin interogarea bazei de date nu aducea rezultate. Pentru fiecare dintre microservicii am abordat problema separat, baz\u00e2ndu-ne pe logica de afaceri a acestui serviciu. De exemplu, pentru bonuri am ad\u0103ugat o verificare \u00een cadrul lotului \u0219i o procesare separat pentru a detecta dublurile la inser\u021bie. <\/p>\n<p>Pentru a ne asigura c\u0103 activitatea utilizatorilor cu istoricul opera\u021biunilor nu influen\u021beaz\u0103 esen\u021bialul \u2013 func\u021bionarea proceselor noastre de afaceri, toate datele istorice le-am separat \u00eentr-un serviciu distinct cu o baz\u0103 de date proprie, care prime\u0219te, de asemenea, informa\u021bii prin Kafka. Astfel, utilizatorii interac\u021bioneaz\u0103 cu un serviciu izolat, f\u0103r\u0103 a afecta serviciile care proceseaz\u0103 datele opera\u021biunilor curente.<\/p>\n<p><b>Sarcina 4. Reprocesarea cozii \u0219i monitorizarea:<\/b><\/p>\n<p>\u00cen sistemele distribuite, inevitabil apar probleme \u0219i erori de accesibilitate a bazelor de date, cozii, surselor externe de date. \u00cen cazul \u201eMarkus\u201d, sursa acestor erori este integrarea cu sistemele externe. A fost necesar s\u0103 g\u0103sim o solu\u021bie care s\u0103 permit\u0103 retrimiteri pentru r\u0103spunsurile eronate cu un anumit timeout definit, dar s\u0103 nu \u00eentrerup\u0103 procesarea cererilor reu\u0219ite \u00een coada principal\u0103. Pentru aceasta a fost aleas\u0103 a\u0219a-numita concept \u201cretry bazat pe topic\u201d. Pentru fiecare topic principal se creeaz\u0103 unul sau mai multe topicuri de retry, unde sunt trimise mesajele eronate \u0219i se elimin\u0103 \u00eent\u00e2rzierea \u00een procesarea mesajelor din topicul principal. Schema de interac\u021biune \u2014 <\/p>\n<p><img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/922b3107d183312312713c213488fbe1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPentru a implementa acest sistem, aveam nevoie de urm\u0103toarele \u2014 integrarea acestei solu\u021bii cu Spring \u0219i evitarea duplic\u0103rii codului. Pe internet am \u00eent\u00e2lnit o solu\u021bie similar\u0103, bazat\u0103 pe Spring BeanPostProcessor, dar ni s-a p\u0103rut prea greoaie. Echipa noastr\u0103 a realizat o solu\u021bie mai simpl\u0103, care permite integrarea \u00een ciclul de creare a consumer-ului din Spring \u0219i ad\u0103ugarea suplimentar\u0103 de Retry Consumer-i. Prototipul solu\u021biei noastre a fost propus echipei Spring, pe care \u00eel pute\u021bi viziona <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/issues\/1229\">aici<\/a><\/noindex>. Num\u0103rul de Retry Consumer-i \u0219i num\u0103rul de \u00eencerc\u0103ri ale fiec\u0103rui consumer este configurabil prin parametri, \u00een func\u021bie de nevoile procesului de afaceri, \u0219i, pentru ca totul s\u0103 func\u021bioneze, trebuie doar s\u0103 ad\u0103uga\u021bi binecunoscuta anotare org.springframework.kafka.annotation.KafkaListener, folosit\u0103 de to\u021bi dezvoltatorii Spring.<\/p>\n<p>\u00cen cazul \u00een care mesajul nu a putut fi procesat dup\u0103 toate \u00eencerc\u0103rile de retry, acesta ajunge \u00een DLT (dead letter topic) cu ajutorul Spring DeadLetterPublishingRecoverer. La cererea suportului, am extins aceast\u0103 func\u021bionalitate \u0219i am creat un serviciu separat care permite vizualizarea mesajelor ajunse \u00een DLT, stackTrace, traceId \u0219i alte informa\u021bii utile despre acestea. \u00cen plus, au fost ad\u0103ugate monitoriz\u0103ri \u0219i alerte pentru toate topicurile DLT, iar acum, \u00een esen\u021b\u0103, apari\u021bia unui mesaj \u00een topicul DLT reprezint\u0103 un motiv pentru investigare \u0219i deschiderea unui defect. Este foarte convenabil \u2014 prin numele topicului, \u00een\u021belegem imediat \u00een ce etap\u0103 a procesului a ap\u0103rut problema, ceea ce accelereaz\u0103 semnificativ c\u0103utarea cauzei fundamentale.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/ba1110bf1c93249c73dd76c490f1d7aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRecent am implementat o interfa\u021b\u0103 care permite revenirea asupra mesajelor de c\u0103tre echipa noastr\u0103 de suport, dup\u0103 remedierea cauzelor acestora (de exemplu, restaurarea func\u021bionalit\u0103\u021bii unui sistem extern) \u0219i, bine\u00een\u021beles, deschiderea unui defect corespunz\u0103tor pentru analiz\u0103. Aici ne-au fost utile topicurile noastre self, pentru a nu reporni o lung\u0103 lan\u021b de procesare, putem relua de la pasul necesar. <\/p>\n<p><img decoding=\"async\" alt=\"\u201eP\u0103\u0219ind \u00een pantofii mei\u201d \u2014 a\u0219teapt\u0103, sunt ele etichetate?\" src=\"\/wp-content\/uploads\/2020\/07\/78c7831131808732b74b27f055b60d54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Exploatarea platformei<\/h3>\n<p>\nPlatforma este deja \u00een exploatare productiv\u0103, livr\u0103m \u0219i \u00eenc\u0103rc\u0103m produse \u00een fiecare zi, conect\u0103m noi centre de distribu\u021bie \u0219i magazine. \u00cen cadrul pilotului, sistemul func\u021bioneaz\u0103 cu grupuri de produse \u201eTutun\u201d \u0219i \u201e\u00cenc\u0103l\u021b\u0103minte\u201d. <\/p>\n<p>\u00centreaga noastr\u0103 echip\u0103 particip\u0103 la desf\u0103\u0219urarea pilotului, analizeaz\u0103 problemele ap\u0103rute \u0219i face propuneri pentru \u00eembun\u0103t\u0103\u021birea produsului nostru, de la \u00eembun\u0103t\u0103\u021birea logurilor la modific\u0103ri \u00een procese. <\/p>\n<p>Pentru a nu repeta gre\u0219elile anterioare, toate cazurile \u00eent\u00e2lnite pe parcursul pilonului \u00ee\u0219i g\u0103sesc reflectarea \u00een testele automatizate. Prezen\u021ba unui num\u0103r mare de teste automate \u0219i teste unitare permite efectuarea test\u0103rii de regresie \u0219i aplicarea hotfix-urilor \u00een doar c\u00e2teva ore.<\/p>\n<p>Acum continu\u0103m s\u0103 dezvolt\u0103m \u0219i s\u0103 perfec\u021bion\u0103m platforma noastr\u0103 \u0219i ne confrunt\u0103m constant cu noi provoc\u0103ri. Dac\u0103 sunte\u021bi interesa\u021bi, v\u0103 vom \u00eemp\u0103rt\u0103\u0219i solu\u021biile noastre \u00een articolele urm\u0103toare.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/509714\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421 2019 \u0433\u043e\u0434\u0430 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043a\u043e\u043d \u043e\u0431 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u0417\u0430\u043a\u043e\u043d \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0441\u0440\u043e\u043a\u0438 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u043b\u0443 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0440\u0430\u0437\u043d\u044b\u0435. \u041f\u0435\u0440\u0432\u044b\u043c\u0438 \u043f\u043e\u0434 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0442\u0430\u0431\u0430\u043a, \u043e\u0431\u0443\u0432\u044c, \u043b\u0435\u043a\u0430\u0440\u0441\u0442\u0432\u0430, \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u044f\u0442\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0443\u0445\u0438, \u0442\u0435\u043a\u0441\u0442\u0438\u043b\u044c, \u043c\u043e\u043b\u043e\u043a\u043e. \u042d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u0443\u0434\u0438\u043b\u043e \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u043e\u0432\u044b\u0445 \u0418\u0422-\u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87373,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87372","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421 2019 \u0433\u043e\u0434\u0430 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043a\u043e\u043d \u043e\u0431 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u0417\u0430\u043a\u043e\u043d \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0441\u0440\u043e\u043a\u0438 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u043b\u0443 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0440\u0430\u0437\u043d\u044b\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u00abWalking in my shoes\u00bb \u2014 \u0441\u0442\u043e\u043f, \u0430 \u043e\u043d\u0438 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421 2019 \u0433\u043e\u0434\u0430 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043a\u043e\u043d \u043e\u0431 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u0417\u0430\u043a\u043e\u043d \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0441\u0440\u043e\u043a\u0438 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u043b\u0443 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0440\u0430\u0437\u043d\u044b\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-07T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-07T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u201eWalking in my shoes\u201d \u2014 stop, dar sunt ele marcate? | ProHoster","description":"Din 2019, \u00een Rusia este \u00een vigoare o lege privind marcarea obligatorie. Legea nu se aplic\u0103 tuturor grupelor de produse, iar termenii de intrare \u00een vigoare a marc\u0103rii obligatorii pentru grupele de produse sunt diferi\u021bi.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u00abWalking in my shoes\u00bb \u2014 \u0441\u0442\u043e\u043f, \u0430 \u043e\u043d\u0438 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435? | ProHoster","og:description":"\u0421 2019 \u0433\u043e\u0434\u0430 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043a\u043e\u043d \u043e\u0431 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0435. \u0417\u0430\u043a\u043e\u043d \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0441\u0440\u043e\u043a\u0438 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u043b\u0443 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0440\u0430\u0437\u043d\u044b\u0435.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-07T11:42:34+00:00","article:modified_time":"2020-07-07T11:42:34+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87372","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:52:22","updated":"2026-02-08 20:33:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/87372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=87372"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/87372\/revisions"}],"predecessor-version":[{"id":157972,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/87372\/revisions\/157972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/87373"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=87372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=87372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=87372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}