{"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\/pl\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","title":{"rendered":"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Od 2019 roku w Rosji obowi\u0105zuje ustawa o obowi\u0105zkowym oznakowaniu. Ustawa nie dotyczy wszystkich grup towar\u00f3w, a terminy wej\u015bcia w \u017cycie obowi\u0105zkowego oznakowania r\u00f3\u017cni\u0105 si\u0119 w zale\u017cno\u015bci od grupy towarowej. Pierwszymi towarami obj\u0119tymi obowi\u0105zkowym oznakowaniem s\u0105 tyto\u0144, obuwie, leki, a w p\u00f3\u017aniejszym czasie do\u0142\u0105cz\u0105 inne produkty, takie jak perfumy, tekstylia, mleko. To ustawodawcze nowatorstwo spowodowa\u0142o opracowanie nowych rozwi\u0105za\u0144 IT, kt\u00f3re umo\u017cliwi\u0105 \u015bledzenie ca\u0142ego cyklu \u017cycia towaru od momentu produkcji do zakupu przez ko\u0144cowego konsumenta, dla wszystkich uczestnik\u00f3w procesu: zar\u00f3wno dla pa\u0144stwa, jak i dla wszystkich organizacji sprzedaj\u0105cych towary z obowi\u0105zkowym oznakowaniem.<\/p>\n<p>W X5 system, kt\u00f3ry b\u0119dzie \u015bledzi\u0142 towary z oznakowaniem i wymienia\u0142 dane z pa\u0144stwem i dostawcami, otrzyma\u0142 nazw\u0119 \u201eMarkus\u201d. Opowiemy po kolei, jak i kto go opracowywa\u0142, jaki ma stos technologiczny i dlaczego mamy powody do dumy.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" 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>Prawdziwy HighLoad<\/h3>\n<p>\n\u201eMarkus\u201d rozwi\u0105zuje wiele problem\u00f3w, a najwa\u017cniejszym z nich jest integracyjne po\u0142\u0105czenie mi\u0119dzy systemami informacyjnymi X5 a pa\u0144stwowym systemem informacyjnym oznakowanych produkt\u00f3w (GIS MP) w celu \u015bledzenia ruchu oznakowanych produkt\u00f3w. Platforma przechowuje wszystkie kody oznakowania, kt\u00f3re do nas wp\u0142yn\u0119\u0142y, oraz ca\u0142\u0105 histori\u0119 ruchu tych kod\u00f3w mi\u0119dzy obiektami, pomaga wyeliminowa\u0107 pomy\u0142ki w oznakowaniu produkt\u00f3w. Na przyk\u0142adzie produkt\u00f3w tytoniowych, kt\u00f3re wesz\u0142y w pierwsze grupy oznakowanych towar\u00f3w, tylko jedna ci\u0119\u017car\u00f3wka papieros\u00f3w zawiera oko\u0142o 600 000 paczek, z kt\u00f3rych ka\u017cda ma unikalny kod. Naszym zadaniem jest \u015bledzenie i weryfikacja legalno\u015bci ruch\u00f3w ka\u017cdej takiej paczki mi\u0119dzy magazynami a sklepami, a na ko\u0144cu sprawdzenie mo\u017cliwo\u015bci ich sprzeda\u017cy ko\u0144cowemu klientowi. Rejestrujemy oko\u0142o 125 000 transakcji kasowych na godzin\u0119, i musimy jeszcze zarejestrowa\u0107, jak ka\u017cda taka paczka trafi\u0142a do sklepu. W zwi\u0105zku z tym, bior\u0105c pod uwag\u0119 wszystkie ruchy mi\u0119dzy obiektami, spodziewamy si\u0119 dziesi\u0105tek miliard\u00f3w zapis\u00f3w rocznie.<\/p>\n<h3>Zesp\u00f3\u0142 M<\/h3>\n<p>\nMimo \u017ce projekt \"Markus\" w ramach X5 jest realizowany w oparciu o podej\u015bcie produktowe, zesp\u00f3\u0142 pracuje w metodologii Scrum. Projekt rozpocz\u0105\u0142 si\u0119 latem ubieg\u0142ego roku, ale pierwsze rezultaty przysz\u0142y dopiero w pa\u017adzierniku \u2014 zesp\u00f3\u0142 zosta\u0142 w pe\u0142ni skompletowany, opracowano architektur\u0119 systemu i zakupiono sprz\u0119t. Obecnie w zespole jest 16 os\u00f3b, z czego sze\u015b\u0107 zajmuje si\u0119 rozwojem backendu i frontendu, a trzy analizy systemowej. R\u0119cznym, obci\u0105\u017ceniowym, automatycznym testowaniem oraz wsparciem produktu zajmuje si\u0119 jeszcze sze\u015b\u0107 os\u00f3b. Ponadto mamy specjalist\u0119 SRE. <\/p>\n<p>Kod w naszym zespole pisz\u0105 nie tylko programi\u015bci, prawie wszyscy potrafi\u0105 programowa\u0107 i pisz\u0105 testy automatyczne, skrypty obci\u0105\u017ceniowe oraz skrypty automatyzacji. Po\u015bwi\u0119camy temu szczeg\u00f3ln\u0105 uwag\u0119, poniewa\u017c nawet wsparcie produktu wymaga wysokiego poziomu automatyzacji. Koledzy, kt\u00f3rzy wcze\u015bniej nie programowali, zawsze staramy si\u0119 wspiera\u0107 i pomaga\u0107, zleca\u0107 im jakie\u015b drobne zadania.<\/p>\n<p>W zwi\u0105zku z pandemi\u0105 koronawirusa przenie\u015bli\u015bmy ca\u0142y zesp\u00f3\u0142 na prac\u0119 zdaln\u0105; posiadanie wszystkich narz\u0119dzi do zarz\u0105dzania rozwojem oraz zbudowany workflow w Jira i GitLab pozwoli\u0142y na \u0142atwe przej\u015bcie przez ten etap. Miesi\u0105ce sp\u0119dzone na pracy zdalnej pokaza\u0142y, \u017ce wydajno\u015b\u0107 zespo\u0142u na tym nie ucierpia\u0142a, dla wielu komfort pracy si\u0119 zwi\u0119kszy\u0142, jedynie brakuje bezpo\u015brednich kontakt\u00f3w.<\/p>\n<h3>Spotkanie zespo\u0142u przed prac\u0105 zdaln\u0105<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/c1095316fd5e3dcc147b3dd968013152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Spotkania podczas pracy zdalnej<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/0c705ebbe28afbecd439c0ce2fcf04cb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Stos technologiczny rozwi\u0105zania<\/h3>\n<p>\nStandardowym repozytorium i narz\u0119dziem CI\/CD dla X5 jest GitLab. U\u017cywamy go do przechowywania kodu, ci\u0105g\u0142ego testowania oraz wdra\u017cania na serwery testowe i produkcyjne. Stosujemy r\u00f3wnie\u017c praktyk\u0119 code review, w kt\u00f3rej co najmniej dw\u00f3ch koleg\u00f3w musi zatwierdzi\u0107 zmiany wprowadzone przez programist\u0119 w kodzie. Statyczne analizatory kodu SonarQube i JaCoCo pomagaj\u0105 nam utrzyma\u0107 kod w czysto\u015bci i zapewni\u0107 wymagany poziom pokrycia testami jednostkowymi. Wszystkie zmiany w kodzie musz\u0105 przej\u015b\u0107 przez te kontrole. Wszystkie scenariusze testowe, kt\u00f3re s\u0105 wykonywane r\u0119cznie, p\u00f3\u017aniej s\u0105 automatyzowane.<\/p>\n<p>Aby pomy\u015blnie realizowa\u0107 procesy biznesowe \"Markusa\", musieli\u015bmy rozwi\u0105za\u0107 szereg zada\u0144 technologicznych, o ka\u017cdej po kolei. <\/p>\n<p><b>Zadanie 1. Konieczno\u015b\u0107 poziomej skalowalno\u015bci systemu<\/b><\/p>\n<p>Aby rozwi\u0105za\u0107 ten problem, wybrali\u015bmy podej\u015bcie mikroserwisowe do architektury. Wa\u017cne by\u0142o zrozumienie obszar\u00f3w odpowiedzialno\u015bci serwis\u00f3w. Starali\u015bmy si\u0119 podzieli\u0107 je zgodnie z operacjami biznesowymi, bior\u0105c pod uwag\u0119 specyfik\u0119 proces\u00f3w. Na przyk\u0142ad, przyj\u0119cie do magazynu to operacja, kt\u00f3ra nie zdarza si\u0119 cz\u0119sto, ale ma du\u017c\u0105 obj\u0119to\u015b\u0107; w jej trakcie nale\u017cy jak najszybciej uzyska\u0107 od regulatora pa\u0144stwowego informacje o przyjmowanych jednostkach towaru, kt\u00f3rych w jednej dostawie mo\u017ce by\u0107 nawet 600000, sprawdzi\u0107 dopuszczalno\u015b\u0107 przyj\u0119cia tego towaru do magazynu i przekaza\u0107 wszystkie niezb\u0119dne informacje do systemu automatyzacji magazynu. Z kolei wysy\u0142ka z magazynu ma znacznie wi\u0119ksz\u0105 intensywno\u015b\u0107, ale operuje niewielkimi ilo\u015bciami danych. <\/p>\n<p>Wszystkie serwisy realizujemy na zasadzie stateless, a nawet wewn\u0119trzne operacje staramy si\u0119 dzieli\u0107 na kroki, wykorzystuj\u0105c tzw. self-tematy Kafka. Oznacza to, \u017ce mikroserwis wysy\u0142a wiadomo\u015b\u0107 sam do siebie, co pozwala zbalansowa\u0107 obci\u0105\u017cenie w bardziej zasobo\u017cernych operacjach i u\u0142atwia utrzymanie produktu; ale o tym p\u00f3\u017aniej. <\/p>\n<p>Postanowili\u015bmy wyr\u00f3\u017cni\u0107 w osobne serwisy modu\u0142y interakcji zewn\u0119trznych system\u00f3w. To pozwoli\u0142o rozwi\u0105za\u0107 problem cz\u0119sto zmieniaj\u0105cych si\u0119 interfejs\u00f3w API zewn\u0119trznych system\u00f3w, praktycznie bez wp\u0142ywu na serwisy z funkcjami biznesowymi.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/da1dc58791fa28e89e289528e0fd2550.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWszystkie mikroserwisy s\u0105 uruchamiane w klastrze OpenShift, kt\u00f3ry rozwi\u0105zuje zar\u00f3wno problem skalowalno\u015bci ka\u017cdego mikroserwisu, jak i pozwala nam nie u\u017cywa\u0107 zewn\u0119trznych narz\u0119dzi do odkrywania us\u0142ug.<\/p>\n<p><b>Zadanie 2. Konieczno\u015b\u0107 utrzymania wysokiego obci\u0105\u017cenia oraz bardzo intensywnej wymiany danych mi\u0119dzy serwisami platformy:<\/b> tylko na etapie uruchamiania projektu realizowanych jest oko\u0142o 600 operacji na sekund\u0119. Oczekujemy wzrostu tej warto\u015bci do 5000 op\/s w miar\u0119 pod\u0142\u0105czania obiekt\u00f3w handlowych do naszej platformy.<\/p>\n<p>Zadanie to rozwi\u0105zano poprzez wdro\u017cenie klastra Kafka i praktycznie pe\u0142ne zrezygnowanie z synchronicznej interakcji mi\u0119dzy mikroserwisami platformy. Wymaga to bardzo starannej analizy wymaga\u0144 systemowych, poniewa\u017c nie wszystkie operacje mog\u0105 by\u0107 asynchroniczne. Przy tym nie tylko przesy\u0142amy zdarzenia przez brokera, ale r\u00f3wnie\u017c przekazujemy w wiadomo\u015bci wszystkie wymagane informacje biznesowe. W ten spos\u00f3b rozmiar wiadomo\u015bci mo\u017ce wynosi\u0107 nawet kilka setek kilobajt\u00f3w. Ograniczenie dotycz\u0105ce wielko\u015bci wiadomo\u015bci w Kafka wymaga od nas dok\u0142adnego prognozowania ich rozmiaru, a w razie potrzeby dzielimy je, jednak podzia\u0142 ten jest logiczny i zwi\u0105zany z operacjami biznesowymi. <br \/>\nNa przyk\u0142ad towar przyje\u017cd\u017caj\u0105cy w samochodzie dzielimy na kartony. Dla operacji synchronicznych wydzielane s\u0105 osobne mikroserwisy, a przeprowadzane s\u0105 szczeg\u00f3\u0142owe testy obci\u0105\u017ceniowe. Wykorzystanie Kafka postawi\u0142o przed nami inne wyzwanie \u2014 testowanie dzia\u0142ania naszego serwisu z uwzgl\u0119dnieniem integracji Kafka czyni wszystkie nasze testy jednostkowe asynchronicznymi. W tym celu stworzyli\u015bmy w\u0142asne narz\u0119dzia przy u\u017cyciu Embedded Kafka Broker. Nie znosi to jednak konieczno\u015bci pisania test\u00f3w jednostkowych dla poszczeg\u00f3lnych metod, ale skomplikowane przypadki wolimy testowa\u0107 przy u\u017cyciu Kafka.<\/p>\n<p>Zwr\u00f3cili\u015bmy szczeg\u00f3lnie du\u017co uwagi na \u015bledzenie log\u00f3w, aby ich TraceId nie zostawa\u0142y utracone podczas wyst\u0119powania wyj\u0105tk\u00f3w w trakcie pracy serwis\u00f3w lub podczas pracy z batchami Kafka. I je\u015bli w przypadku pierwszego nie by\u0142o wi\u0119kszych problem\u00f3w, to w drugim przypadku musimy zapisa\u0107 w logu wszystkie TraceId, kt\u00f3re dotar\u0142y z batch, i wybra\u0107 jedno, aby kontynuowa\u0107 \u015bledzenie. Wtedy przy wyszukiwaniu po pocz\u0105tkowym TraceId u\u017cytkownik \u0142atwo znajdzie, z kt\u00f3rym kontynuowano \u015bledzenie.<\/p>\n<p><b>Zadanie 3. Konieczno\u015b\u0107 przechowywania du\u017cej ilo\u015bci danych: <\/b> ponad 1 miliard oznacze\u0144 rocznie, tylko dla tytoniu, trafia do X5. Wymaga to sta\u0142ego i szybkiego dost\u0119pu. Ca\u0142y system powinien przetwarza\u0107 oko\u0142o 10 miliard\u00f3w wpis\u00f3w dotycz\u0105cych historii ruchu danych towar\u00f3w oznakowanych.<\/p>\n<p>Dla rozwi\u0105zania trzeciego zadania wybrano baz\u0119 NoSQL MongoDB. Zbudowali\u015bmy shard z 5 w\u0119z\u0142\u00f3w, a w ka\u017cdym w\u0119\u017ale znajduje si\u0119 Replica Set z 3 serwerami. Pozwala to na poziome skalowanie systemu, dodaj\u0105c <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/\"   title=\"nowe serwery\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"781\">nowe serwery<\/a> do klastra i zapewni\u0107 jego odporno\u015b\u0107 na awarie. Tutaj napotkali\u015bmy inny problem \u2014 zapewnienie transakcyjno\u015bci w klastrze Mongo z uwzgl\u0119dnieniem u\u017cycia poziomo skalowalnych mikroserwis\u00f3w. Na przyk\u0142ad, jedno z zada\u0144 naszego systemu \u2014 wykrywanie pr\u00f3b ponownej sprzeda\u017cy towar\u00f3w o tych samych kodach oznakowania. Pojawiaj\u0105 si\u0119 tutaj problemy z b\u0142\u0119dnymi skanowaniami lub b\u0142\u0119dnymi operacjami kasjer\u00f3w. Odkryli\u015bmy, \u017ce takie duplikaty mog\u0105 wyst\u0119powa\u0107 zar\u00f3wno w obr\u0119bie jednego przetwarzanego batcha Kafka, jak i w\u015br\u00f3d dw\u00f3ch r\u00f3wnolegle przetwarzanych batchy. W ten spos\u00f3b weryfikacja pod k\u0105tem pojawienia si\u0119 duplikat\u00f3w za pomoc\u0105 zapytania do bazy nic nie dawa\u0142a. Dla ka\u017cdego z mikroserwis\u00f3w rozwi\u0105zali\u015bmy problem osobno, opieraj\u0105c si\u0119 na logice biznesowej danego serwisu. Na przyk\u0142ad, dla paragon\u00f3w dodali\u015bmy weryfikacj\u0119 wewn\u0105trz batcha i oddzieln\u0105 obr\u00f3bk\u0119 pod k\u0105tem pojawienia si\u0119 duplikat\u00f3w przy wstawianiu. <\/p>\n<p>Aby dzia\u0142anie u\u017cytkownik\u00f3w z histori\u0105 operacji w \u017caden spos\u00f3b nie wp\u0142ywa\u0142o na najwa\u017cniejsze \u2014 funkcjonowanie naszych proces\u00f3w biznesowych, wszystkie dane historyczne wydzielili\u015bmy do oddzielnego serwisu z oddzieln\u0105 baz\u0105 danych, kt\u00f3ry r\u00f3wnie\u017c otrzymuje informacje poprzez Kafka. W ten spos\u00f3b u\u017cytkownicy pracuj\u0105 z izolowanym serwisem, nie wp\u0142ywaj\u0105c na serwisy przetwarzaj\u0105ce dane dotycz\u0105ce bie\u017c\u0105cych operacji.<\/p>\n<p><b>Zadanie 4. Ponowna obr\u00f3bka kolejek i monitorowanie:<\/b><\/p>\n<p>W systemach rozproszonych nieuchronnie pojawiaj\u0105 si\u0119 problemy i b\u0142\u0119dy dost\u0119pno\u015bci baz danych, kolejek, zewn\u0119trznych \u017ar\u00f3de\u0142 danych. W przypadku \u201eMarkusa\u201d \u017ar\u00f3d\u0142em takich b\u0142\u0119d\u00f3w jest integracja z zewn\u0119trznymi systemami. Konieczne by\u0142o znalezienie rozwi\u0105zania, kt\u00f3re umo\u017cliwi\u0142oby ponowne wysy\u0142anie zapyta\u0144 w przypadku b\u0142\u0119dnych odpowiedzi z zadanym timeoutem, ale jednocze\u015bnie nie przerywa\u0142o przetwarzania udanych zapyta\u0144 w g\u0142\u00f3wnej kolejce. W tym celu wybrano tzw. koncepcj\u0119 \u201eretry oparte na tematach\u201d. Dla ka\u017cdego g\u0142\u00f3wnego tematu tworzony jest jeden lub wi\u0119cej temat\u00f3w retry, do kt\u00f3rych kierowane s\u0105 b\u0142\u0119dne wiadomo\u015bci, przy czym wyklucza si\u0119 op\u00f3\u017anienia w przetwarzaniu wiadomo\u015bci z g\u0142\u00f3wnego tematu. Schemat interakcji \u2014 <\/p>\n<p><img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/922b3107d183312312713c213488fbe1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAby zrealizowa\u0107 ten schemat, potrzebowali\u015bmy zintegrowa\u0107 to rozwi\u0105zanie ze Spring i unikn\u0105\u0107 duplikacji kodu. W sieci natkn\u0119li\u015bmy si\u0119 na podobne rozwi\u0105zanie oparte na Spring BeanPostProcessor, ale wyda\u0142o nam si\u0119 zbyt skomplikowane. Nasz zesp\u00f3\u0142 opracowa\u0142 prostsze rozwi\u0105zanie, kt\u00f3re pozwala na wbudowanie si\u0119 w cykl Spring tworzenia konsument\u00f3w i dodatkowe dodawanie konsument\u00f3w ponownej pr\u00f3by. Prototyp naszego rozwi\u0105zania zaproponowali\u015bmy zespo\u0142owi Spring, mo\u017cna go zobaczy\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/issues\/1229\">tutaj<\/a><\/noindex>. Liczba konsument\u00f3w ponownej pr\u00f3by i liczba pr\u00f3b ka\u017cdego konsumenta s\u0105 konfigurowane za pomoc\u0105 parametr\u00f3w, w zale\u017cno\u015bci od potrzeb proces\u00f3w biznesowych, a aby wszystko dzia\u0142a\u0142o, wystarczy doda\u0107 znan\u0105 wszystkim programistom Spring adnotacj\u0119 org.springframework.kafka.annotation.KafkaListener.<\/p>\n<p>W przypadku gdy wiadomo\u015b\u0107 nie mog\u0142a by\u0107 przetworzona po wszystkich pr\u00f3bach ponownych, trafia do DLT (dead letter topic) za pomoc\u0105 Spring DeadLetterPublishingRecoverer. Na pro\u015bb\u0119 wsparcia rozszerzyli\u015bmy t\u0119 funkcjonalno\u015b\u0107 i stworzyli\u015bmy osobn\u0105 us\u0142ug\u0119, kt\u00f3ra umo\u017cliwia przegl\u0105danie wiadomo\u015bci, kt\u00f3re trafi\u0142y do DLT, stackTrace, traceId i innych przydatnych informacji o nich. Dodatkowo dodano monitorowanie i alerty dla wszystkich topik\u00f3w DLT, a obecnie pojawienie si\u0119 wiadomo\u015bci w topiku DLT jest powodem do przeanalizowania sytuacji i zg\u0142oszenia defektu. To bardzo wygodne \u2014 na podstawie nazwy topika od razu rozumiemy, na kt\u00f3rym etapie procesu wyst\u0105pi\u0142 problem, co znacznie przyspiesza poszukiwanie jego pierwotnej przyczyny.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/ba1110bf1c93249c73dd76c490f1d7aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNiedawno zrealizowali\u015bmy interfejs, kt\u00f3ry pozwala na ponowne wysy\u0142anie wiadomo\u015bci przez nasze wsparcie po usuni\u0119ciu ich przyczyn (na przyk\u0142ad przywr\u00f3cenie dzia\u0142ania zewn\u0119trznego systemu) i, oczywi\u015bcie, zg\u0142oszenie odpowiedniego defektu do analizy. Tu przyda\u0142y si\u0119 nasze self-topiki, aby nie restartowa\u0107 d\u0142ugiego \u0142a\u0144cucha przetwarzania, mo\u017cna go wznowi\u0107 od potrzebnego kroku. <\/p>\n<p><img decoding=\"async\" alt=\"\u201eChodz\u0105c w moich butach\u201d \u2014 chwila, a czy s\u0105 one oznaczone?\" src=\"\/wp-content\/uploads\/2020\/07\/78c7831131808732b74b27f055b60d54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Eksploatacja platformy<\/h3>\n<p>\nPlatforma jest ju\u017c w produkcyjnej eksploatacji, codziennie przeprowadzamy dostawy i wysy\u0142ki, pod\u0142\u0105czamy nowe centra dystrybucyjne i sklepy. W ramach pilota system dzia\u0142a z grupami towar\u00f3w \u201eTyto\u0144\u201d i \u201eObuwie\u201d. <\/p>\n<p>Ca\u0142y nasz zesp\u00f3\u0142 uczestniczy w przeprowadzaniu pilota\u017cy, analizuje pojawiaj\u0105ce si\u0119 problemy i wnosi sugestie dotycz\u0105ce ulepsze\u0144 naszego produktu, od poprawy log\u00f3w po zmiany w procesach. <\/p>\n<p>Aby nie powtarza\u0107 swoich b\u0142\u0119d\u00f3w, wszystkie przypadki znalezione w trakcie pilota\u017cu odzwierciedlaj\u0105 si\u0119 w testach automatycznych. Du\u017ca liczba test\u00f3w automatycznych i test\u00f3w jednostkowych pozwala na przeprowadzanie test\u00f3w regresyjnych i wprowadzanie poprawek w dos\u0142ownie kilka godzin.<\/p>\n<p>Obecnie kontynuujemy rozw\u00f3j i doskonalenie naszej platformy, nieustannie napotykaj\u0105c nowe wyzwania. Je\u015bli jeste\u015b zainteresowany, opowiemy o naszych rozwi\u0105zaniach w kolejnych artyku\u0142ach.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 chwila, a czy one s\u0105 oznakowane? | ProHoster","description":"Od 2019 roku w Rosji obowi\u0105zuje prawo dotycz\u0105ce obowi\u0105zkowego znakowania. Prawo to nie obejmuje wszystkich grup towarowych, a terminy wprowadzenia obowi\u0105zkowego znakowania r\u00f3\u017cni\u0105 si\u0119 w zale\u017cno\u015bci od grup towarowych.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/87372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=87372"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/87372\/revisions"}],"predecessor-version":[{"id":157972,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/87372\/revisions\/157972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/87373"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=87372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=87372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=87372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}