{"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\/es\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"C\u00f3mo Kafka se convirti\u00f3 en realidad.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"C\u00f3mo Kafka se convirti\u00f3 en realidad.\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00a1Hola, Habr!<\/p>\n<p><\/p>\n<p>Trabajo en el equipo de Tinkoff, que se encarga del desarrollo de nuestro propio centro de notificaciones. Principalmente desarrollo en Java utilizando Spring Boot y resuelvo varios problemas t\u00e9cnicos que surgen en el proyecto.<\/p>\n<p><\/p>\n<p>La mayor\u00eda de nuestros microservicios interact\u00faan de manera as\u00edncrona entre s\u00ed a trav\u00e9s de un br\u00f3ker de mensajes. Anteriormente, utiliz\u00e1bamos IBM MQ como br\u00f3ker, que dej\u00f3 de manejar la carga, pero que ten\u00eda altas garant\u00edas de entrega.<\/p>\n<p><\/p>\n<p>Como reemplazo, nos propusieron Apache Kafka, que tiene un alto potencial de escalabilidad, pero que, desafortunadamente, requiere un enfoque casi personalizado para la configuraci\u00f3n en diferentes escenarios. Adem\u00e1s, el mecanismo de entrega al menos una vez que funciona en Kafka de forma predeterminada, no permit\u00eda mantener el nivel necesario de consistencia desde el principio. A continuaci\u00f3n, compartir\u00e9 nuestra experiencia configurando Kafka, en particular c\u00f3mo configurar y trabajar con la entrega exactamente una vez.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Entrega garantizada y m\u00e1s<\/h2>\n<p><\/p>\n<p>Los par\u00e1metros que se mencionar\u00e1n a continuaci\u00f3n ayudar\u00e1n a prevenir una serie de problemas con la configuraci\u00f3n de conexi\u00f3n predeterminada. Pero primero, quiero centrarme en un par\u00e1metro que facilitar\u00e1 el posible depurado.<\/p>\n<p><\/p>\n<p>Esto ayudar\u00e1 <strong>client.id<\/strong> para Producer y Consumer. A primera vista, se puede usar el nombre de la aplicaci\u00f3n como valor, y en la mayor\u00eda de los casos funcionar\u00e1. Sin embargo, la situaci\u00f3n en la que se utilizan varios Consumers en la aplicaci\u00f3n y se les asigna el mismo client.id provoca la siguiente advertencia:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Error registrando AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Si deseas usar JMX en una aplicaci\u00f3n con Kafka, esto puede ser un problema. Para este caso, es mejor usar como valor para client.id una combinaci\u00f3n del nombre de la aplicaci\u00f3n y, por ejemplo, el nombre del t\u00f3pico. Puedes ver el resultado de nuestra configuraci\u00f3n en la salida del comando <strong>kafka-consumer-groups<\/strong> de las utilidades de Confluent:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo Kafka se convirti\u00f3 en realidad.\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora analicemos el escenario de la entrega garantizada de mensajes. Un Kafka Producer tiene el par\u00e1metro <strong>acks<\/strong>, que permite configurar despu\u00e9s de cu\u00e1ntas confirmaciones el l\u00edder del cl\u00faster debe considerar el mensaje como grabado correctamente. Este par\u00e1metro puede tomar los siguientes valores:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 las confirmaciones no se contar\u00e1n.<\/li>\n<li>1 \u2014 par\u00e1metro predeterminado, se necesita confirmaci\u00f3n solo de 1 r\u00e9plica.<\/li>\n<li>\u22121 \u2014 se requieren acknowledgments de todas las r\u00e9plicas sincronizadas (configuraci\u00f3n del cl\u00faster <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>De los valores enumerados, se nota que acks igual a \u22121 brinda las garant\u00edas m\u00e1s fuertes de que el mensaje no se perder\u00e1. <\/p>\n<p><\/p>\n<p>Como todos sabemos, los sistemas distribuidos son poco fiables. Para protegerse contra fallas temporales, el Kafka Producer proporciona el par\u00e1metro <strong>retries<\/strong>, que permite establecer el n\u00famero de intentos de reenv\u00edo durante <strong>delivery.timeout.ms<\/strong>. Dado que el par\u00e1metro retries tiene el valor predeterminado Integer.MAX_VALUE (2147483647), el n\u00famero de reenv\u00edos de mensajes se puede regular cambiando solo delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Pasamos a la entrega exactamente una vez<\/h2>\n<p><\/p>\n<p>La configuraci\u00f3n mencionada permite que nuestro Producer entregue mensajes con una alta garant\u00eda. Ahora hablemos de c\u00f3mo garantizar que se registre solo una copia de un mensaje en el tema de Kafka. En el caso m\u00e1s simple, para esto el Producer debe establecer el par\u00e1metro <strong>enable.idempotence<\/strong> en verdadero. La idempotencia garantiza el registro de solo un mensaje en una partici\u00f3n espec\u00edfica de un tema. Un requisito previo para habilitar la idempotencia son los valores <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Si estos par\u00e1metros no son especificados por el desarrollador, se establecer\u00e1n autom\u00e1ticamente los valores mencionados anteriormente.<\/p>\n<p><\/p>\n<p>Cuando la idempotencia est\u00e1 configurada, es necesario asegurarse de que los mensajes id\u00e9nticos vayan siempre a las mismas particiones. Esto se puede lograr configurando la clave y el par\u00e1metro partitioner.class en el Producer. Comencemos con la clave. Para cada env\u00edo, debe ser la misma. Esto se puede lograr f\u00e1cilmente utilizando alg\u00fan identificador de negocio del mensaje original. El par\u00e1metro partitioner.class tiene el valor predeterminado \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>. Con esta estrategia de partici\u00f3n predeterminada, procede de la siguiente manera:<\/p>\n<p><\/p>\n<ul>\n<li>Si la partici\u00f3n se indica expl\u00edcitamente al enviar el mensaje, se utiliza.<\/li>\n<li>Si no se indica la partici\u00f3n, pero se especifica la clave, se elige la partici\u00f3n por el hash de la clave.<\/li>\n<li>Si no se especifican ni la partici\u00f3n ni la clave, las particiones se eligen de forma secuencial (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>Adem\u00e1s, el uso de una clave y el env\u00edo idempotente con el par\u00e1metro <strong>max.in.flight.requests.per.connection = 1<\/strong> le proporciona un procesamiento ordenado de mensajes en el Consumer. Tambi\u00e9n debe recordar que, si su cl\u00faster tiene habilitada la gesti\u00f3n de acceso, necesitar\u00e1 permisos para registrar idempotentemente en el tema.<\/p>\n<p><\/p>\n<p>Si de repente le faltan las capacidades de env\u00edo idempotente por clave o la l\u00f3gica del lado del Producer requiere mantener la consistencia de los datos entre diferentes particiones, las transacciones vienen al rescate. Adem\u00e1s, mediante una transacci\u00f3n encadenada, puede sincronizar condicionalmente la escritura en Kafka, por ejemplo, con la escritura en la base de datos. Para habilitar el env\u00edo transaccional en el Producer, es necesario que sea idempotente y tambi\u00e9n definir <strong>transactional.id<\/strong>. Si en su cl\u00faster de Kafka se ha configurado la gesti\u00f3n de acceso, tambi\u00e9n se necesitar\u00e1n derechos de escritura para el registro transaccional, los cuales pueden ser otorgados mediante una m\u00e1scara usando el valor almacenado en transactional.id.<\/p>\n<p><\/p>\n<p>Formalmente, se puede usar cualquier cadena como identificador de transacci\u00f3n, por ejemplo, el nombre de la aplicaci\u00f3n. Pero si est\u00e1 ejecutando varias instancias de la misma aplicaci\u00f3n con el mismo transactional.id, la primera instancia que se inicie se detendr\u00e1 con un error, ya que Kafka la considerar\u00e1 un proceso zombi. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: El Producer intent\u00f3 realizar una operaci\u00f3n con una \u00e9poca antigua. Ya sea que haya un producer m\u00e1s nuevo con el mismo transactionalId, o que la transacci\u00f3n del producer haya expirado por el broker.<\/code><\/pre>\n<p><\/p>\n<p>Para resolver este problema, a\u00f1adimos un sufijo al nombre de la aplicaci\u00f3n en forma del nombre del host, que obtenemos de las variables de entorno. <\/p>\n<p><\/p>\n<p>El Producer est\u00e1 configurado, pero las transacciones en Kafka solo gestionan el \u00e1mbito de visibilidad del mensaje. Independientemente del estado de la transacci\u00f3n, el mensaje llega inmediatamente al tema, pero posee atributos adicionales del sistema.<\/p>\n<p><\/p>\n<p>Para que el Consumer no lea tales mensajes antes de tiempo, debe establecer el par\u00e1metro <strong>isolation.level<\/strong> en el valor read_committed. Dicho Consumer podr\u00e1 leer mensajes no transaccionales como antes, y los transaccionales solo despu\u00e9s del commit.<br \/>\nSi ha configurado todas las configuraciones mencionadas anteriormente, ha configurado exactly once delivery. \u00a1Felicidades!<\/p>\n<p><\/p>\n<p>Pero hay otro matiz. El transactional.id, que configuramos arriba, es en realidad un prefijo de la transacci\u00f3n. Al gerente de transacciones se le a\u00f1ade un n\u00famero secuencial. El identificador obtenido se emite en <strong>transactional.id.expiration.ms<\/strong>, que se configura en el cl\u00faster de Kafka y tiene un valor por defecto de \u00ab7 d\u00edas\u00bb. Si durante este tiempo la aplicaci\u00f3n no recibe ning\u00fan mensaje, al intentar el siguiente env\u00edo transaccional recibir\u00e1s <strong>InvalidPidMappingException<\/strong>. Despu\u00e9s de esto, el coordinador de transacciones emitir\u00e1 un nuevo n\u00famero secuencial para la siguiente transacci\u00f3n. Sin embargo, el mensaje puede perderse si InvalidPidMappingException no se maneja correctamente. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">En lugar de resultados<\/h2>\n<p><\/p>\n<p>Como se puede notar, no es suficiente simplemente enviar mensajes a Kafka. Es necesario elegir una combinaci\u00f3n de par\u00e1metros y estar listo para realizar cambios r\u00e1pidos. En este art\u00edculo he intentado mostrar en detalle la configuraci\u00f3n de entrega exactly once y he descrito algunos problemas de configuraci\u00f3n con client.id y transactional.id que encontramos. A continuaci\u00f3n, se presentan brevemente los ajustes de Producer y Consumer.<\/p>\n<p><\/p>\n<p>Productor:<\/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 para env\u00edo ordenado)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Consumidor:<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>Para minimizar errores en futuras aplicaciones, hemos creado un wrapper sobre la configuraci\u00f3n de spring, donde ya se han establecido valores para algunos de los par\u00e1metros mencionados.<\/p>\n<p><\/p>\n<p>Y aqu\u00ed hay un par de materiales para el autoestudio:<\/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\">Descripci\u00f3n de la configuraci\u00f3n <\/a><\/noindex><\/li>\n<\/ul>\n<p>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47C\u00f3mo Kafka se convirti\u00f3 en realidad | ProHoster","description":"\u00a1Hola, Habr! Trabajo en el equipo de Tinkoff.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}