{"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\/fr\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","title":{"rendered":"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Depuis 2019, une loi sur la tra\u00e7abilit\u00e9 obligatoire est en vigueur en Russie. Cette loi ne s'applique pas \u00e0 toutes les cat\u00e9gories de produits, et les d\u00e9lais d'entr\u00e9e en vigueur de la tra\u00e7abilit\u00e9 obligatoire varient selon les groupes de produits. Les premiers \u00e0 \u00eatre soumis \u00e0 la tra\u00e7abilit\u00e9 obligatoire sont le tabac, les chaussures, les m\u00e9dicaments, suivis plus tard d'autres produits tels que les parfums, les textiles et le lait. Cette nouveaut\u00e9 l\u00e9gislative a incit\u00e9 le d\u00e9veloppement de nouvelles solutions informatiques permettant de suivre l'ensemble du cycle de vie des produits, de la production \u00e0 l'achat par le consommateur final, impliquant tous les participants au processus : tant l'\u00c9tat que toutes les organisations vendant des produits soumis \u00e0 la tra\u00e7abilit\u00e9 obligatoire.<\/p>\n<p>Chez X5, le syst\u00e8me qui suivra les produits marqu\u00e9s et \u00e9changera des donn\u00e9es avec l'\u00c9tat et les fournisseurs a \u00e9t\u00e9 nomm\u00e9 \u00ab Markus \u00bb. Nous expliquerons dans l'ordre comment et qui l'a d\u00e9velopp\u00e9, quelle est sa stack technologique, et pourquoi nous avons de quoi \u00eatre fiers.<\/p>\n<p><img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" 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>Un v\u00e9ritable HighLoad<\/h3>\n<p>\n\u00ab Markus \u00bb r\u00e9sout de nombreuses t\u00e2ches, la principale \u00e9tant l'interaction d'int\u00e9gration entre les syst\u00e8mes d'information de X5 et le syst\u00e8me d'information public pour la tra\u00e7abilit\u00e9 des produits marqu\u00e9s (GIS MP) afin de suivre le mouvement des produits marqu\u00e9s. De plus, la plateforme conserve tous les codes de marquage qui nous parviennent ainsi que l'historique de mouvement de ces codes entre les objets, aidant \u00e0 \u00e9viter les erreurs de tri des produits marqu\u00e9s. Prenons l'exemple des produits du tabac, qui figurent dans les premiers groupes de marchandises marqu\u00e9es : un seul camion de cigarettes contient environ 600 000 paquets, chacun ayant son propre code unique. La t\u00e2che de notre syst\u00e8me est de suivre et de v\u00e9rifier la l\u00e9galit\u00e9 de chaque mouvement de ces paquets entre les entrep\u00f4ts et les magasins, et de v\u00e9rifier enfin leur l\u00e9gitimit\u00e9 pour \u00eatre vendus au consommateur final. Nous enregistrons environ 125 000 op\u00e9rations de caisse par heure, et il faut \u00e9galement enregistrer comment chacun de ces paquets a atterri dans le magasin. Ainsi, en tenant compte de tous les mouvements entre les objets, nous pr\u00e9voyons des dizaines de milliards d'enregistrements par an.<\/p>\n<h3>L'\u00e9quipe M<\/h3>\n<p>\nBien que \u00ab Markus \u00bb soit consid\u00e9r\u00e9 comme un projet dans le cadre de X5, sa mise en \u0153uvre suit une approche produit. L'\u00e9quipe travaille selon la m\u00e9thode Scrum. Le projet a \u00e9t\u00e9 lanc\u00e9 \u00e0 l'\u00e9t\u00e9 dernier, mais les premiers r\u00e9sultats n'ont \u00e9t\u00e9 observ\u00e9s qu'en octobre : une \u00e9quipe d\u00e9di\u00e9e a \u00e9t\u00e9 enti\u00e8rement constitu\u00e9e, l'architecture du syst\u00e8me a \u00e9t\u00e9 d\u00e9velopp\u00e9e et le mat\u00e9riel a \u00e9t\u00e9 acquis. Actuellement, l'\u00e9quipe compte 16 personnes, dont six se consacrent au d\u00e9veloppement backend et frontend, et trois \u00e0 l'analyse syst\u00e8me. Six autres personnes g\u00e8rent les tests manuels, de charge, automatis\u00e9s, ainsi que le suivi du produit. De plus, nous avons un sp\u00e9cialiste SRE. <\/p>\n<p>Dans notre \u00e9quipe, non seulement les d\u00e9veloppeurs \u00e9crivent du code, mais presque tous les membres savent programmer et r\u00e9digent des tests automatis\u00e9s, des scripts de charge et des scripts d'automatisation. Nous accordons une attention particuli\u00e8re \u00e0 cela, car m\u00eame le support du produit n\u00e9cessite un haut niveau d'automatisation. Pour les coll\u00e8gues qui n'ont jamais programm\u00e9 auparavant, nous essayons toujours de donner des conseils et de les aider, en leur confiant des petites t\u00e2ches.<\/p>\n<p>En raison de la pand\u00e9mie de coronavirus, nous avons transf\u00e9r\u00e9 toute l'\u00e9quipe en t\u00e9l\u00e9travail. La disponibilit\u00e9 de tous les outils pour g\u00e9rer le d\u00e9veloppement, le workflow \u00e9tabli dans Jira et GitLab ont permis de passer cette \u00e9tape facilement. Les mois pass\u00e9s en t\u00e9l\u00e9travail ont montr\u00e9 que la productivit\u00e9 de l'\u00e9quipe n'en a pas souffert; pour beaucoup, le confort de travail s'est m\u00eame am\u00e9lior\u00e9, la seule chose qui manque, c'est la communication en personne.<\/p>\n<h3>R\u00e9union d'\u00e9quipe avant le t\u00e9l\u00e9travail<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/c1095316fd5e3dcc147b3dd968013152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>R\u00e9unions pendant le t\u00e9l\u00e9travail<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/0c705ebbe28afbecd439c0ce2fcf04cb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Pile technologique de la solution<\/h3>\n<p>\nLe r\u00e9f\u00e9rentiel standard et l'outil CI\/CD pour X5 est GitLab. Nous l'utilisons pour stocker le code, effectuer des tests continus et d\u00e9ployer sur des serveurs de test et de production. Nous pratiquons \u00e9galement le code review, o\u00f9 au moins 2 coll\u00e8gues doivent approuver les modifications de code apport\u00e9es par le d\u00e9veloppeur. Les analyseurs statiques de code SonarQube et JaCoCo nous aident \u00e0 maintenir la propret\u00e9 du code et \u00e0 garantir un niveau de couverture requis par les tests unitaires. Toutes les modifications de code doivent passer par ces contr\u00f4les. Tous les sc\u00e9narios de test ex\u00e9cut\u00e9s manuellement sont par la suite automatis\u00e9s.<\/p>\n<p>Pour mener \u00e0 bien les processus d'affaires de \u00ab Markus \u00bb, nous avons d\u00fb r\u00e9soudre plusieurs probl\u00e8mes technologiques, dont nous parlerons un par un. <\/p>\n<p><b>T\u00e2che 1. La n\u00e9cessit\u00e9 d'une \u00e9volutivit\u00e9 horizontale du syst\u00e8me<\/b><\/p>\n<p>Pour r\u00e9pondre \u00e0 ce besoin, nous avons choisi une approche microservices pour l'architecture. Il \u00e9tait tr\u00e8s important de comprendre les domaines de responsabilit\u00e9 des services. Nous avons essay\u00e9 de les diviser par op\u00e9rations commerciales en tenant compte des sp\u00e9cificit\u00e9s des processus. Par exemple, la r\u00e9ception en entrep\u00f4t n'est pas une op\u00e9ration tr\u00e8s fr\u00e9quente, mais elle est tr\u00e8s volumineuse, car il faut obtenir le plus rapidement possible des informations aupr\u00e8s du r\u00e9gulateur sur les unit\u00e9s de produit re\u00e7ues, dont le nombre dans une seule livraison peut atteindre 600 000, v\u00e9rifier l'acceptabilit\u00e9 de la r\u00e9ception de ce produit en entrep\u00f4t et transmettre toutes les informations n\u00e9cessaires au syst\u00e8me d'automatisation de l'entrep\u00f4t. En revanche, l'exp\u00e9dition depuis les entrep\u00f4ts a une intensit\u00e9 beaucoup plus \u00e9lev\u00e9e, mais op\u00e8re avec de petits volumes de donn\u00e9es. <\/p>\n<p>Tous les services sont d\u00e9velopp\u00e9s selon le principe de stateless et nous essayons m\u00eame de diviser les op\u00e9rations internes en \u00e9tapes, en utilisant ce que nous appelons des sous-th\u00e8mes Kafka. C'est lorsque le microservice envoie un message \u00e0 lui-m\u00eame, ce qui permet d'\u00e9quilibrer la charge lors d'op\u00e9rations plus gourmandes en ressources et facilite la maintenance du produit, mais nous en reparlerons plus tard. <\/p>\n<p>Nous avons d\u00e9cid\u00e9 de distinguer les modules d'interaction avec les syst\u00e8mes externes en tant que services s\u00e9par\u00e9s. Cela a permis de r\u00e9soudre le probl\u00e8me des API externes souvent changeantes, quasiment sans impact sur les services avec des fonctionnalit\u00e9s commerciales.<\/p>\n<p><img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/da1dc58791fa28e89e289528e0fd2550.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTous les microservices sont d\u00e9ploy\u00e9s dans un cluster OpenShift, qui r\u00e9sout \u00e0 la fois le probl\u00e8me de l'\u00e9volutivit\u00e9 de chaque microservice et nous permet d'\u00e9viter d'utiliser des outils tiers de d\u00e9couverte de services.<\/p>\n<p><b>T\u00e2che 2. La n\u00e9cessit\u00e9 de maintenir une charge \u00e9lev\u00e9e et un \u00e9change de donn\u00e9es tr\u00e8s intensif entre les services de la plateforme :<\/b> seulement au d\u00e9but du projet, environ 600 op\u00e9rations sont r\u00e9alis\u00e9es par seconde. Nous pr\u00e9voyons une augmentation de cette valeur \u00e0 5000 op\/sec au fur et \u00e0 mesure que les objets commerciaux se connectent \u00e0 notre plateforme.<\/p>\n<p>Nous avons r\u00e9solu cette t\u00e2che en d\u00e9ployant un cluster Kafka et en abandonnant presque compl\u00e8tement l'interaction synchrone entre les microservices de la plateforme. Cela n\u00e9cessite une analyse tr\u00e8s attentive des exigences du syst\u00e8me, car toutes les op\u00e9rations ne peuvent pas \u00eatre asynchrones. De plus, nous ne nous contentons pas de transmettre des \u00e9v\u00e9nements via le broker, mais nous incluons \u00e9galement toutes les informations commerciales requises dans le message. Ainsi, la taille du message peut atteindre plusieurs centaines de kilo-octets. La limite de taille des messages dans Kafka exige de nous une pr\u00e9vision pr\u00e9cise de la taille des messages, et, si n\u00e9cessaire, nous les divisons, mais cette division est logique, li\u00e9e aux op\u00e9rations commerciales. <br \/>\nPar exemple, pour les produits arriv\u00e9s en voiture, nous les divisons par caisses. Des microservices distincts sont affect\u00e9s aux op\u00e9rations synchrones et des tests de charge rigoureux sont effectu\u00e9s. L'utilisation de Kafka a pos\u00e9 un nouveau d\u00e9fi : v\u00e9rifier le fonctionnement de notre service en tenant compte de l'int\u00e9gration de Kafka rend tous nos tests unitaires asynchrones. Nous avons r\u00e9solu cette t\u00e2che en \u00e9crivant nos propres m\u00e9thodes utilitaires en utilisant un broker Kafka embarqu\u00e9. Cela n'annule pas la n\u00e9cessit\u00e9 d'\u00e9crire des tests unitaires pour chaque m\u00e9thode, mais pour les cas complexes, nous privil\u00e9gions les tests utilisant Kafka.<\/p>\n<p>Nous avons accord\u00e9 beaucoup d'attention \u00e0 la tra\u00e7abilit\u00e9 des logs, afin que leurs TraceId ne soient pas perdus en cas d'exceptions lors du fonctionnement des services ou lors du traitement de lots Kafka. Et si le premier cas n'a pas pos\u00e9 de probl\u00e8mes particuliers, dans le second cas, nous devons enregistrer dans le log tous les TraceId associ\u00e9s \u00e0 un batch et en s\u00e9lectionner un pour continuer la tra\u00e7abilit\u00e9. Ainsi, lors de la recherche par le TraceId initial, l'utilisateur pourra facilement d\u00e9couvrir o\u00f9 la tra\u00e7abilit\u00e9 a continu\u00e9.<\/p>\n<p><b>T\u00e2che 3. La n\u00e9cessit\u00e9 de stocker une grande quantit\u00e9 de donn\u00e9es : <\/b> plus d'un milliard d'\u00e9tiquetages par an uniquement pour le tabac est re\u00e7u par X5. Un acc\u00e8s constant et rapide est n\u00e9cessaire. En tout, le syst\u00e8me doit traiter environ 10 milliards d'enregistrements concernant l'historique des mouvements des produits \u00e9tiquet\u00e9s.<\/p>\n<p>Pour r\u00e9soudre cette troisi\u00e8me t\u00e2che, une base de donn\u00e9es NoSQL MongoDB a \u00e9t\u00e9 choisie. Nous avons construit un shard de 5 n\u0153uds, et pour chaque n\u0153ud, un ensemble de r\u00e9plicas de 3 serveurs. Cela permet de scaler le syst\u00e8me horizontalement en ajoutant <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/fr\/server\/\"   title=\"de nouveaux serveurs\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"781\">de nouveaux serveurs<\/a> dans le cluster et garantir sa r\u00e9silience. Ici, nous avons rencontr\u00e9 un autre probl\u00e8me : assurer la transactionnalit\u00e9 dans le cluster mongo en tenant compte de l'utilisation de microservices horizontalement scalables. Par exemple, l'une des t\u00e2ches de notre syst\u00e8me est d'identifier les tentatives de revente de produits avec des codes d'\u00e9tiquetage identiques. Cela engendre des probl\u00e8mes li\u00e9s \u00e0 des num\u00e9risations erron\u00e9es ou \u00e0 des op\u00e9rations incorrectes des caissiers. Nous avons constat\u00e9 que ces doublons pouvaient se produire aussi bien \u00e0 l'int\u00e9rieur d'un batch Kafka trait\u00e9 que dans deux batches parall\u00e8les. Ainsi, la v\u00e9rification des doublons en interrogeant la base de donn\u00e9es ne donnait rien. Pour chaque microservice, nous r\u00e9solvions le probl\u00e8me s\u00e9par\u00e9ment, en fonction de la logique m\u00e9tier de ce service. Par exemple, pour les re\u00e7us, nous avons ajout\u00e9 une v\u00e9rification au sein du batch et un traitement distinct pour la d\u00e9tection des doublons lors de l'insertion. <\/p>\n<p>Pour que le travail des utilisateurs avec l'historique des op\u00e9rations n'affecte en rien ce qui est essentiel \u2014 le fonctionnement de nos processus m\u00e9tier, toutes les donn\u00e9es historiques ont \u00e9t\u00e9 isol\u00e9es dans un service distinct avec une base de donn\u00e9es s\u00e9par\u00e9e, qui re\u00e7oit \u00e9galement des informations via Kafka. Ainsi, les utilisateurs interagissent avec un service isol\u00e9, sans influencer les services traitant les donn\u00e9es des op\u00e9rations en cours.<\/p>\n<p><b>T\u00e2che 4. Re-traitement des files d'attente et surveillance :<\/b><\/p>\n<p>Dans les syst\u00e8mes distribu\u00e9s, il y a in\u00e9vitablement des probl\u00e8mes et des erreurs d'accessibilit\u00e9 des bases de donn\u00e9es, des files d'attente et des sources de donn\u00e9es externes. Dans le cas de \u00ab Markus \u00bb, la source de ces erreurs est l'int\u00e9gration avec des syst\u00e8mes externes. Il \u00e9tait n\u00e9cessaire de trouver une solution permettant de r\u00e9\u00e9mettre des requ\u00eates en r\u00e9ponse \u00e0 des r\u00e9ponses erron\u00e9es avec un certain d\u00e9lai d\u00e9fini, tout en poursuivant le traitement des requ\u00eates r\u00e9ussies dans la file principale. Pour ce faire, le concept dit de \u00ab topic based retry \u00bb a \u00e9t\u00e9 choisi. Pour chaque topic principal, un ou plusieurs topics de r\u00e9essai sont cr\u00e9\u00e9s, dans lesquels sont dirig\u00e9s les messages erron\u00e9s, tout en excluant un d\u00e9lai pour le traitement des messages du topic principal. Le sch\u00e9ma d'interaction \u2014 <\/p>\n<p><img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/922b3107d183312312713c213488fbe1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour mettre en \u0153uvre un tel sch\u00e9ma, nous avions besoin de la solution suivante : int\u00e9grer cette solution avec Spring tout en \u00e9vitant la duplication de code. Sur Internet, nous sommes tomb\u00e9s sur une solution similaire bas\u00e9e sur Spring BeanPostProcessor, mais elle nous a sembl\u00e9 trop encombrante. Notre \u00e9quipe a propos\u00e9 une solution plus simple, permettant de s'int\u00e9grer au cycle de Spring pour la cr\u00e9ation de consumers et d'ajouter des Retry Consumers. Le prototype de notre solution a \u00e9t\u00e9 soumis \u00e0 l'\u00e9quipe Spring, et il est possible de le consulter. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/issues\/1229\">ici<\/a><\/noindex>Le nombre de Retry Consumers et le nombre de tentatives pour chaque consumer peuvent \u00eatre configur\u00e9s via des param\u00e8tres, selon les besoins du processus m\u00e9tier, et pour que tout fonctionne, il suffit d'ajouter l'annotation bien connue de tous les d\u00e9veloppeurs Spring : org.springframework.kafka.annotation.KafkaListener.<\/p>\n<p>Si un message ne peut pas \u00eatre trait\u00e9 apr\u00e8s toutes les tentatives de retry, il est dirig\u00e9 vers le DLT (dead letter topic) \u00e0 l'aide de Spring DeadLetterPublishingRecoverer. \u00c0 la demande du support, nous avons \u00e9largi cette fonctionnalit\u00e9 et mis en place un service distinct permettant de visualiser les messages tomb\u00e9s dans le DLT, le stackTrace, le traceId et d'autres informations utiles \u00e0 leur sujet. De plus, des surveillances et des alertes ont \u00e9t\u00e9 ajout\u00e9es pour tous les topics DLT, et actuellement, l'apparition d'un message dans le topic DLT est un motif d'examen et de cr\u00e9ation d'un d\u00e9faut. C'est tr\u00e8s pratique : gr\u00e2ce au nom du topic, nous comprenons imm\u00e9diatement \u00e0 quelle \u00e9tape du processus le probl\u00e8me est survenu, ce qui acc\u00e9l\u00e8re consid\u00e9rablement la recherche de sa cause profonde.<\/p>\n<p><img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/ba1110bf1c93249c73dd76c490f1d7aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e9cemment, nous avons mis en place une interface permettant de renvoyer des messages par l'interm\u00e9diaire de notre support, apr\u00e8s avoir r\u00e9solu leurs causes (par exemple, la restauration du bon fonctionnement d'un syst\u00e8me externe) et, bien s\u00fbr, d'ouvrir un d\u00e9faut correspondant pour analyse. Nos self-topics ont \u00e9t\u00e9 utiles ici, car il est possible de red\u00e9marrer la cha\u00eene de traitement \u00e0 partir de l'\u00e9tape souhait\u00e9e, sans avoir \u00e0 la relancer enti\u00e8rement. <\/p>\n<p><img decoding=\"async\" alt=\"\u00abMarcher dans mes chaussures\u00bb \u2014 attendez, sont-elles \u00e9tiquet\u00e9es ?\" src=\"\/wp-content\/uploads\/2020\/07\/78c7831131808732b74b27f055b60d54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Exploitation de la plateforme<\/h3>\n<p>\nLa plateforme est d\u00e9j\u00e0 en exploitation productive, chaque jour nous effectuons des livraisons et des exp\u00e9ditions, et connectons de nouveaux centres de distribution et magasins. Dans le cadre du pilote, le syst\u00e8me fonctionne avec des groupes de produits tels que \"Tabac\" et \"Chaussures\". <\/p>\n<p>Toute notre \u00e9quipe participe \u00e0 la r\u00e9alisation des pilotes, analyse les probl\u00e8mes \u00e9mergents et propose des am\u00e9liorations pour notre produit, allant de l'am\u00e9lioration des journaux \u00e0 des modifications des processus. <\/p>\n<p>Pour ne pas r\u00e9p\u00e9ter mes erreurs, tous les cas trouv\u00e9s lors du pilote sont refl\u00e9t\u00e9s dans les tests automatis\u00e9s. La pr\u00e9sence d'un grand nombre de tests automatiques et de tests unitaires permet de r\u00e9aliser des tests de r\u00e9gression et de d\u00e9ployer des correctifs en l'espace de quelques heures.<\/p>\n<p>Nous continuons actuellement \u00e0 d\u00e9velopper et \u00e0 perfectionner notre plateforme, et nous sommes constamment confront\u00e9s \u00e0 de nouveaux d\u00e9fis. Si cela vous int\u00e9resse, nous vous parlerons de nos solutions dans les prochains articles.<br \/>\n<br \/>Source : <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 - 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\/fr\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\u00abWalking in my shoes\u00bb \u2014 attendez, sont-ils marqu\u00e9s ? | ProHoster","description":"Depuis 2019, une loi sur la marque obligatoire est en vigueur en Russie. Cette loi ne s'applique pas \u00e0 tous les groupes de produits, et les d\u00e9lais d'entr\u00e9e en vigueur de la marque obligatoire varient selon les groupes de produits.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/87372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=87372"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/87372\/revisions"}],"predecessor-version":[{"id":157972,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/87372\/revisions\/157972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/87373"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=87372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=87372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=87372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}