{"id":37849,"date":"2019-10-31T22:20:09","date_gmt":"2019-10-31T19:20:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kafka-i-mikroservisy-obzor\/"},"modified":"2019-10-31T22:20:09","modified_gmt":"2019-10-31T19:20:09","slug":"kafka-i-mikroservisy-obzor","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","title":{"rendered":"Kafka a mikroservisy: p\u0159ehled","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/ab0534ad5d28b3c3aa03e4e0b2d3101b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahoj v\u0161ichni. V tomto \u010dl\u00e1nku v\u00e1m pov\u00edm, pro\u010d jsme v Avitu p\u0159ed dev\u00edti m\u011bs\u00edci zvolili Kafka, a co to vlastn\u011b p\u0159edstavuje. Pod\u011bl\u00edm se o jeden z p\u0159\u00edpad\u016f pou\u017eit\u00ed \u2014 zas\u00edl\u00e1n\u00ed zpr\u00e1v. A nakonec se pod\u00edv\u00e1me na to, jak\u00e9 v\u00fdhody jsme z\u00edskali z p\u0159\u00edstupu Kafka as a Service.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"problema\">Probl\u00e9m<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/dfa5e231847cee67259da17867a11812.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nejprve trocha kontextu. P\u0159ed n\u011bjak\u00fdm \u010dasem jsme za\u010dali opou\u0161t\u011bt monolitn\u00ed architekturu, a nyn\u00ed m\u00e1 Avito ji\u017e n\u011bkolik set r\u016fzn\u00fdch slu\u017eeb. Ty maj\u00ed sv\u00e1 \u00falo\u017ei\u0161t\u011b, sv\u016fj technologick\u00fd stack a odpov\u00eddaj\u00ed za svou \u010d\u00e1st obchodn\u00ed logiky. <\/p>\n<p><\/p>\n<p>Jedn\u00edm z probl\u00e9m\u016f p\u0159i velk\u00e9m po\u010dtu slu\u017eeb je komunikace. Slu\u017eba A \u010dasto chce zn\u00e1t informace, kter\u00e9 m\u00e1 slu\u017eba B. V tomto p\u0159\u00edpad\u011b se slu\u017eba A obrac\u00ed na slu\u017ebu B p\u0159es synchronn\u00ed API. Slu\u017eba C chce v\u011bd\u011bt, co se d\u011bje u slu\u017eeb G a D, a ty na opl\u00e1tku maj\u00ed z\u00e1jem o slu\u017eby A a B. Kdy\u017e je takov\u00fdch \u201ezv\u011bdav\u00fdch\u201c slu\u017eeb mnoho, vazby mezi nimi se m\u011bn\u00ed v zamotan\u00fd klubko.<\/p>\n<p><\/p>\n<p>P\u0159itom v jak\u00e9mkoli okam\u017eiku m\u016f\u017ee b\u00fdt slu\u017eba A nedostupn\u00e1. A co m\u00e1 v takov\u00e9m p\u0159\u00edpad\u011b d\u011blat slu\u017eba B a v\u0161echny ostatn\u00ed slu\u017eby na n\u00ed z\u00e1visl\u00e9? A pokud k vykon\u00e1n\u00ed obchodn\u00ed operace mus\u00ed prov\u00e9st \u0159et\u011bzec sekven\u010dn\u00edch synchronn\u00edch vol\u00e1n\u00ed, pravd\u011bpodobnost selh\u00e1n\u00ed cel\u00e9 operace se je\u0161t\u011b zvy\u0161uje (a t\u00edm je pravd\u011bpodobnost vy\u0161\u0161\u00ed, \u010d\u00edm del\u0161\u00ed je tento \u0159et\u011bzec). <\/p>\n<p><\/p>\n<h1 id=\"vybor-tehnologii\">V\u00fdb\u011br technologie<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/3acd7bcf3dded8093bdef6d627eb4071.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dob\u0159e, probl\u00e9my jsou jasn\u00e9. Lze je vy\u0159e\u0161it vytvo\u0159en\u00edm centralizovan\u00e9ho syst\u00e9mu v\u00fdm\u011bny zpr\u00e1v mezi slu\u017ebami. Nyn\u00ed ka\u017ed\u00e1 slu\u017eba pot\u0159ebuje v\u011bd\u011bt jen o tomto syst\u00e9mu v\u00fdm\u011bny zpr\u00e1v. Nav\u00edc samotn\u00fd syst\u00e9m by m\u011bl b\u00fdt odoln\u00fd v\u016f\u010di selh\u00e1n\u00ed a horizont\u00e1ln\u011b \u0161k\u00e1lovateln\u00fd, a v p\u0159\u00edpad\u011b poruchy by m\u011bl uchov\u00e1vat v pam\u011bti frontu po\u017eadavk\u016f pro pozd\u011bj\u0161\u00ed zpracov\u00e1n\u00ed. <\/p>\n<p><\/p>\n<p>Nyn\u00ed si vybereme technologii, na kter\u00e9 bude realizov\u00e1no doru\u010dov\u00e1n\u00ed zpr\u00e1v. Nejprve pochop\u00edme, co od n\u00ed o\u010dek\u00e1v\u00e1me:<\/p>\n<p><\/p>\n<ul>\n<li>zpr\u00e1vy mezi slu\u017ebami by se nem\u011bly ztr\u00e1cet;<\/li>\n<li>zpr\u00e1vy se mohou duplikovat;<\/li>\n<li>zpr\u00e1vy je mo\u017en\u00e9 uchov\u00e1vat a \u010d\u00edst a\u017e n\u011bkolik dn\u00ed (persisten\u010dn\u00ed fronta);<\/li>\n<li>slu\u017eby se mohou p\u0159ihl\u00e1sit na data, kter\u00e1 je zaj\u00edmaj\u00ed;<\/li>\n<li>n\u011bkolik slu\u017eeb m\u016f\u017ee \u010d\u00edst stejn\u00e1 data;<\/li>\n<li>zpr\u00e1vy mohou obsahovat podrobn\u00fd, objemn\u00fd payload (event-carried state transfer);<\/li>\n<li>n\u011bkdy je pot\u0159eba z\u00e1ruka po\u0159ad\u00ed zpr\u00e1v.<\/li>\n<\/ul>\n<p><\/p>\n<p>Je velmi d\u016fle\u017eit\u00e9 vybrat si co nejv\u00edce \u0161k\u00e1lovateln\u00fd a spolehliv\u00fd syst\u00e9m s vysokou propustnost\u00ed (minim\u00e1ln\u011b 100k zpr\u00e1v s n\u011bkolika kilobajty za sekundu).<\/p>\n<p><\/p>\n<p>V t\u00e9to f\u00e1zi jsme se rozlou\u010dili s RabbitMQ (obt\u00ed\u017en\u00e9 udr\u017eet stabiln\u00ed p\u0159i vysok\u00fdch RPS), PGQ od SkyTools (nedostate\u010dn\u011b rychl\u00e1 a \u0161patn\u011b \u0161k\u00e1lovateln\u00e1) a NSQ (neperzistentn\u00ed). V\u0161echny tyto technologie pou\u017e\u00edv\u00e1me ve spole\u010dnosti, ale pro dan\u00fd \u00fakol se nehodily. <\/p>\n<p><\/p>\n<p>D\u00e1le jsme za\u010dali zkoumat pro n\u00e1s nov\u00e9 technologie \u2014 Apache Kafka, Apache Pulsar a NATS Streaming.<\/p>\n<p><\/p>\n<p>Prvn\u00edm jsme se zbavili Pulsaru. Rozhodli jsme se, \u017ee Kafka a Pulsar jsou si navz\u00e1jem dost podobn\u00e9 \u0159e\u0161en\u00ed. A p\u0159esto\u017ee Pulsar byl otestov\u00e1n velk\u00fdmi spole\u010dnostmi, je nov\u011bj\u0161\u00ed a nab\u00edz\u00ed ni\u017e\u0161\u00ed latenci (teoreticky), rozhodli jsme se z t\u011bchto dvou ponechat Kafku jako de facto standard pro takov\u00e9 \u00fakoly. Pravd\u011bpodobn\u011b se k Apache Pulsaru vr\u00e1t\u00edme v budoucnu. <\/p>\n<p><\/p>\n<p>A tak z\u016fstali dva kandid\u00e1ti: NATS Streaming a Apache Kafka. Ob\u011b \u0159e\u0161en\u00ed jsme d\u016fkladn\u011b prozkoumali a ob\u011b vyhovovala \u00fakolu. Nakonec n\u00e1s v\u0161ak znepokojila relativn\u00ed mladost NATS Streaming (a to, \u017ee jeden z hlavn\u00edch v\u00fdvoj\u00e1\u0159\u016f, Tyler Treat, se rozhodl projekt opustit a za\u010d\u00edt sv\u016fj vlastn\u00ed \u2014 Liftbridge). Z\u00e1rove\u0148 re\u017eim clusteringu NATS Streaming nenab\u00edzel siln\u00e9 horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed (pravd\u011bpodobn\u011b to u\u017e nen\u00ed probl\u00e9m po p\u0159id\u00e1n\u00ed particionov\u00e1n\u00ed v roce 2017).<\/p>\n<p><\/p>\n<p>Nicm\u00e9n\u011b, NATS Streaming je skv\u011bl\u00e1 technologie napsan\u00e1 v Go a m\u00e1 podporu Cloud Native Computing Foundation. Na rozd\u00edl od Apache Kafka nepot\u0159ebuje Zookeeper k fungov\u00e1n\u00ed (mo\u017en\u00e1, <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum\">brzy bude mo\u017en\u00e9 \u0159\u00edct to sam\u00e9 i o Kafce<\/a><\/noindex>), proto\u017ee vnit\u0159n\u011b implementuje RAFT. P\u0159itom je NATS Streaming jednodu\u0161\u0161\u00ed na administraci. Nevyj\u0161ujeme, \u017ee se k t\u00e9to technologii budeme v budoucnu je\u0161t\u011b vracet. <\/p>\n<p><\/p>\n<p>A p\u0159esto dnes na\u0161\u00edm v\u00edt\u011bzem z\u016fst\u00e1v\u00e1 Apache Kafka. Na na\u0161ich testech se uk\u00e1zala jako dost rychl\u00e1 (v\u00edce ne\u017e milion zpr\u00e1v za sekundu p\u0159i \u010dten\u00ed a z\u00e1pisu s objemem zpr\u00e1vy 1 kilobajt), dostate\u010dn\u011b spolehliv\u00e1, dob\u0159e \u0161k\u00e1lovateln\u00e1 a ov\u011b\u0159en\u00e1 ve v\u00fdrob\u011b velk\u00fdmi spole\u010dnostmi. Krom\u011b toho Kafka podporuje alespo\u0148 n\u011bkolik velk\u00fdch komer\u010dn\u00edch spole\u010dnost\u00ed (nap\u0159\u00edklad pou\u017e\u00edv\u00e1me verzi Confluent) a Kafka m\u00e1 rozvinut\u00fd ekosyst\u00e9m.<br \/>\n<br clear=\"left\">\n <\/p>\n<p><\/p>\n<h1 id=\"obzor-kafka\">P\u0159ehled Kafky<\/h1>\n<p><\/p>\n<p>Ne\u017e za\u010dnete, doporu\u010duji skv\u011blou knihu \u2014 <em>\u201eKafka: The Definitive Guide\u201c<\/em> (je tak\u00e9 v rusk\u00e9m p\u0159ekladu, ale terminologie trochu mate). M\u016f\u017eete v n\u00ed naj\u00edt informace pot\u0159ebn\u00e9 pro z\u00e1kladn\u00ed pochopen\u00ed Kafky a dokonce i n\u011bco v\u00edc. Samotn\u00e1 dokumentace od Apache a blog od Confluent jsou tak\u00e9 skv\u011ble naps\u00e1ny a snadno se \u010dtou. <\/p>\n<p><\/p>\n<p>Tak se pod\u00edvejme, jak Kafka funguje z pta\u010d\u00ed perspektivy. Z\u00e1kladn\u00ed topologie Kafky se skl\u00e1d\u00e1 z producer, consumer, broker a zookeeper.<\/p>\n<p><\/p>\n<h3 id=\"broker\">Brokers<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/82f34b5a1aadcdc07eef58eb5414b553.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za ukl\u00e1d\u00e1n\u00ed va\u0161ich dat odpov\u00edd\u00e1 broker. V\u0161echna data jsou uchov\u00e1v\u00e1na v bin\u00e1rn\u00ed podob\u011b a broker m\u00e1 malou znalost o tom, co p\u0159edstavuj\u00ed a jak\u00e1 je jejich struktura. <\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd logick\u00fd typ ud\u00e1losti obvykle s\u00eddl\u00ed ve sv\u00e9m samostatn\u00e9m topiku. Nap\u0159\u00edklad ud\u00e1lost vytvo\u0159en\u00ed inzer\u00e1tu m\u016f\u017ee pat\u0159it do topiku item.created, zat\u00edmco ud\u00e1lost jeho zm\u011bny do item.changed. Topiky lze pova\u017eovat za klasifik\u00e1tory ud\u00e1lost\u00ed. Na \u00farovni topiku lze nastavit takov\u00e9 konfigura\u010dn\u00ed parametry, jako jsou: <\/p>\n<p><\/p>\n<ul>\n<li>objem uchov\u00e1van\u00fdch dat a\/nebo jejich st\u00e1\u0159\u00ed (retention.bytes, retention.ms); <\/li>\n<li>faktor redundance dat (replication factor);<\/li>\n<li>maxim\u00e1ln\u00ed velikost jedn\u00e9 zpr\u00e1vy (max.message.bytes);<\/li>\n<li>minim\u00e1ln\u00ed po\u010det shodn\u00fdch replik, p\u0159i kter\u00e9m lze do topiku zapisovat data (min.insync.replicas);<\/li>\n<li>mo\u017enost prov\u00e9st failover na nesynchronizovanou zaost\u00e1vaj\u00edc\u00ed repliku s potenci\u00e1ln\u00ed ztr\u00e1tou dat (unclean.leader.election.enable);<\/li>\n<li>a je\u0161t\u011b mnoho dal\u0161\u00edch (<noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#topicconfigs\">https:\/\/kafka.apache.org\/documentation\/#topicconfigs<\/a><\/noindex>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Na opl\u00e1tku se ka\u017ed\u00fd topik d\u011bl\u00ed na jednu nebo v\u00edce parti\u00ed. Pr\u00e1v\u011b do parti\u00ed nakonec ud\u00e1losti p\u0159ich\u00e1zej\u00ed. Pokud je v clusteru v\u00edce ne\u017e jeden broker, budou partitiony rovnom\u011brn\u011b rozlo\u017eeny mezi v\u0161echny brokery (co nejv\u00edce to p\u016fjde), co\u017e umo\u017en\u00ed \u0161k\u00e1lov\u00e1n\u00ed z\u00e1t\u011b\u017ee na z\u00e1pis a \u010dten\u00ed v jednom topiku na v\u00edce brokerech najednou.<\/p>\n<p><\/p>\n<p>Na disku jsou data pro ka\u017edou partition uchov\u00e1v\u00e1na ve form\u011b segmentov\u00fdch soubor\u016f, kter\u00e9 maj\u00ed ve v\u00fdchoz\u00edm nastaven\u00ed velikost jednoho gigabajtu (kontrolov\u00e1no p\u0159es log.segment.bytes). D\u016fle\u017eit\u00fd rys \u2014 odstra\u0148ov\u00e1n\u00ed dat z parti\u00ed (p\u0159i vypr\u0161en\u00ed retention) prob\u00edh\u00e1 pr\u00e1v\u011b po segmentech (nelze odstranit jednu ud\u00e1lost z parti\u00ed, lze odstranit pouze cel\u00fd segment, a to pouze neaktivn\u00ed).<\/p>\n<p><\/p>\n<h3 id=\"zookeeper\">Zookeeper<\/h3>\n<p><\/p>\n<p>Zookeeper funguje jako \u00falo\u017ei\u0161t\u011b metadat a koordin\u00e1tor. Pr\u00e1v\u011b on m\u016f\u017ee \u0159\u00edci, zda jsou brok\u0159i \u017eiv\u00ed (na to se d\u00e1 pod\u00edvat o\u010dima zookeeper pomoc\u00ed p\u0159\u00edkazu <code>ls \/brokers\/ids<\/code>), kter\u00fd z broker\u016f je kontroler (<code>get \/controller<\/code>), jsou partitiony ve synchronn\u00edm stavu se sv\u00fdmi replikami (<code>get \/brokers\/topics\/topic_name\/partitions\/partition_number\/state<\/code>). Tak\u00e9 k zookeeperu nejprve zam\u00ed\u0159\u00ed producer a consumer, aby zjistili, na kter\u00e9m brokeru se nach\u00e1zej\u00ed jak\u00e9 topiky a partitiony. V p\u0159\u00edpadech, kdy je pro topik nastaven replication factor vy\u0161\u0161\u00ed ne\u017e 1, zookeeper ur\u010d\u00ed, kter\u00e9 partitiony jsou l\u00eddry (do nich se bude zapisovat a z nich tak\u00e9 bude prob\u00edhat \u010dten\u00ed). V p\u0159\u00edpad\u011b p\u00e1du brokeru bude v zookeeperu zaznamen\u00e1na informace o nov\u00fdch leader-partition\u00e1ch (od verze 1.1.0 asynchronn\u011b, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.confluent.io\/blog\/apache-kafka-supports-200k-partitions-per-cluster\">a to je d\u016fle\u017eit\u00e9<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>Ve star\u0161\u00edch verz\u00edch Kafka zookeeper tak\u00e9 odpov\u00eddal za ukl\u00e1d\u00e1n\u00ed offset\u016f, ale nyn\u00ed jsou ulo\u017eeny ve speci\u00e1ln\u00edm topiku <code>__consumer_offsets<\/code> na brokeru (i kdy\u017e st\u00e1le m\u016f\u017eete zookeeper pou\u017e\u00edvat k t\u011bmto \u00fa\u010del\u016fm). <\/p>\n<p><\/p>\n<p>Nejjednodu\u0161\u0161\u00ed zp\u016fsob, jak prom\u011bnit va\u0161e data v d\u00fdni, je ztr\u00e1ta informac\u00ed ze zookeeperu. V takov\u00e9m sc\u00e9n\u00e1\u0159i bude velmi obt\u00ed\u017en\u00e9 pochopit, co a odkud je t\u0159eba \u010d\u00edst. <\/p>\n<p><\/p>\n<h3 id=\"producer\">Producent<\/h3>\n<p><\/p>\n<p>Producer je nej\u010dast\u011bji slu\u017eba, kter\u00e1 prov\u00e1d\u00ed p\u0159\u00edm\u00e9 zapisov\u00e1n\u00ed dat do Apache Kafka. Producer vyb\u00edr\u00e1 topik, ve kter\u00e9m budou ulo\u017eeny jeho tematick\u00e9 zpr\u00e1vy, a za\u010d\u00edn\u00e1 do n\u011bj zapisovat informace. Nap\u0159\u00edklad producentem m\u016f\u017ee b\u00fdt slu\u017eba pro inzer\u00e1ty. V takov\u00e9m p\u0159\u00edpad\u011b bude odes\u00edlat do tematick\u00fdch topik\u016f takov\u00e9 ud\u00e1losti, jako \"inzer\u00e1t vytvo\u0159en\", \"inzer\u00e1t aktualizov\u00e1n\", \"inzer\u00e1t smaz\u00e1n\" atd. Ka\u017ed\u00e1 ud\u00e1lost p\u0159itom p\u0159edstavuje p\u00e1r kl\u00ed\u010d-hodnota.<\/p>\n<p><\/p>\n<p>Ve v\u00fdchoz\u00edm nastaven\u00ed se v\u0161echny ud\u00e1losti rozd\u011bluj\u00ed mezi partitiony topiku round-robinem, pokud nen\u00ed zad\u00e1n kl\u00ed\u010d (ztr\u00e1c\u00ed se po\u0159ad\u00ed), a pomoc\u00ed MurmurHash (kl\u00ed\u010d), pokud kl\u00ed\u010d existuje (po\u0159ad\u00ed v r\u00e1mci jedn\u00e9 partition).<\/p>\n<p><\/p>\n<p>Je zde t\u0159eba hned poznamenat, \u017ee Kafka zaru\u010duje po\u0159ad\u00ed ud\u00e1lost\u00ed pouze v r\u00e1mci jedn\u00e9 partition. Ale ve skute\u010dnosti to \u010dasto nen\u00ed probl\u00e9m. Nap\u0159\u00edklad lze zaru\u010den\u011b p\u0159id\u00e1vat v\u0161echny zm\u011bny jednoho a t\u00e9ho\u017e inzer\u00e1tu do jedn\u00e9 partition (t\u00edm se zachov\u00e1v\u00e1 po\u0159ad\u00ed t\u011bchto zm\u011bn v r\u00e1mci inzer\u00e1tu). Tak\u00e9 je mo\u017en\u00e9 p\u0159ed\u00e1vat po\u0159adov\u00e9 \u010d\u00edslo v jednom z pol\u00ed ud\u00e1losti.<\/p>\n<p><\/p>\n<h3 id=\"consumer\">Consumer<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/1f69a53dc19bb6c587883b8754cde29f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Consumer odpov\u00edd\u00e1 za z\u00edsk\u00e1v\u00e1n\u00ed dat z Apache Kafka. Pokud se vr\u00e1t\u00edme k v\u00fd\u0161e uveden\u00e9mu p\u0159\u00edkladu, consumer m\u016f\u017ee b\u00fdt moderac\u00ed slu\u017eby. Tato slu\u017eba se p\u0159ihl\u00e1s\u00ed k t\u00e9matu slu\u017eby inzer\u00e1t\u016f a p\u0159i p\u0159id\u00e1n\u00ed nov\u00e9ho inzer\u00e1tu ho obdr\u017e\u00ed a analyzuje z hlediska souladu s ur\u010dit\u00fdmi stanoven\u00fdmi politikami.<\/p>\n<p><\/p>\n<p>Apache Kafka si pam\u011bt\u00e1, jak\u00e9 posledn\u00ed ud\u00e1losti consumer obdr\u017eel (k tomu se pou\u017e\u00edv\u00e1 pomocn\u00e9 t\u00e9ma <code>__consumer__offsets<\/code>), co\u017e zaji\u0161\u0165uje, \u017ee p\u0159i \u00fasp\u011b\u0161n\u00e9m \u010dten\u00ed consumer neobdr\u017e\u00ed stejnou zpr\u00e1vu dvakr\u00e1t. Nicm\u00e9n\u011b, pokud se pou\u017eije volba enable.auto.commit = true a \u00fapln\u011b se sv\u011b\u0159uje sledov\u00e1n\u00ed polohy consumer v t\u00e9matu Kafce, m\u016f\u017ee doj\u00edt k <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.newrelic.com\/engineering\/kafka-consumer-config-auto-commit-data-loss\/\">ztr\u00e1t\u011b dat<\/a><\/noindex>. V produk\u010dn\u00edm k\u00f3du se v\u011bt\u0161inou poloha consumera kontroluje ru\u010dn\u011b (v\u00fdvoj\u00e1\u0159 \u0159\u00edd\u00ed okam\u017eik, kdy mus\u00ed doj\u00edt k potvrzen\u00ed p\u0159e\u010dten\u00e9 ud\u00e1losti).<\/p>\n<p><\/p>\n<p>V p\u0159\u00edpadech, kdy jeden consumer nesta\u010d\u00ed (nap\u0159\u00edklad kdy\u017e je proud nov\u00fdch ud\u00e1lost\u00ed velmi velk\u00fd), lze p\u0159idat n\u011bkolik dal\u0161\u00edch consumer\u016f, kter\u00e9 spoj\u00edme do consumer group. Consumer group logicky p\u0159edstavuje stejn\u00fd consumer, ale s rozd\u011blen\u00edm dat mezi \u010dleny skupiny. To umo\u017e\u0148uje ka\u017ed\u00e9mu z \u00fa\u010dastn\u00edk\u016f vz\u00edt si sv\u016fj d\u00edl zpr\u00e1v, \u010d\u00edm\u017e se zvy\u0161uje rychlost \u010dten\u00ed. <\/p>\n<p><\/p>\n<h1 id=\"rezultaty-testirovaniya\">V\u00fdsledky testov\u00e1n\u00ed<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/f7abe4bcf34fdb0d762c8a928bd873ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tady nebudu ps\u00e1t moc vysv\u011btluj\u00edc\u00edho textu, prost\u011b se s v\u00e1mi pod\u011bl\u00edm o z\u00edskan\u00e9 v\u00fdsledky. Testov\u00e1n\u00ed bylo provedeno na 3 fyzick\u00fdch stroj\u00edch (12 CPU, 384 GB RAM, 15k SAS DISK, 10 GBit\/s s\u00ed\u0165), co\u017e zahrnovalo brokery a zookeeper nasazen\u00e9 v lxc. <\/p>\n<p><\/p>\n<p><strong>Testov\u00e1n\u00ed v\u00fdkonu<\/strong><\/p>\n<p><\/p>\n<p>B\u011bhem testov\u00e1n\u00ed byly z\u00edsk\u00e1ny n\u00e1sleduj\u00edc\u00ed v\u00fdsledky.<\/p>\n<p><\/p>\n<ul>\n<li>Rychlost z\u00e1pisu zpr\u00e1v o velikosti 1 KB sou\u010dasn\u011b 9 producenty \u2013 1300000 ud\u00e1lost\u00ed za sekundu.<\/li>\n<li>Rychlost \u010dten\u00ed zpr\u00e1v o velikosti 1 KB sou\u010dasn\u011b 9 consumery \u2013 1500000 ud\u00e1lost\u00ed za sekundu.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Testov\u00e1n\u00ed odolnosti proti chyb\u00e1m<\/strong><\/p>\n<p><\/p>\n<p>B\u011bhem testov\u00e1n\u00ed byly z\u00edsk\u00e1ny n\u00e1sleduj\u00edc\u00ed v\u00fdsledky (3 brokery, 3 zookeepery).<\/p>\n<p><\/p>\n<ul>\n<li>Nep\u0159edv\u00eddan\u00e9 ukon\u010den\u00ed jednoho z broker\u016f nevede k zastaven\u00ed nebo nedostupnosti clusteru. Pr\u00e1ce pokra\u010duje v b\u011b\u017en\u00e9m re\u017eimu, ale na zb\u00fdvaj\u00edc\u00ed brokery je kladena v\u011bt\u0161\u00ed z\u00e1t\u011b\u017e.<\/li>\n<li>Nehodov\u00e9 ukon\u010den\u00ed dvou broker\u016f ve t\u0159echbrokerov\u00e9m clusteru s min.isr = 2 vede k nedostupnosti clusteru pro z\u00e1pis, ale k dostupnosti pro \u010dten\u00ed. V p\u0159\u00edpad\u011b, \u017ee min.isr = 1, cluster z\u016fst\u00e1v\u00e1 dostupn\u00fd jak pro \u010dten\u00ed, tak pro z\u00e1pis. Tento re\u017eim v\u0161ak odporuje po\u017eadavku na vysokou spolehlivost dat.<\/li>\n<li>Nehodov\u00e9 ukon\u010den\u00ed jednoho ze server\u016f Zookeeper nevede k zastaven\u00ed nebo nedostupnosti clusteru. Pr\u00e1ce pokra\u010duje norm\u00e1ln\u011b.<\/li>\n<li>Nehodov\u00e9 ukon\u010den\u00ed dvou server\u016f Zookeeper vede k nedostupnosti clusteru do obnoven\u00ed provozu alespo\u0148 jednoho ze server\u016f Zookeeper. Toto tvrzen\u00ed plat\u00ed pro cluster Zookeeper se t\u0159emi servery. V d\u016fsledku v\u00fdzkumu bylo rozhodnuto zv\u00fd\u0161it cluster Zookeeper na 5 server\u016f pro zv\u00fd\u0161en\u00ed odolnosti proti chyb\u00e1m. <br clear=\"left\">\n <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"kafka-as-a-service\">Kafka jako slu\u017eba<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka a mikroservisy: p\u0159ehled\" src=\"\/wp-content\/uploads\/2019\/09\/19b2356131203cefbadfd90a25ae9674.png\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Ujistili jsme se, \u017ee Kafka je skv\u011bl\u00e1 technologie, kter\u00e1 n\u00e1m pomohla vy\u0159e\u0161it uveden\u00fd \u00fakol (implementaci brokeru zpr\u00e1v). Rozhodli jsme se v\u0161ak zak\u00e1zat slu\u017eb\u00e1m p\u0159\u00edm\u00fd p\u0159\u00edstup k Kafce a uzav\u0159eli jsme ji nad slu\u017ebou data-bus. Pro\u010d jsme to ud\u011blali? Odpov\u011bd\u00ed je n\u011bkolik d\u016fvod\u016f.<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Data-bus p\u0159evzal v\u0161echny \u00fakoly spojen\u00e9 s integrac\u00ed s Kafkou (implementace a nastaven\u00ed consumer\u016f a producer\u016f, monitorov\u00e1n\u00ed, alerting, logov\u00e1n\u00ed, \u0161k\u00e1lov\u00e1n\u00ed apod.). Integrace s brokerem zpr\u00e1v prob\u00edh\u00e1 t\u00edmto zp\u016fsobem co nejjednodu\u0161eji. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus umo\u017enil abstrahovat od konkr\u00e9tn\u00edho jazyka nebo knihovny pro pr\u00e1ci s Kafkou. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus umo\u017enil ostatn\u00edm slu\u017eb\u00e1m abstrahovat od \u00falo\u017en\u00e9ho slLayeru. Mo\u017en\u00e1 v n\u011bjak\u00e9m okam\u017eiku vym\u011bn\u00edme Kafku za Pulsar a nikdo si ni\u010deho nev\u0161imne (v\u0161echny slu\u017eby znaj\u00ed pouze API data-bus).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus p\u0159evzal validaci sch\u00e9mat ud\u00e1lost\u00ed.<\/p>\n<p>\n<\/li>\n<li>\n<p>S pomoc\u00ed data-bus byla implementov\u00e1na autentizace.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pod ochranou data-bus m\u016f\u017eeme bez prostoj\u016f a nen\u00e1padn\u011b aktualizovat verze Kafky a centralizovan\u011b spravovat konfigurace producer\u016f, consumer\u016f, broker\u016f atd.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus umo\u017enil p\u0159id\u00e1n\u00ed pot\u0159ebn\u00fdch funkc\u00ed, kter\u00e9 v Kafce nejsou (nap\u0159\u00edklad audit t\u00e9mat, sledov\u00e1n\u00ed anom\u00e1li\u00ed v clusteru, vytv\u00e1\u0159en\u00ed DLQ atd.).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus umo\u017e\u0148uje implementaci failoveru centralizovan\u011b pro v\u0161echny slu\u017eby.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>V sou\u010dasn\u00e9 dob\u011b sta\u010d\u00ed p\u0159ipojit malou knihovnu do k\u00f3du va\u0161eho servisu, aby bylo mo\u017en\u00e9 za\u010d\u00edt odes\u00edlat ud\u00e1losti do zprost\u0159edkovatele zpr\u00e1v. To je v\u0161e. Z\u00edsk\u00e1v\u00e1te mo\u017enost ps\u00e1t, \u010d\u00edst a \u0161k\u00e1lovat pomoc\u00ed jedin\u00e9 \u0159\u00e1dky k\u00f3du. Cel\u00e1 implementace je pro v\u00e1s skryt\u00e1, venku vystupuj\u00ed pouze n\u011bkter\u00e9 \u00fapravy typu velikosti d\u00e1vky. Pod kapotou slu\u017eba data-bus zved\u00e1 v Kubernetes pot\u0159ebn\u00fd po\u010det instanc\u00ed producent\u016f a spot\u0159ebitel\u016f a dod\u00e1v\u00e1 jim pot\u0159ebnou konfiguraci, ale to v\u0161e je pro v\u00e1\u0161 servis pr\u016fhledn\u00e9. <\/p>\n<p><\/p>\n<p>Samoz\u0159ejm\u011b, neexistuje \u017e\u00e1dn\u00fd st\u0159\u00edbrn\u00fd kulka a tento p\u0159\u00edstup m\u00e1 sv\u00e1 omezen\u00ed.<\/p>\n<p><\/p>\n<ul>\n<li>Data-bus je t\u0159eba udr\u017eovat vlastn\u00edmi silami, na rozd\u00edl od t\u0159et\u00edmi stranami dod\u00e1van\u00fdch knihoven.<\/li>\n<li>Data-bus zvy\u0161uje po\u010det interakc\u00ed mezi slu\u017ebami a zprost\u0159edkovatelem zpr\u00e1v, co\u017e vede ke sn\u00ed\u017een\u00ed v\u00fdkonu ve srovn\u00e1n\u00ed s holou Kafkou.<\/li>\n<li>Ne v\u0161echno lze tak snadno skr\u00fdt p\u0159ed slu\u017ebami, duplicita funkc\u00ed KSQL nebo Kafka Streams v data-bus se n\u00e1m nechce, proto n\u011bkdy mus\u00edme povolit slu\u017eb\u00e1m p\u0159istupovat p\u0159\u00edmo. <\/li>\n<\/ul>\n<p><\/p>\n<p>V na\u0161em p\u0159\u00edpad\u011b p\u0159eva\u017eovaly v\u00fdhody nad nev\u00fdhodami a rozhodnut\u00ed skr\u00fdt zprost\u0159edkovatele zpr\u00e1v pod zvl\u00e1\u0161tn\u00ed slu\u017ebou se osv\u011bd\u010dilo. Za rok provozu jsme nem\u011bli \u017e\u00e1dn\u00e9 v\u00e1\u017en\u00e9 hav\u00e1rie ani probl\u00e9my.<\/p>\n<p><\/p>\n<p>P.S. D\u011bkuji sv\u00e9 p\u0159\u00edtelkyni, Ekaterin\u011b Obalajev\u011b, za skv\u011bl\u00e9 obr\u00e1zky k tomuto \u010dl\u00e1nku. Pokud se v\u00e1m l\u00edbily, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.instagram.com\/o.k_o.k_\/\">tady<\/a><\/noindex> najde se je\u0161t\u011b v\u00edce ilustrac\u00ed.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/465315\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432 \u0410\u0432\u0438\u0442\u043e \u0434\u0435\u0432\u044f\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Kafka, \u0438 \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u041f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u0435\u0439\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043b\u044e\u0441\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Kafka as a Service. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28406,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37849","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\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\/kafka-i-mikroservisy-obzor\" \/>\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\udd47Kafka \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b: \u043e\u0431\u0437\u043e\u0440 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor\" \/>\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=\"2019-10-31T19:20:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:09+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\udd47Kafka a mikroservisy: p\u0159ehled | ProHoster","description":"Ahoj v\u0161ichni.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","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\udd47Kafka \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b: \u043e\u0431\u0437\u043e\u0440 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","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":"2019-10-31T19:20:09+00:00","article:modified_time":"2019-10-31T19:20:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37849","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":"2026-01-23 19:31:03","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:19:23","updated":"2026-01-23 19:31:03","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\/37849","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=37849"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/37849\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/28406"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=37849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=37849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=37849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}