{"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\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Wie Kafka Realit\u00e4t wurde","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wie Kafka Realit\u00e4t wurde\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo, Habra!<\/p>\n<p><\/p>\n<p>Ich arbeite im Team von Tinkoff, das f\u00fcr die Entwicklung unseres eigenen Benachrichtigungszentrums zust\u00e4ndig ist. Haupts\u00e4chlich entwickle ich in Java unter Verwendung von Spring Boot und l\u00f6se verschiedene technische Probleme, die im Projekt auftreten.<\/p>\n<p><\/p>\n<p>Die meisten unserer Mikrodienste wirken asynchron \u00fcber einen Nachrichtenbroker miteinander. Fr\u00fcher verwendeten wir IBM MQ als Broker, der mit der Last \u00fcberfordert war, aber hohe Liefergarantien bot.<\/p>\n<p><\/p>\n<p>Als Ersatz wurde uns Apache Kafka vorgeschlagen, das \u00fcber ein hohes Skalierungspotenzial verf\u00fcgt, aber leider einen nahezu individuellen Ansatz zur Konfiguration f\u00fcr verschiedene Szenarien erfordert. Dar\u00fcber hinaus erlaubte der standardm\u00e4\u00dfig in Kafka arbeitende Mechanismus der einmaligen Lieferung nicht, den erforderlichen Konsistenzgrad sofort zu gew\u00e4hrleisten. Im Folgenden werde ich unsere Erfahrungen mit der Konfiguration von Kafka teilen, insbesondere wie man genau einmalige Lieferungen einrichtet und damit umgeht.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Garantierte Lieferung und noch mehr<\/h2>\n<p><\/p>\n<p>Die im Folgenden besprochenen Parameter helfen, eine Reihe von Problemen mit den Standardverbindungseinstellungen zu verhindern. Zun\u00e4chst m\u00f6chte ich jedoch auf einen Parameter hinweisen, der das m\u00f6gliche Debugging erleichtert.<\/p>\n<p><\/p>\n<p>Hierbei hilft <strong>client.id<\/strong> f\u00fcr Producer und Consumer. Auf den ersten Blick kann als Wert der Name der Anwendung verwendet werden, und in den meisten F\u00e4llen wird es funktionieren. Allerdings f\u00fchrt die Situation, in der mehrere Consumer in der Anwendung verwendet werden und Sie ihnen denselben client.id zuweisen, zur folgenden Warnung:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Fehler bei der Registrierung von AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Wenn Sie JMX in einer Anwendung mit Kafka verwenden m\u00f6chten, kann dies ein Problem darstellen. In diesem Fall ist es am besten, als Wert f\u00fcr client.id eine Kombination aus dem Namen der Anwendung und beispielsweise dem Namen des Topics zu verwenden. Das Ergebnis unserer Konfiguration kann im Ausgabewert des Befehls <strong>kafka-consumer-groups<\/strong> aus den Confluent-Tools eingesehen werden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wie Kafka Realit\u00e4t wurde\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt betrachten wir das Szenario der garantierten Nachrichtenlieferung. Der Kafka Producer hat den Parameter <strong>acks<\/strong>, der es erm\u00f6glicht zu konfigurieren, nach wie vielen Best\u00e4tigungen der Clusterleiter eine Nachricht als erfolgreich gespeichert betrachten soll. Dieser Parameter kann folgende Werte annehmen:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 Best\u00e4tigungen werden nicht gez\u00e4hlt.<\/li>\n<li>1 \u2014 Standardparameter, erforderlich ist eine Best\u00e4tigung nur von 1 Replik.<\/li>\n<li>\u22121 \u2014 Es sind Best\u00e4tigungen von allen synchronisierten Replikaten erforderlich (Cluster-Konfiguration <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Aus den aufgef\u00fchrten Werten ist ersichtlich, dass ein acks von \u22121 die st\u00e4rksten Garantien daf\u00fcr bietet, dass die Nachricht nicht verloren geht. <\/p>\n<p><\/p>\n<p>Wie wir alle wissen, sind verteilte Systeme unzuverl\u00e4ssig. Um sich vor tempor\u00e4ren Ausf\u00e4llen zu sch\u00fctzen, bietet der Kafka Producer den Parameter <strong>retries<\/strong>, der die Anzahl der Wiederholungsversuche innerhalb von <strong>delivery.timeout.ms<\/strong>festlegt. Da der Parameter retries standardm\u00e4\u00dfig den Wert Integer.MAX_VALUE (2147483647) hat, kann die Anzahl der Wiederholungen einer Nachricht nur durch Anpassung von delivery.timeout.ms gesteuert werden.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Wir bewegen uns in Richtung genau einmalige Zustellung<\/h2>\n<p><\/p>\n<p>Die genannten Einstellungen erm\u00f6glichen es unserem Producer, Nachrichten mit hoher Garantie zuzustellen. Lassen Sie uns nun dar\u00fcber sprechen, wie man sicherstellt, dass nur eine Kopie der Nachricht in ein Kafka-Topic geschrieben wird? Im einfachsten Fall muss daf\u00fcr am Producer der Parameter <strong>enable.idempotence<\/strong> auf den Wert true gesetzt werden. Idempotenz garantiert, dass nur eine Nachricht in eine bestimmte Partition eines Topics geschrieben wird. Eine Voraussetzung f\u00fcr die Aktivierung der Idempotenz sind die Werte <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Wenn diese Parameter nicht vom Entwickler festgelegt werden, werden die oben genannten Werte automatisch eingestellt.<\/p>\n<p><\/p>\n<p>Wenn die Idempotenz konfiguriert ist, muss sichergestellt werden, dass identische Nachrichten jedes Mal in dieselben Partitionen gelangen. Dies kann erreicht werden, indem der Schl\u00fcssel und der Parameter partitioner.class am Producer konfiguriert werden. Lassen Sie uns mit dem Schl\u00fcssel beginnen. Er muss f\u00fcr jede Sendung identisch sein. Dies l\u00e4sst sich leicht erreichen, indem ein Gesch\u00e4ftsidentifikator aus der urspr\u00fcnglichen Nachricht verwendet wird. Der Parameter partitioner.class hat den Standardwert \u2014 <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>. Bei dieser Standardpartitionierungsstrategie handeln wir wie folgt:<\/p>\n<p><\/p>\n<ul>\n<li>Wenn die Partition beim Senden der Nachricht ausdr\u00fccklich angegeben ist, verwenden wir diese.<\/li>\n<li>Wenn keine Partition angegeben ist, aber ein Schl\u00fcssel vorliegt, w\u00e4hlen wir die Partition basierend auf dem Hash des Schl\u00fcssels.<\/li>\n<li>Wenn weder Partition noch Schl\u00fcssel angegeben sind, w\u00e4hlen wir die Partitionen im Round-Robin-Verfahren aus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dar\u00fcber hinaus erm\u00f6glicht die Verwendung des Schl\u00fcssels und das idempotente Senden mit dem Parameter <strong>max.in.flight.requests.per.connection = 1<\/strong> gibt Ihnen eine strukturierte Verarbeitung von Nachrichten an den Consumer. Es ist wichtig zu beachten, dass Sie, wenn auf Ihrem Cluster eine Zugriffskontrolle eingerichtet ist, Berechtigungen f\u00fcr das idempotente Schreiben in das Topic ben\u00f6tigen.<\/p>\n<p><\/p>\n<p>Falls Ihnen die M\u00f6glichkeiten des idempotenten Sendens nach Schl\u00fcssel fehlen oder die Logik auf der Produzenten-Seite Konsistenz zwischen verschiedenen Partitionen erfordert, k\u00f6nnen Transaktionen helfen. Au\u00dferdem k\u00f6nnen Sie mit einer Ketten-Transaktion das Schreiben in Kafka hypothetisch mit dem Schreiben in eine DB synchronisieren. Um die transaktionale Sendung am Producer zu aktivieren, muss er idempotent sein und zus\u00e4tzlich <strong>transactional.id<\/strong>. Wenn auf Ihrem Kafka-Cluster eine Zugriffskontrolle eingerichtet ist, ben\u00f6tigen Sie f\u00fcr das transaktionale Schreiben, wie auch f\u00fcr das idempotente, Schreibrechte, die \u00fcber eine Maske mit dem Wert, der in transactional.id gespeichert ist, erteilt werden k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Formal kann jede Zeichenkette, z.B. der Name der Anwendung, als Transaktions-ID verwendet werden. Aber wenn Sie mehrere Instanzen derselben Anwendung mit derselben transactional.id starten, wird die zuerst gestartete Instanz mit einem Fehler gestoppt, da Kafka sie als Zombieprozess betrachtet. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Der Producer hat versucht, eine Operation mit einer alten Epoche durchzuf\u00fchren. Entweder gibt es einen neueren Producer mit derselben transactionalId, oder die Transaktion des Producers wurde vom Broker abgelaufen.<\/code><\/pre>\n<p><\/p>\n<p>Um dieses Problem zu l\u00f6sen, f\u00fcgen wir dem Namen der Anwendung einen Suffix in Form des Hostnamens hinzu, den wir aus Umgebungsvariablen erhalten. <\/p>\n<p><\/p>\n<p>Der Producer ist konfiguriert, aber Transaktionen in Kafka steuern nur den Geltungsbereich der Nachricht. Unabh\u00e4ngig vom Status der Transaktion wird die Nachricht sofort ins Topic geschrieben, hat jedoch zus\u00e4tzliche systemtechnische Attribute.<\/p>\n<p><\/p>\n<p>Um zu vermeiden, dass solche Nachrichten vom Consumer vor der Zeit gelesen werden, muss er den Parameter <strong>isolation.level<\/strong> auf den Wert read_committed setzen. Ein solcher Consumer kann nicht-transaktionale Nachrichten wie gewohnt und transaktionale nur nach dem Commit lesen.<br \/>\nWenn Sie alle zuvor genannten Einstellungen vorgenommen haben, dann haben Sie genau einmalige Zustellungen konfiguriert. Herzlichen Gl\u00fcckwunsch!<\/p>\n<p><\/p>\n<p>Es gibt jedoch noch einen weiteren Punkt. Die transactional.id, die wir oben konfiguriert haben, ist in Wirklichkeit ein Pr\u00e4fix der Transaktion. Bei dem Transaktionsmanager wird eine fortlaufende Nummer angeh\u00e4ngt. Die erhaltene ID wird auf <strong>transactional.id.expiration.ms<\/strong>, der auf einem Kafka-Cluster konfiguriert wird und einen Standardwert von \u201e7 Tagen\u201c hat. Wenn die Anwendung in dieser Zeit keine Nachrichten empfangen hat, erhalten Sie bei dem n\u00e4chsten transaktionalen Versand einen <strong>InvalidPidMappingException<\/strong>. Danach wird der Transaktionskoordinator eine neue Seriennummer f\u00fcr die n\u00e4chste Transaktion vergeben. Dabei kann eine Nachricht verworfen werden, wenn die InvalidPidMappingException nicht richtig behandelt wird. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Statt der Ergebnisse<\/h2>\n<p><\/p>\n<p>Wie zu erkennen ist, reicht es nicht aus, einfach Nachrichten an Kafka zu senden. Es ist erforderlich, eine Kombination von Parametern auszuw\u00e4hlen und bereit zu sein, schnelle \u00c4nderungen vorzunehmen. In diesem Artikel habe ich versucht, die Konfiguration f\u00fcr genau einmalige Zustellungen im Detail darzustellen und einige Probleme mit den Konfigurationen client.id und transactional.id zu beschreiben, auf die wir gesto\u00dfen sind. Unten sind die Einstellungen f\u00fcr Producer und Consumer in kurzer Form aufgef\u00fchrt.<\/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 f\u00fcr geordnete Sendungen)<\/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>Um Fehler in zuk\u00fcnftigen Anwendungen zu minimieren, haben wir unsere eigene Wrapper-Implementierung \u00fcber die Spring-Konfiguration erstellt, wo bereits Werte f\u00fcr einige der genannten Parameter festgelegt sind.<\/p>\n<p><\/p>\n<p>Hier sind ein paar Materialien f\u00fcr das Selbststudium:<\/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 Genau einmalige Zustellung und transaktionale Nachrichten\u00fcbermittlung<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#configuration\">Beschreibung der Einstellungen <\/a><\/noindex><\/li>\n<\/ul>\n<p>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Wie Kafka Wirklichkeit wurde | ProHoster","description":"Hallo, Habr! Ich arbeite im Team von Tinkoff.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}