{"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\/cs\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","title":{"rendered":"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Od roku 2019 v Rusku plat\u00ed z\u00e1kon o povinn\u00e9m ozna\u010dov\u00e1n\u00ed. Tento z\u00e1kon se nevztahuje na v\u0161echny skupiny zbo\u017e\u00ed a term\u00edny zaveden\u00ed povinn\u00e9ho ozna\u010dov\u00e1n\u00ed jsou pro jednotliv\u00e9 skupiny odli\u0161n\u00e9. Prvn\u00edmi produkty, kter\u00e9 budou povinn\u011b ozna\u010dov\u00e1ny, jsou tab\u00e1k, obuv, l\u00e9ky, pozd\u011bji se p\u0159idaj\u00ed tak\u00e9 dal\u0161\u00ed produkty, jako jsou parf\u00e9my, textil a ml\u00e9ko. Tento legislativn\u00ed krok podn\u00edtil v\u00fdvoj nov\u00fdch IT \u0159e\u0161en\u00ed, kter\u00e1 umo\u017en\u00ed sledovat celou \u017eivotnost produktu od v\u00fdroby po koupi koncov\u00fdm spot\u0159ebitelem, v\u0161em \u00fa\u010dastn\u00edk\u016fm procesu: jak samotn\u00e9mu st\u00e1tu, tak v\u0161em organizac\u00edm, kter\u00e9 prod\u00e1vaj\u00ed zbo\u017e\u00ed s povinn\u00fdm ozna\u010dov\u00e1n\u00edm.<\/p>\n<p>Ve spole\u010dnosti X5 syst\u00e9m, kter\u00fd bude sledovat ozna\u010den\u00e9 produkty a vym\u011b\u0148ovat si data se st\u00e1tem a dodavateli, dostal n\u00e1zev \u201eMarkus\u201c. \u0158ekneme si postupn\u011b, jak a kdo ho vyv\u00edjel, jak\u00fd m\u00e1 technologick\u00fd stack a pro\u010d m\u00e1me d\u016fvod b\u00fdt hrd\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" 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>Skute\u010dn\u00fd HighLoad<\/h3>\n<p>\n\u201eMarkus\u201c \u0159e\u0161\u00ed \u0159adu \u00faloh, hlavn\u00ed z nich je integra\u010dn\u00ed interakce mezi informa\u010dn\u00edmi syst\u00e9my X5 a st\u00e1tn\u00edm informa\u010dn\u00edm syst\u00e9mem ozna\u010dovan\u00e9ho zbo\u017e\u00ed (GIS MP) pro sledov\u00e1n\u00ed pohybu ozna\u010den\u00e9ho zbo\u017e\u00ed.Platforma tak\u00e9 uchov\u00e1v\u00e1 v\u0161echny k\u00f3dy ozna\u010den\u00ed, kter\u00e9 k n\u00e1m dorazily, a celou historii pohybu t\u011bchto k\u00f3d\u016f mezi objekty, pom\u00e1h\u00e1 odstranit nesrovnalosti ozna\u010den\u00e9ho zbo\u017e\u00ed. Nap\u0159\u00edklad u tab\u00e1kov\u00fdch v\u00fdrobk\u016f, kter\u00e9 pat\u0159\u00ed do prvn\u00edch skupin ozna\u010dovan\u00e9ho zbo\u017e\u00ed, pouze jedno kamion s cigaretami obsahuje p\u0159ibli\u017en\u011b 600 000 krabi\u010dek, z nich\u017e ka\u017ed\u00e1 m\u00e1 sv\u016fj unik\u00e1tn\u00ed k\u00f3d. \u00dakolem na\u0161eho syst\u00e9mu je sledovat a ov\u011b\u0159ovat leg\u00e1lnost p\u0159esun\u016f ka\u017ed\u00e9 takov\u00e9 krabi\u010dky mezi sklady a obchody, a nakonec zkontrolovat jejich povolenou prodej koncov\u00e9mu z\u00e1kazn\u00edkovi. Evidujeme asi 125 000 pokladn\u00edch operac\u00ed za hodinu a tak\u00e9 mus\u00edme zapsat, jak se ka\u017ed\u00e1 takov\u00e1 krabi\u010dka dostala do obchodu. S ohledem na v\u0161echny p\u0159esuny mezi objekty o\u010dek\u00e1v\u00e1me des\u00edtky miliard z\u00e1znam\u016f ro\u010dn\u011b.<\/p>\n<h3>T\u00fdm M<\/h3>\n<p>\nI kdy\u017e je \u201eMarkus\u201c pova\u017eov\u00e1n v r\u00e1mci X5 za projekt, realizuje se podle produktov\u00e9ho p\u0159\u00edstupu. T\u00fdm pracuje metodou Scrum. Start projektu byl v l\u00e9t\u011b minul\u00e9ho roku, ale prvn\u00ed v\u00fdsledky p\u0159i\u0161ly a\u017e v \u0159\u00edjnu \u2014 byla zcela sestavena vlastn\u00ed skupina, vyvinuta architektura syst\u00e9mu a zakoupeno vybaven\u00ed. Nyn\u00ed je v t\u00fdmu 16 lid\u00ed, z nich\u017e \u0161est se zab\u00fdv\u00e1 v\u00fdvojem backendu a frontendu, t\u0159i syst\u00e9movou anal\u00fdzou. Dal\u0161\u00ed \u0161est lid\u00ed se v\u011bnuje ru\u010dn\u00edmu, z\u00e1t\u011b\u017eov\u00e9mu a automatizovan\u00e9mu testov\u00e1n\u00ed a podpo\u0159e produktu. Krom\u011b toho m\u00e1me specialistu na SRE. <\/p>\n<p>K\u00f3d v na\u0161em t\u00fdmu nep\u00ed\u0161\u00ed pouze v\u00fdvoj\u00e1\u0159i, prakticky v\u0161ichni \u010dlenov\u00e9 um\u011bj\u00ed programovat a p\u00ed\u0161\u00ed automatizovan\u00e9 testy, z\u00e1t\u011b\u017eov\u00e9 skripty a skripty pro automatizaci. V\u011bnujeme tomu zvl\u00e1\u0161tn\u00ed pozornost, proto\u017ee i podpora produktu vy\u017eaduje vysokou \u00farove\u0148 automatizace. Koleg\u016fm, kte\u0159\u00ed d\u0159\u00edve neprogramovali, se v\u017edy sna\u017e\u00edme pomoci a poradit, zadat do pr\u00e1ce n\u011bjak\u00e9 mal\u00e9 \u00fakoly.<\/p>\n<p>V souvislosti s pandemi\u00ed koronaviru jsme p\u0159evedli cel\u00fd t\u00fdm na pr\u00e1ci na d\u00e1lku, d\u00edky dostupnosti v\u0161ech n\u00e1stroj\u016f pro \u0159\u00edzen\u00ed v\u00fdvoje a vytvo\u0159en\u00e9mu workflow v Jira a GitLab jsme tento krok snadno zvl\u00e1dli. M\u011bs\u00edce str\u00e1ven\u00e9 na d\u00e1lku uk\u00e1zaly, \u017ee produktivita t\u00fdmu t\u00edm neutrp\u011bla, pro mnoh\u00e9 se zv\u00fd\u0161il komfort v pr\u00e1ci, jedin\u00e9, co chyb\u00ed, je osobn\u00ed komunikace.<\/p>\n<h3>Setk\u00e1n\u00ed t\u00fdmu p\u0159ed prac\u00ed na d\u00e1lku<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/c1095316fd5e3dcc147b3dd968013152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Setk\u00e1n\u00ed b\u011bhem pr\u00e1ce na d\u00e1lku<\/h3>\n<p>\n<img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/0c705ebbe28afbecd439c0ce2fcf04cb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Technologick\u00fd stack \u0159e\u0161en\u00ed<\/h3>\n<p>\nStandardn\u00edm repozit\u00e1\u0159em a n\u00e1strojem CI\/CD pro X5 je GitLab. Pou\u017e\u00edv\u00e1me ho pro uchov\u00e1v\u00e1n\u00ed k\u00f3du, nep\u0159etr\u017eit\u00e9 testov\u00e1n\u00ed a nasazen\u00ed na testovac\u00ed a produk\u010dn\u00ed servery. Tak\u00e9 pou\u017e\u00edv\u00e1me praxi code review, kdy mus\u00ed minim\u00e1ln\u011b 2 kolegov\u00e9 schv\u00e1lit zm\u011bny v k\u00f3du, kter\u00e9 navrhuje v\u00fdvoj\u00e1\u0159. Statick\u00e9 analyz\u00e1tory k\u00f3du SonarQube a JaCoCo n\u00e1m pom\u00e1haj\u00ed udr\u017eovat k\u00f3d \u010dist\u00fd a zajistit po\u017eadovanou \u00farove\u0148 pokryt\u00ed unit testy. V\u0161echny zm\u011bny v k\u00f3du mus\u00ed povinn\u011b proj\u00edt t\u011bmito kontrolami. V\u0161echny testovac\u00ed sc\u00e9n\u00e1\u0159e, kter\u00e9 se prov\u00e1d\u011bj\u00ed ru\u010dn\u011b, jsou n\u00e1sledn\u011b automatizov\u00e1ny.<\/p>\n<p>Pro \u00fasp\u011b\u0161n\u00e9 proveden\u00ed obchodn\u00edch proces\u016f pomoc\u00ed \u201eMarkusu\u201c jsme museli vy\u0159e\u0161it \u0159adu technologick\u00fdch \u00fakol\u016f, o ka\u017ed\u00e9m z nich podrobn\u011b. <\/p>\n<p><b>\u00dakol 1. Pot\u0159eba horizont\u00e1ln\u00ed \u0161k\u00e1lovatelnosti syst\u00e9mu<\/b><\/p>\n<p>Pro \u0159e\u0161en\u00ed tohoto \u00fakolu jsme zvolili mikroslu\u017ebov\u00fd p\u0159\u00edstup k architektu\u0159e. Bylo velmi d\u016fle\u017eit\u00e9 pochopit oblasti odpov\u011bdnosti slu\u017eeb. Sna\u017eili jsme se je rozd\u011blit podle obchodn\u00edch operac\u00ed, s ohledem na specifika proces\u016f. Nap\u0159\u00edklad p\u0159\u00edjem ve skladech je sice m\u00e9n\u011b \u010dast\u00e1, ale velmi objemn\u00e1 operace, b\u011bhem kter\u00e9 je t\u0159eba co nejrychleji z\u00edskat od st\u00e1tn\u00edho regul\u00e1tora informace o p\u0159ij\u00edman\u00fdch jednotk\u00e1ch zbo\u017e\u00ed, jejich\u017e po\u010det v jedn\u00e9 dod\u00e1vce m\u016f\u017ee dos\u00e1hnout a\u017e 600000, ov\u011b\u0159it p\u0159\u00edpustnost p\u0159ijet\u00ed tohoto zbo\u017e\u00ed do skladu a poskytnout v\u0161echny pot\u0159ebn\u00e9 informace automatiza\u010dn\u00edmu syst\u00e9mu skladu. Naopak expedice ze sklad\u016f m\u00e1 mnohem v\u011bt\u0161\u00ed intenzitu, ale operuje s men\u0161\u00edmi objemy dat. <\/p>\n<p>V\u0161echny slu\u017eby implementujeme podle principu stateless a dokonce i intern\u00ed operace se sna\u017e\u00edme rozd\u011blit na kroky, p\u0159i\u010dem\u017e pou\u017e\u00edv\u00e1me, jak \u0159\u00edk\u00e1me, self-topiky Kafka. To, kdy\u017e mikroslu\u017eba pos\u00edl\u00e1 zpr\u00e1vu sama sob\u011b, umo\u017e\u0148uje vyv\u00e1\u017eit z\u00e1t\u011b\u017e p\u0159i v\u00edce n\u00e1ro\u010dn\u00fdch operac\u00edch a zjednodu\u0161uje \u00fadr\u017ebu produktu, ale o tom pozd\u011bji. <\/p>\n<p>Rozhodli jsme se vy\u010dlenit moduly pro interakci s extern\u00edmi syst\u00e9my do samostatn\u00fdch slu\u017eeb. To umo\u017enilo vy\u0159e\u0161it probl\u00e9m \u010dasto se m\u011bn\u00edc\u00edch API extern\u00edch syst\u00e9m\u016f, prakticky bez vlivu na slu\u017eby s obchodn\u00edmi funkcemi.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/da1dc58791fa28e89e289528e0fd2550.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161echny mikroslu\u017eby se nasazuj\u00ed v klastru OpenShift, kter\u00fd \u0159e\u0161\u00ed jak probl\u00e9m \u0161k\u00e1lov\u00e1n\u00ed ka\u017ed\u00e9 mikroslu\u017eby, tak n\u00e1m umo\u017e\u0148uje nevyu\u017e\u00edvat extern\u00ed n\u00e1stroje pro Service Discovery.<\/p>\n<p><b>\u00dakol 2. Pot\u0159eba udr\u017een\u00ed vysok\u00e9ho zat\u00ed\u017een\u00ed a velmi intenzivn\u00ed v\u00fdm\u011bny dat mezi slu\u017ebami platformy:<\/b> pouze v pr\u016fb\u011bhu f\u00e1ze spu\u0161t\u011bn\u00ed projektu prob\u00edh\u00e1 p\u0159ibli\u017en\u011b 600 operac\u00ed za sekundu. O\u010dek\u00e1v\u00e1me, \u017ee toto \u010d\u00edslo vzroste na 5000 operac\u00ed\/sekundu s p\u0159ipojov\u00e1n\u00edm obchodn\u00edch objekt\u016f k na\u0161\u00ed platform\u011b.<\/p>\n<p>Tento \u00fakol jsme \u0159e\u0161ili nasazen\u00edm clustera Kafka a prakticky \u00fapln\u00fdm odm\u00edtnut\u00edm synchronn\u00ed interakce mezi mikroservisy platformy. To vy\u017eaduje velmi pe\u010dlivou anal\u00fdzu po\u017eadavk\u016f na syst\u00e9m, proto\u017ee ne v\u0161echny operace mohou b\u00fdt asynchronn\u00ed. P\u0159itom nejen p\u0159ed\u00e1v\u00e1me ud\u00e1losti p\u0159es broker, ale tak\u00e9 v zpr\u00e1v\u011b p\u0159en\u00e1\u0161\u00edme v\u0161echny pot\u0159ebn\u00e9 obchodn\u00ed informace. Velikost zpr\u00e1vy m\u016f\u017ee dosahovat a\u017e n\u011bkolika set kilobajt\u016f. Omezen\u00ed na objem zpr\u00e1v v Kafka n\u00e1s nut\u00ed k p\u0159esn\u00e9mu p\u0159edpov\u011bzen\u00ed velikosti zpr\u00e1v, a pokud je to nutn\u00e9, d\u011bl\u00edme je, ale toto d\u011blen\u00ed je logick\u00e9 a souvis\u00ed s obchodn\u00edmi operacemi. <br \/>\nNap\u0159\u00edklad zbo\u017e\u00ed, kter\u00e9 p\u0159ijelo autem, d\u011bl\u00edme podle krabic. Pro synchronn\u00ed operace jsou vy\u010dlen\u011bny samostatn\u00e9 mikroservisy a prov\u00e1d\u00ed se d\u016fkladn\u00e9 z\u00e1t\u011b\u017eov\u00e9 testov\u00e1n\u00ed. Pou\u017eit\u00ed Kafka p\u0159ed n\u00e1s postavilo jinou v\u00fdzvu \u2014 ov\u011b\u0159en\u00ed fungov\u00e1n\u00ed na\u0161eho servisu s ohledem na integraci Kafka d\u011bl\u00e1 v\u0161echny na\u0161e unit testy asynchronn\u00edmi. Tento \u00fakol jsme \u0159e\u0161ili psan\u00edm vlastn\u00edch utilitn\u00edch metod s pou\u017eit\u00edm Embedded Kafka Broker. To nezru\u0161uje nutnost ps\u00e1t unit testy na jednotliv\u00e9 metody, ale slo\u017eit\u00e9 p\u0159\u00edpady rad\u011bji testujeme s pou\u017eit\u00edm Kafka.<\/p>\n<p>Velkou pozornost jsme v\u011bnovali trasov\u00e1n\u00ed log\u016f, aby jejich TraceId nezmizely p\u0159i vzniku v\u00fdjimek b\u011bhem pr\u00e1ce servis\u016f nebo p\u0159i pr\u00e1ci s d\u00e1vkami Kafka. A pokud s prvn\u00edm ot\u00e1zky nevznikly, pak v druh\u00e9m p\u0159\u00edpad\u011b mus\u00edme do logu zapsat v\u0161echna TraceId, se kter\u00fdmi p\u0159i\u0161la d\u00e1vka, a vybrat jedno pro pokra\u010dov\u00e1n\u00ed trasov\u00e1n\u00ed. P\u0159i hled\u00e1n\u00ed podle p\u016fvodn\u00edho TraceId tak u\u017eivatel snadno zjist\u00ed, s \u010d\u00edm pokra\u010dovalo trasov\u00e1n\u00ed.<\/p>\n<p><b>\u00dakol 3. Pot\u0159eba uchov\u00e1vat velk\u00e9 mno\u017estv\u00ed dat: <\/b> v\u00edce ne\u017e 1 miliarda zna\u010dkov\u00e1n\u00ed ro\u010dn\u011b pouze pro tab\u00e1k p\u0159ich\u00e1z\u00ed do X5. Je vy\u017eadov\u00e1n st\u00e1l\u00fd a rychl\u00fd p\u0159\u00edstup. Cel\u00fd syst\u00e9m by m\u011bl zpracov\u00e1vat p\u0159ibli\u017en\u011b 10 miliard z\u00e1znam\u016f o historii pohybu dat ozna\u010den\u00e9ho zbo\u017e\u00ed.<\/p>\n<p>Pro t\u0159et\u00ed \u00fakol byla zvolena NoSQL datab\u00e1ze MongoDB. M\u00e1me postaven\u00fd shard z 5 uzl\u016f a v ka\u017ed\u00e9m uzlu Replica Set ze 3 server\u016f. To umo\u017e\u0148uje horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed syst\u00e9mu p\u0159id\u00e1v\u00e1n\u00edm <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/server\/\"   title=\"nov\u00fdch server\u016f\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"781\">nov\u00fdch server\u016f<\/a> do clustera a zajistit jeho odolnost v\u016f\u010di v\u00fdpadk\u016fm. Zde jsme se setkali s jin\u00fdm probl\u00e9mem \u2014 zaji\u0161t\u011bn\u00edm transak\u010dnost\u00ed v clusteru mongo s ohledem na pou\u017e\u00edv\u00e1n\u00ed horizont\u00e1ln\u011b \u0161k\u00e1lovateln\u00fdch mikroservis\u016f. Nap\u0159\u00edklad jedn\u00edm z \u00fakol\u016f na\u0161eho syst\u00e9mu je odhalit pokusy o op\u011btovn\u00fd prodej zbo\u017e\u00ed se stejn\u00fdmi k\u00f3dy ozna\u010den\u00ed. Zde vznikaj\u00ed kolize s chybn\u011b proveden\u00fdmi skenov\u00e1n\u00edmi nebo s chybn\u00fdmi operacemi pokladn\u00edk\u016f. Zjistili jsme, \u017ee takov\u00e9 duplicity mohou vznikat jak uvnit\u0159 jedn\u00e9 zpracov\u00e1van\u00e9 d\u00e1vky Kafka, tak uvnit\u0159 dvou paraleln\u011b zpracov\u00e1van\u00fdch d\u00e1vek. Tak\u017ee kontrola na vznik duplicit pomoc\u00ed dotazu do datab\u00e1ze nic ne\u0159e\u0161ila. Pro ka\u017edou mikroservisu jsme \u0159e\u0161ili probl\u00e9m zvl\u00e1\u0161\u0165 podle obchodn\u00ed logiky tohoto servisu. Nap\u0159\u00edklad jsme pro \u00fa\u010dtenky p\u0159idali kontrolu uvnit\u0159 d\u00e1vky a samostatn\u00e9 zpracov\u00e1n\u00ed na vznik duplicit p\u0159i vkl\u00e1d\u00e1n\u00ed. <\/p>\n<p>Aby pr\u00e1ce u\u017eivatel\u016f s histori\u00ed operac\u00ed nijak neovlivnila to nejd\u016fle\u017eit\u011bj\u0161\u00ed \u2014 fungov\u00e1n\u00ed na\u0161ich obchodn\u00edch proces\u016f, v\u0161echny historick\u00e9 \u00fadaje jsme vy\u010dlenili do samostatn\u00e9 slu\u017eby se samostatnou datab\u00e1z\u00ed, kter\u00e1 tak\u00e9 z\u00edsk\u00e1v\u00e1 informace prost\u0159ednictv\u00edm Kafka. T\u00edmto zp\u016fsobem u\u017eivatel\u00e9 pracuj\u00ed s izolovanou slu\u017ebou, ani\u017e by ovliv\u0148ovali slu\u017eby, kter\u00e9 zpracov\u00e1vaj\u00ed \u00fadaje o aktu\u00e1ln\u00edch operac\u00edch.<\/p>\n<p><b>\u00dakol 4. Op\u011btovn\u00e9 zpracov\u00e1n\u00ed front a monitoring:<\/b><\/p>\n<p>V distribuovan\u00fdch syst\u00e9mech nevyhnuteln\u011b doch\u00e1z\u00ed k probl\u00e9m\u016fm a chyb\u00e1m dostupnosti datab\u00e1z\u00ed, front, extern\u00edch datov\u00fdch zdroj\u016f. V p\u0159\u00edpad\u011b \"Markusa\" je zdrojem t\u011bchto chyb integrace s extern\u00edmi syst\u00e9my. Bylo nutn\u00e9 naj\u00edt \u0159e\u0161en\u00ed, kter\u00e9 umo\u017e\u0148uje prov\u00e1d\u011bt opakovan\u00e9 dotazy na chybn\u00e9 odpov\u011bdi s n\u011bjak\u00fdm stanoven\u00fdm \u010dasov\u00fdm limitem, ale p\u0159itom nezkon\u010dit zpracov\u00e1n\u00ed \u00fasp\u011b\u0161n\u00fdch dotaz\u016f v hlavn\u00ed front\u011b. Pro toto byla zvolena takzvan\u00e1 koncepce \"retry podle t\u00e9mat\". Pro ka\u017ed\u00e9 hlavn\u00ed t\u00e9ma se vytv\u00e1\u0159\u00ed jeden nebo v\u00edce retry t\u00e9mat, do kter\u00fdch se sm\u011b\u0159uj\u00ed chybov\u00e9 zpr\u00e1vy, p\u0159i\u010dem\u017e se vylu\u010duje zpo\u017ed\u011bn\u00ed p\u0159i zpracov\u00e1n\u00ed zpr\u00e1v z hlavn\u00edho t\u00e9matu. Sch\u00e9ma interakce \u2014 <\/p>\n<p><img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/922b3107d183312312713c213488fbe1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPro realizaci tohoto sch\u00e9matu jsme pot\u0159ebovali n\u00e1sleduj\u00edc\u00ed \u2013 integrovat toto \u0159e\u0161en\u00ed se Spring a vyhnout se duplicity k\u00f3du. Na internetu jsme narazili na podobn\u00e9 \u0159e\u0161en\u00ed zalo\u017een\u00e9 na Spring BeanPostProcessor, ale p\u0159ipadalo n\u00e1m p\u0159\u00edli\u0161 obt\u00ed\u017en\u00e9. Na\u0161e t\u00fdmem vyvinulo jednodu\u0161\u0161\u00ed \u0159e\u0161en\u00ed, kter\u00e9 se umo\u017e\u0148uje zapojit do cyklu Spring pro vytv\u00e1\u0159en\u00ed consumer\u016f a dodate\u010dn\u011b p\u0159id\u00e1vat Retry Consumers. Prototyp na\u0161eho \u0159e\u0161en\u00ed jsme p\u0159edlo\u017eili t\u00fdmu Spring, m\u016f\u017eete si ho prohl\u00e9dnout. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/issues\/1229\">tady<\/a><\/noindex>. Po\u010det Retry Consumer\u016f a po\u010det pokus\u016f ka\u017ed\u00e9ho consumera se nastavuje p\u0159es parametry, v z\u00e1vislosti na pot\u0159eb\u00e1ch obchodn\u00edho procesu, a aby v\u0161e fungovalo, sta\u010d\u00ed pouze um\u00edstit v\u0161em Spring v\u00fdvoj\u00e1\u0159\u016fm zn\u00e1mou anotaci org.springframework.kafka.annotation.KafkaListener.<\/p>\n<p>V p\u0159\u00edpad\u011b, \u017ee zpr\u00e1va nemohla b\u00fdt zpracov\u00e1na po v\u0161ech retry pokusech, dostane se na DLT (dead letter topic) pomoc\u00ed Spring DeadLetterPublishingRecoverer. Na \u017e\u00e1dost podpory jsme tuto funkcionalitu roz\u0161\u00ed\u0159ili a vytvo\u0159ili samostatnou slu\u017ebu, kter\u00e1 umo\u017e\u0148uje prohl\u00ed\u017eet zpr\u00e1vy, kter\u00e9 se dostaly do DLT, stackTrace, traceId a dal\u0161\u00ed u\u017eite\u010dn\u00e9 informace o nich. Krom\u011b toho byly p\u0159id\u00e1ny monitorov\u00e1n\u00ed a upozorn\u011bn\u00ed na v\u0161echny DLT topiky, a nyn\u00ed v podstat\u011b je p\u0159\u00edtomnost zpr\u00e1vy v DLT topiku d\u016fvodem pro anal\u00fdzu a zalo\u017een\u00ed defektu. To je velmi pohodln\u00e9 \u2013 podle n\u00e1zvu topiku ihned pochop\u00edme, na jak\u00e9m kroku procesu do\u0161lo k probl\u00e9mu, co\u017e v\u00fdrazn\u011b urychluje hled\u00e1n\u00ed jeho ko\u0159enov\u00e9 p\u0159\u00ed\u010diny.<\/p>\n<p><img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/ba1110bf1c93249c73dd76c490f1d7aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNed\u00e1vno jsme implementovali rozhran\u00ed, kter\u00e9 umo\u017e\u0148uje znovu poslat zpr\u00e1vy pomoc\u00ed na\u0161\u00ed podpory po odstran\u011bn\u00ed jejich p\u0159\u00ed\u010din (nap\u0159\u00edklad obnoven\u00ed funk\u010dnosti extern\u00edho syst\u00e9mu) a samoz\u0159ejm\u011b zalo\u017een\u00ed odpov\u00eddaj\u00edc\u00edho defektu k anal\u00fdze. Tady p\u0159i\u0161ly vhod na\u0161e self-topiky, abychom nemuseli znovu spou\u0161t\u011bt dlouh\u00fd \u0159et\u011bzec zpracov\u00e1n\u00ed, m\u016f\u017eeme jej spustit z po\u017eadovan\u00e9ho kroku. <\/p>\n<p><img decoding=\"async\" alt=\"\u201eWalking in my shoes\u201c \u2014 po\u010dkat, jsou zna\u010dkovan\u00e9?\" src=\"\/wp-content\/uploads\/2020\/07\/78c7831131808732b74b27f055b60d54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Exploatace platformy<\/h3>\n<p>\nPlatforma je ji\u017e v produk\u010dn\u00edm provozu, ka\u017ed\u00fd den prov\u00e1d\u00edme dod\u00e1vky a expedice, p\u0159ipojujeme nov\u00e9 distribu\u010dn\u00ed centra a obchody. V r\u00e1mci pilotn\u00edho projektu syst\u00e9m pracuje se skupinami produkt\u016f \u201eTab\u00e1k\u201c a \u201eObuv\u201c. <\/p>\n<p>Cel\u00fd n\u00e1\u0161 t\u00fdm se pod\u00edl\u00ed na realizaci pilot\u016f, analyzuje vznikl\u00e9 probl\u00e9my a navrhuje vylep\u0161en\u00ed na\u0161eho produktu od zlep\u0161en\u00ed log\u016f po zm\u011bny v procesech. <\/p>\n<p>Abychom se vyhnuli opakov\u00e1n\u00ed na\u0161ich chyb, v\u0161echny p\u0159\u00edpady z pilotn\u00edho projektu se odr\u00e1\u017eej\u00ed v automatizovan\u00fdch testech. Vysok\u00fd po\u010det automatizovan\u00fdch test\u016f a unit test\u016f n\u00e1m umo\u017e\u0148uje prov\u00e1d\u011bt regresn\u00ed testov\u00e1n\u00ed a nasadit hotfix doslova b\u011bhem n\u011bkolika hodin.<\/p>\n<p>Nyn\u00ed pokra\u010dujeme ve v\u00fdvoji a zlep\u0161ov\u00e1n\u00ed na\u0161\u00ed platformy a neust\u00e1le se setk\u00e1v\u00e1me s nov\u00fdmi v\u00fdzvami. Pokud v\u00e1s to zaj\u00edm\u00e1, r\u00e1di v\u00e1m sd\u011bl\u00edme na\u0161e \u0159e\u0161en\u00ed v n\u00e1sleduj\u00edc\u00edch \u010dl\u00e1nc\u00edch.<br \/>\n<br \/>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\u201c \u2014 zastavte, ale jsou ozna\u010den\u00e9? | ProHoster","description":"Od roku 2019 v Rusku plat\u00ed z\u00e1kon o povinn\u00e9m ozna\u010dov\u00e1n\u00ed. Z\u00e1kon se nevztahuje na v\u0161echny skupiny zbo\u017e\u00ed a term\u00edny \u00fa\u010dinnosti povinn\u00e9ho ozna\u010dov\u00e1n\u00ed se li\u0161\u00ed pro r\u016fzn\u00e9 skupiny zbo\u017e\u00ed.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/walking-in-my-shoes-stop-a-oni-markirovannye","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/87372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=87372"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87372\/revisions"}],"predecessor-version":[{"id":157972,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87372\/revisions\/157972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/87373"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=87372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=87372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=87372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}