{"id":54431,"date":"2019-12-26T00:00:00","date_gmt":"2019-12-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-kafka-stala-bylyu"},"modified":"2020-02-18T14:02:26","modified_gmt":"2020-02-18T11:02:26","slug":"kak-kafka-stala-bylyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Hvordan Kafka blev en realitet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Hvordan Kafka blev en realitet\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hello, Habr!<\/p>\n<p><\/p>\n<p>Jeg arbejder i Tinkoff-teamet, der udvikler vores egen notifikationscentral. St\u00f8rstedelen af tiden arbejder jeg med Java ved hj\u00e6lp af Spring Boot og l\u00f8ser forskellige tekniske udfordringer, der opst\u00e5r i projektet.<\/p>\n<p><\/p>\n<p>De fleste af vores mikrotjenester interagerer asynkront med hinanden gennem en beskedbroker. Tidligere anvendte vi IBM MQ som broker, men den kunne ikke l\u00e6ngere h\u00e5ndtere belastningen, selvom den havde h\u00f8je leveringsgarantier.<\/p>\n<p><\/p>\n<p>Som erstatning blev Apache Kafka foresl\u00e5et, som har et h\u00f8jt skaleringspotentiale, men desv\u00e6rre kr\u00e6ver en n\u00e6sten individuel tilgang til konfiguration til forskellige scenarier. Desuden gjorde mekanismen for 'at least once delivery', som fungerer i Kafka som standard, det ikke muligt at opretholde det n\u00f8dvendige konsistensniveau lige ud af boksen. Her vil jeg dele vores erfaring med konfiguration af Kafka, is\u00e6r hvordan man ops\u00e6tter og lever med 'exactly once delivery'.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Garanteret levering og mere til<\/h2>\n<p><\/p>\n<p>De parametre, der vil blive diskuteret her, vil hj\u00e6lpe med at forhindre en r\u00e6kke problemer med de standardforbindelsesindstillinger. Men f\u00f8rst vil jeg gerne fokusere p\u00e5 \u00e9n parameter, der vil lette mulig debugging.<\/p>\n<p><\/p>\n<p>Det vil hj\u00e6lpe med <strong>client.id<\/strong> for Producer og Consumer. Ved f\u00f8rste \u00f8jekast kan applikationens navn bruges som v\u00e6rdi, og i de fleste tilf\u00e6lde vil det fungere. Men situationen, hvor flere Consumers bruger det samme client.id i applikationen, vil resultere i f\u00f8lgende advarsel:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Fejl ved registrering af AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Hvis du vil bruge JMX i en applikation med Kafka, kan det v\u00e6re et problem. I dette tilf\u00e6lde er det bedst at bruge en kombination af applikationens navn og for eksempel emnets navn som v\u00e6rdien for client.id. Resultatet af vores konfiguration kan ses i output fra kommandoen <strong>kafka-consumer-groups<\/strong> fra Confluents v\u00e6rkt\u00f8jer:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Kafka blev en realitet\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu lad os gennemg\u00e5 scenariet for garanteret levering af beskeder. En Kafka Producer har parameteren <strong>acks<\/strong>, som giver mulighed for at indstille, efter hvor mange acknowledged, lederen af klyngen skal betragte beskeden som vellykket skrevet. Denne parameter kan antage f\u00f8lgende v\u00e6rdier:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 acknowledgments vil ikke blive talt med.<\/li>\n<li>1 \u2014 standard parameter, acknowledgment is only required from 1 replica.<\/li>\n<li>\u22121 \u2014 acknowledgment is required from all synchronized replicas (cluster configuration <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>From the listed values, it is clear that an acks value of \u22121 provides the strongest guarantees that the message will not be lost. <\/p>\n<p><\/p>\n<p>As we all know, distributed systems are unreliable. To protect against temporary failures, the Kafka Producer provides the parameter <strong>retries<\/strong>, which allows you to set the number of retry attempts within <strong>delivery.timeout.ms<\/strong>. Since the retries parameter has a default value of Integer.MAX_VALUE (2147483647), the number of message retries can be regulated by changing only the delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Now let's move on to exactly once delivery.<\/h2>\n<p><\/p>\n<p>The listed settings allow our Producer to deliver messages with high assurance. Now let's talk about how to guarantee the writing of only one copy of a message to a Kafka topic. In the simplest case, the Producer needs to set the parameter <strong>enable.idempotence<\/strong> to true. Idempotence guarantees that only one message will be written to a specific partition of one topic. The prerequisites for enabling idempotence are the values <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. If these parameters are not set by the developer, the specified values will be applied automatically.<\/p>\n<p><\/p>\n<p>When idempotence is configured, it is necessary to ensure that identical messages always end up in the same partitions. This can be done by configuring the key and the partitioner.class parameter on the Producer. Let's start with the key. It must be the same for each send operation. This is easily achieved by using some business identifier from the original message. The partitioner.class parameter has a default value of <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apache\/kafka\/blob\/trunk\/clients\/src\/main\/java\/org\/apache\/kafka\/clients\/producer\/internals\/DefaultPartitioner.java\">DefaultPartitioner<\/a><\/noindex>. With this default partitioning strategy, we proceed as follows:<\/p>\n<p><\/p>\n<ul>\n<li>If the partition is explicitly specified when sending a message, we use it.<\/li>\n<li>If the partition is not specified but a key is provided \u2014 we choose the partition based on the hash of the key.<\/li>\n<li>If neither the partition nor the key is specified \u2014 we choose partitions in a round-robin manner.<\/li>\n<\/ul>\n<p><\/p>\n<p>Additionally, using the key and idempotent sending with the parameter <strong>max.in.flight.requests.per.connection = 1<\/strong> giver dig systematisk behandling af meddelelser p\u00e5 Consumer. Det er vigtigt at huske, at hvis der er indstillet adgangskontrol p\u00e5 dit cluster, vil du have brug for rettigheder til idempotent skrivning til emnet.<\/p>\n<p><\/p>\n<p>Hvis du pludselig mangler muligheder for idempotent afsendelse efter n\u00f8gle, eller logikken p\u00e5 Producer-siden kr\u00e6ver, at dataenes konsistens bevares mellem forskellige partitioner, vil transaktioner hj\u00e6lpe. Derudover kan k\u00e6detransaktioner betinget synkronisere skrivning i Kafka, for eksempel med skrivning til databasen. For at aktivere transaktionel afsendelse p\u00e5 Produceren skal den v\u00e6re idempotent og yderligere angive <strong>transactional.id<\/strong>. Hvis der er indstillet adgangskontrol p\u00e5 dit Kafka-cluster, kr\u00e6ves der ogs\u00e5 skriveadgang for transaktionelle skrivninger, ligesom for idempotente, som kan gives baseret p\u00e5 en maske ved hj\u00e6lp af v\u00e6rdien, der er gemt i transactional.id.<\/p>\n<p><\/p>\n<p>Formelt kan enhver streng bruges som transaktions-id, for eksempel applikationens navn. Men hvis du k\u00f8rer flere instanser af den samme applikation med det samme transactional.id, vil den f\u00f8rste k\u00f8rte instans blive stoppet med en fejl, da Kafka vil betragte den som en zombie-proces. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producer fors\u00f8gte en operation med en gammel epoch. Enten er der en nyere producer med det samme transactionalId, eller ogs\u00e5 er producerens transaktion udl\u00f8bet af broker'en.<\/code><\/pre>\n<p><\/p>\n<p>For at l\u00f8se dette problem tilf\u00f8jer vi et suffiks til applikationens navn i form af v\u00e6rtens navn, som vi f\u00e5r fra milj\u00f8variabler. <\/p>\n<p><\/p>\n<p>Produceren er indstillet, men transaktioner i Kafka styrer kun meddelelsens synlighed. Uanset transaktionens status kommer meddelelsen straks ind i emnet, men har ekstra systemattributter.<\/p>\n<p><\/p>\n<p>For at sikre, at disse meddelelser ikke l\u00e6ses af Consumer for tidligt, skal det indstille parameteren <strong>isolation.level<\/strong> til v\u00e6rdien read_committed. En s\u00e5dan Consumer kan l\u00e6se ikke-transaktionelle meddelelser som f\u00f8r, mens transaktionelle kun kan l\u00e6ses efter commit-ing.<br \/>\nHvis du har indstillet alle de f\u00f8rn\u00e6vnte indstillinger, s\u00e5 har du konfigureret exactly once delivery. Tillykke!<\/p>\n<p><\/p>\n<p>Men der er endnu en detalje. Transactional.id, som vi indstillede ovenfor, er faktisk et pr\u00e6fiks for transaktionen. Til transaktionsmanageren tilf\u00f8jes et serienummer. Den resulterende identifikator udstedes p\u00e5 <strong>transactional.id.expiration.ms<\/strong>, som er konfigureret p\u00e5 et Kafka-kluster og har en standardv\u00e6rdi p\u00e5 \"7 dage\". Hvis applikationen ikke har modtaget nogen meddelelser i denne periode, vil du ved n\u00e6ste transaktionelle forsendelse opleve <strong>InvalidPidMappingException<\/strong>. Efter dette vil transaktionskoordinatoren udstede et nyt sekventielt nummer til den n\u00e6ste transaktion. Meddelelser kan dog g\u00e5 tabt, hvis InvalidPidMappingException ikke h\u00e5ndteres korrekt. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">I stedet for resultater<\/h2>\n<p><\/p>\n<p>Som man kan se, er det ikke nok blot at sende meddelelser til Kafka. Man skal v\u00e6lge kombinationen af parametre og v\u00e6re parat til at foretage hurtige \u00e6ndringer. I denne artikel har jeg fors\u00f8gt at beskrive ops\u00e6tningen af exactly once delivery detaljeret og beskrive nogle problemer med konfigurationer af client.id og transactional.id, som vi st\u00f8dte p\u00e5. Nedenfor er ops\u00e6tningerne for Producer og Consumer pr\u00e6senteret kort.<\/p>\n<p><\/p>\n<p>Producer:<\/p>\n<p><\/p>\n<ol>\n<li>acks = all<\/li>\n<li>retries &gt; 0<\/li>\n<li>enable.idempotence = true<\/li>\n<li>max.in.flight.requests.per.connection \u2264 5 (1 \u2014 for ordnet forsendelse)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Consumer:<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>For at minimere fejl i fremtidige applikationer har vi lavet vores egen indpakning over spring-konfigurationen, hvor v\u00e6rdierne for nogle af de n\u00e6vnte parametre allerede er angivet.<\/p>\n<p><\/p>\n<p>Her er et par materialer til selvstudium:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging\">KIP-98 \u2014 Exactly Once Delivery and Transactional Messaging<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#configuration\">Beskrivelse af indstillingerne <\/a><\/noindex><\/li>\n<\/ul>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/481784\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54431","post","type-post","status-publish","format-standard","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=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\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\/da\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\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-12-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:26+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\udd47Hvordan Kafka blev virkelighed | ProHoster","description":"Hej, Habr! Jeg arbejder i Tinkoff-teamet.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-kafka-stala-bylyu","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-12-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54431","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-24 11:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:06:37","updated":"2026-01-24 11:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}