{"id":13808,"date":"2025-07-21T08:18:14","date_gmt":"2025-07-21T07:18:14","guid":{"rendered":"https:\/\/aprenderbigdata.com\/?p=13808"},"modified":"2025-07-21T08:18:16","modified_gmt":"2025-07-21T07:18:16","slug":"patrones-apache-kafka","status":"publish","type":"post","link":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/","title":{"rendered":"Patrones Apache Kafka y Buenas Pr\u00e1cticas"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u00bfTe has preguntado por qu\u00e9 algunos sistemas que usan <em>patrones de Apache Kafka<\/em> escalan bien mientras otros colapsan? La diferencia no est\u00e1 en la tecnolog\u00eda, sino en c\u00f3mo la usas. Si est\u00e1s dise\u00f1ando arquitecturas basadas en eventos, presta atenci\u00f3n a este art\u00edculo.<\/p>\n\n\n<figure class=\"aligncenter wp-block-post-featured-image\"><img decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"Patrones Apache Kafka\" style=\"object-fit:cover;\" srcset=\"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg 1280w, https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka-300x169.jpg 300w, https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka-1024x576.jpg 1024w, https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka-768x432.jpg 768w, https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka-800x450.jpg 800w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a661ac984961\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a661ac984961\" checked aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#%C2%BFQue-son-los-patrones-en-Apache-Kafka-y-por-que-importan\" >\u00bfQu\u00e9 son los patrones en Apache Kafka y por qu\u00e9 importan?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#1-Request%E2%80%93Reply-en-Kafka-Comunicacion-sincrona-sobre-un-bus-asincrono\" >1. Request\u2013Reply en Kafka: Comunicaci\u00f3n s\u00edncrona sobre un bus as\u00edncrono<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Productor-Request\" >Productor (Request)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Consumidor-Replier\" >Consumidor + Replier<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#2-Event-Chunk-dividir-y-recomponer-batch-eficientemente\" >2. Event Chunk: dividir y recomponer batch eficientemente<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Dividir-un-payload-en-fragmentos\" >Dividir un payload en fragmentos<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#4-Claim-Check-Event-Chunk-Escalabilidad-y-control\" >4. Claim Check + Event Chunk: Escalabilidad y control<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#5-Arquitecturas-dirigidas-por-eventos-con-Kafka\" >5. Arquitecturas dirigidas por eventos con Kafka<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#6-Patrones-de-procesamiento-con-Kafka-Streams-KStream-KTable-y-stateful-processing\" >6. Patrones de procesamiento con Kafka Streams: KStream, KTable y stateful processing<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Kafka-Streams-con-KStream-y-KTable-Join\" >Kafka Streams con KStream y KTable (Join)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#8-Anti%E2%80%91patrones-comunes-en-Kafka-que-evitar\" >8. Anti\u2011patrones comunes en Kafka: qu\u00e9 evitar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#9-Buenas-practicas-para-trabajar-con-Kafka\" >9. Buenas pr\u00e1cticas para trabajar con Kafka<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Configuracion-de-idempotencia-y-acks-en-el-productor-Kafka\" >Configuraci\u00f3n de idempotencia y acks en el productor Kafka:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#Siguientes-Pasos-y-Formacion\" >Siguientes Pasos y Formaci\u00f3n<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%C2%BFQue-son-los-patrones-en-Apache-Kafka-y-por-que-importan\"><\/span>\u00bfQu\u00e9 son los patrones en Apache Kafka y por qu\u00e9 importan?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando comenc\u00e9 a trabajar con <a href=\"https:\/\/aprenderbigdata.com\/introduccion-apache-kafka\/\"><strong>Apache Kafka<\/strong><\/a>, lo primero que not\u00e9 fue la falta de una \u00abgu\u00eda oficial\u00bb sobre c\u00f3mo dise\u00f1ar arquitecturas efectivas. Todos los recursos hablaban sobre productores, consumidores y topics, pero pocos en c\u00f3mo conectar todo eso en sistemas reales. Ah\u00ed es donde los patrones entran en juego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los <em>patrones de Kafka<\/em> son formas probadas y repetidas de resolver problemas comunes en arquitecturas distribuidas orientadas a eventos. Implementarlos correctamente puede ser la diferencia entre un sistema estable, escalable y f\u00e1cil de mantener, o uno lleno de cuellos de botella, redundancias innecesarias y comportamientos impredecibles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1-Request%E2%80%93Reply-en-Kafka-Comunicacion-sincrona-sobre-un-bus-asincrono\"><\/span>1. Request\u2013Reply en Kafka: Comunicaci\u00f3n s\u00edncrona sobre un bus as\u00edncrono<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno de los primeros retos a los que te puedes enfrentar es a que dos microservicios se hablen en tiempo real, pero sin acoplarse directamente. La soluci\u00f3n es implementar el patr\u00f3n <a href=\"https:\/\/www.kai-waehner.de\/blog\/2022\/06\/03\/apache-kafka-request-response-vs-cqrs-event-sourcing\/\" target=\"_blank\" rel=\"noreferrer noopener\">Request\u2013Reply<\/a> sobre Kafka, lo que al principio parece contradictorio porque Kafka es inherentemente asincr\u00f3nico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El truco est\u00e1 en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Generar un <code>correlationId<\/code> \u00fanico<\/strong> en cada mensaje.<\/li>\n\n\n\n<li>Publicar el mensaje en un <em>topic de peticiones<\/em>.<\/li>\n\n\n\n<li>Escuchar en un <em>topic de respuestas<\/em> que contenga ese <code>correlationId<\/code>.<\/li>\n\n\n\n<li>Agregar una <em>expiraci\u00f3n temporal<\/em> en caso de no recibir respuesta.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Este patr\u00f3n es ideal cuando necesitas confirmaci\u00f3n de procesamiento, pero <strong>sin perder los beneficios del desacoplamiento<\/strong>. Eso s\u00ed, requiere dise\u00f1ar una infraestructura robusta que soporte reintentos y errores parciales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aun asi, recuerda nunca usar un \u00fanico topic para todas las respuestas para evitar saturar el sistema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Productor-Request\"><\/span><strong>Productor (Request)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nProducerRecord&lt;String, String&gt; request = new ProducerRecord&lt;&gt;(\n    &quot;request-topic&quot;, null, UUID.randomUUID().toString(), \n    &quot;\u00bfCu\u00e1l es el estado del pedido #123?&quot;, \n    HeadersBuilder.with(&quot;correlationId&quot;, &quot;abc-123&quot;).with(&quot;replyTo&quot;, &quot;reply-topic&quot;)\n);\nproducer.send(request);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Consumidor-Replier\"><\/span><strong>Consumidor + Replier<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nconsumer.subscribe(Collections.singletonList(&quot;request-topic&quot;));\nwhile (true) {\n    ConsumerRecords&lt;String, String&gt; records = consumer.poll(Duration.ofMillis(100));\n    for (ConsumerRecord&lt;String, String&gt; record : records) {\n        String correlationId = record.headers().lastHeader(&quot;correlationId&quot;).value().toString();\n        String replyTo = record.headers().lastHeader(&quot;replyTo&quot;).value().toString();\n\n        String respuesta = &quot;Pedido #123 est\u00e1 en reparto&quot;;\n\n        ProducerRecord&lt;String, String&gt; reply = new ProducerRecord&lt;&gt;(\n            replyTo, null, correlationId, respuesta,\n            HeadersBuilder.with(&quot;correlationId&quot;, correlationId)\n        );\n        producer.send(reply);\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2-Event-Chunk-dividir-y-recomponer-batch-eficientemente\"><\/span>2. Event Chunk: dividir y recomponer batch eficientemente<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando trabajamos con eventos que contienen grandes vol\u00famenes de datos (por ejemplo, cargas batch desde un ERP), el tama\u00f1o del mensaje puede superar los <a href=\"https:\/\/www.confluent.io\/learn\/kafka-message-size-limit\/\" target=\"_blank\" rel=\"noreferrer noopener\">l\u00edmites m\u00e1ximos permitidos por Kafka<\/a>. Aqu\u00ed entra el patr\u00f3n <a href=\"https:\/\/developer.confluent.io\/patterns\/event-processing\/event-chunking\/\" target=\"_blank\" rel=\"noreferrer noopener\">Event Chunk<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este patr\u00f3n consiste en:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dividir el payload original<\/strong> en m\u00faltiples fragmentos m\u00e1s peque\u00f1os.<\/li>\n\n\n\n<li>Asignar un <code>chunkId<\/code> y <code>messageId<\/code> para agruparlos.<\/li>\n\n\n\n<li>Reensamblar los chunks en el consumidor una vez recibidos todos.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Lo he aplicado en integraciones financieras donde se enviaban hasta 5,000 registros contables por evento. Fragmentar estos mensajes permite que los consumidores manejen los datos en paralelo. Este patr\u00f3n tambi\u00e9n te obliga a mejorar la <strong>l\u00f3gica de retry<\/strong>, ya que un solo chunk faltante puede retrasar todo el procesamiento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Dividir-un-payload-en-fragmentos\"><\/span><strong>Dividir un payload en fragmentos<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nString payload = largeJson;\nint chunkSize = 900000; \/\/ menos de 1MB\n\nList&lt;String&gt; chunks = new ArrayList&lt;&gt;();\nfor (int i = 0; i &lt; payload.length(); i += chunkSize) {\n    chunks.add(payload.substring(i, Math.min(payload.length(), i + chunkSize)));\n}\n\nString eventId = UUID.randomUUID().toString();\nfor (int i = 0; i &lt; chunks.size(); i++) {\n    ProducerRecord&lt;String, String&gt; chunkRecord = new ProducerRecord&lt;&gt;(\n        &quot;chunked-events&quot;,\n        null,\n        eventId,\n        chunks.get(i),\n        HeadersBuilder\n            .with(&quot;chunkId&quot;, i + &quot;&quot;)\n            .with(&quot;totalChunks&quot;, chunks.size() + &quot;&quot;)\n            .with(&quot;eventId&quot;, eventId)\n    );\n    producer.send(chunkRecord);\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4-Claim-Check-Event-Chunk-Escalabilidad-y-control\"><\/span>4. Claim Check + Event Chunk: Escalabilidad y control<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una evoluci\u00f3n del patr\u00f3n anterior es combinarlo con el famoso <strong>Claim Check<\/strong>, donde solo se env\u00eda una referencia al contenido en Kafka, mientras que el contenido real se guarda en un almacenamiento externo (como <strong><a href=\"https:\/\/aprenderbigdata.com\/amazon-s3\/\">Amazon S3<\/a><\/strong> o un sistema de blobs).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, puede ser \u00fatil en una soluci\u00f3n e-commerce. Donde se almacenan los detalles de cada orden (incluyendo im\u00e1genes y adjuntos) fuera de Kafka, y en los eventos solo se incluye un <code>claimCheckId<\/code>. Esto reduce dr\u00e1sticamente el tama\u00f1o de los eventos y evita congestionar los topics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aseg\u00farate aqu\u00ed de que el sistema de almacenamiento externo tenga redundancia y latencia baja, porque cada consumidor necesitar\u00e1 acceder a \u00e9l.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5-Arquitecturas-dirigidas-por-eventos-con-Kafka\"><\/span>5. Arquitecturas dirigidas por eventos con Kafka<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Adoptar <strong>event-driven architecture (EDA)<\/strong> con Kafka como backbone ha sido uno de los mayores cambios de paradigma que viv\u00ed como arquitecto. Pasa de pensar en peticiones directas a dise\u00f1ar flujos de eventos encadenados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, podemos tener lo siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Servicio A emite <code>UsuarioRegistrado<\/code>.<\/li>\n\n\n\n<li>Servicio B escucha ese evento y env\u00eda <code>BienvenidaEnviada<\/code>.<\/li>\n\n\n\n<li>Servicio C escucha ambos y actualiza el CRM.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Dise\u00f1ar este flujo requiere tener una coreograf\u00eda de eventos y control de duplicados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recuerda que m\u00e1s eventos no siempre es mejor. Intenta modelar tu coreograf\u00eda con la menor cantidad de eventos posible y de esta forma reducir el ruido y los errores de correlaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6-Patrones-de-procesamiento-con-Kafka-Streams-KStream-KTable-y-stateful-processing\"><\/span>6. Patrones de procesamiento con Kafka Streams: KStream, KTable y stateful processing<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed debes entender bien cu\u00e1ndo usar <code>KStream<\/code> vs <code>KTable<\/code>. Evitar errores t\u00edpicos como intentar hacer joins con <code>KStream<\/code> donde se necesita un estado.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usa <code>KTable<\/code> para datos que se <em>acumulan y se actualizan<\/em> (como cat\u00e1logos).<\/li>\n\n\n\n<li>Usa <code>KStream<\/code> para flujos inmutables de eventos (como transacciones).<\/li>\n\n\n\n<li>Usa <em>stateful processing<\/em> para operaciones de ventana y agregaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Kafka-Streams-con-KStream-y-KTable-Join\"><\/span><strong>Kafka Streams con KStream y KTable (Join)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nStreamsBuilder builder = new StreamsBuilder();\n\nKStream&lt;String, OrderEvent&gt; orders = builder.stream(&quot;orders&quot;, Consumed.with(Serdes.String(), orderSerde));\nKTable&lt;String, Customer&gt; customers = builder.table(&quot;customers&quot;, Consumed.with(Serdes.String(), customerSerde));\n\nKStream&lt;String, EnrichedOrder&gt; enriched = orders.join(\n    customers,\n    (order, customer) -&gt; new EnrichedOrder(order, customer)\n);\n\nenriched.to(&quot;enriched-orders&quot;, Produced.with(Serdes.String(), enrichedOrderSerde));\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8-Anti%E2%80%91patrones-comunes-en-Kafka-que-evitar\"><\/span>8. Anti\u2011patrones comunes en Kafka: qu\u00e9 evitar<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kafka, si se usa mal, puede traer m\u00e1s problemas que soluciones. Aqu\u00ed algunos anti\u2011patrones que he vivido en carne propia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Topics gen\u00e9ricos y sin control:<\/strong> ev\u00edtalos. Un topic llamado \u201ceventos\u201d donde todo tipo de payload entra solo genera caos.<\/li>\n\n\n\n<li><strong>Retry sin backoff:<\/strong> hacer reintentos infinitos en consumidores sin control puede saturar tus sistemas.<\/li>\n\n\n\n<li><strong>Repartir eventos sin clave (key):<\/strong> esto rompe el orden y complica el procesamiento.<\/li>\n\n\n\n<li><strong>Sobreingenier\u00eda en esquema de eventos:<\/strong> querer hacerlo \u201csuper gen\u00e9rico\u201d lleva a eventos incomprensibles.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9-Buenas-practicas-para-trabajar-con-Kafka\"><\/span>9. Buenas pr\u00e1cticas para trabajar con Kafka<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s de los patrones, hay una serie de buenas pr\u00e1cticas que han marcado la diferencia en todos mis proyectos con Kafka:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Usa Avro + Schema Registry:<\/strong> para validar, versionar y evitar errores de compatibilidad.<\/li>\n\n\n\n<li><strong>Dise\u00f1a eventos idempotentes:<\/strong> que puedan ser procesados varias veces sin efectos secundarios.<\/li>\n\n\n\n<li><strong>Distribuye con buenas claves:<\/strong> para que el particionamiento sea equilibrado.<\/li>\n\n\n\n<li><strong>Monitoriza con herramientas como Prometheus y Grafana:<\/strong> entender el lag, throughput y errores en tiempo real es vital.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configuracion-de-idempotencia-y-acks-en-el-productor-Kafka\"><\/span><strong>Configuraci\u00f3n de idempotencia y acks en el productor Kafka:<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nProperties props = new Properties();\nprops.put(&quot;bootstrap.servers&quot;, &quot;localhost:9092&quot;);\nprops.put(&quot;acks&quot;, &quot;all&quot;);\nprops.put(&quot;enable.idempotence&quot;, &quot;true&quot;);\nprops.put(&quot;retries&quot;, Integer.MAX_VALUE);\nprops.put(&quot;max.in.flight.requests.per.connection&quot;, 5);\nprops.put(&quot;key.serializer&quot;, StringSerializer.class.getName());\nprops.put(&quot;value.serializer&quot;, StringSerializer.class.getName());\n\nKafkaProducer&lt;String, String&gt; producer = new KafkaProducer&lt;&gt;(props);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">No dejes el manejo de errores como \u00abalgo que luego resolveremos\u00bb. Un simple try\/catch con logs no basta. Usa DLQs, alertas y dashboards desde el d\u00eda 1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ddise\u00f1a con eventos, no con servicios.<\/strong> Kafka no es una base de datos, ni un broker de peticiones. Es el esqueleto de un sistema vivo que se comunica mediante hechos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading wp-embed-aspect-16-9 wp-has-aspect-ratio\" id=\"formacion\"><span class=\"ez-toc-section\" id=\"Siguientes-Pasos-y-Formacion\"><\/span>Siguientes Pasos y Formaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-embed-aspect-16-9 wp-has-aspect-ratio wp-block-paragraph\">Si quieres aprender Apache Kafka a fondo y convertirte en experto, no dudes en invertir en tu <strong>formaci\u00f3n<\/strong> a largo plazo. Para ello, te dejo mi propio curso en espa\u00f1ol en el que aprender\u00e1s desde cero: con partes te\u00f3ricas y partes pr\u00e1cticas. Es un curso fundamental para quien desee implementar sistemas escalables de procesamiento de datos en tiempo real.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-embed-aspect-16-9 wp-has-aspect-ratio has-medium-font-size wp-block-paragraph\"><strong><a href=\"https:\/\/go.hotmart.com\/V75475436D?SCK=KAFKACON\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Comienza con Kafka: Curso de Apache Kafka desde Cero<\/a><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<p class=\"responsive-video-wrap clr\"><iframe title=\"Introduccion a Apache Kafka desde Cero\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/tkdJP6gkRWI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<\/div><\/figure>\n\n\n\n<div class=\"wp-block-group newsletter-re\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<!-- Begin Brevo Form -->\n<!-- START - We recommend to place the below code in head tag of your website html  -->\n<style>\n  @font-face {\n    font-display: block;\n    font-family: Roboto;\n  }\n\n  @font-face {\n    font-display: fallback;\n    font-family: Roboto;\n    font-weight: 600;\n  }\n\n  @font-face {\n    font-display: fallback;\n    font-family: Roboto;\n    font-weight: 700;\n  }\n\n  #sib-container input:-ms-input-placeholder {\n    text-align: left;\n    font-family: \"Helvetica\", sans-serif;\n    color: #c0ccda;\n  }\n\n  #sib-container input::placeholder {\n    text-align: left;\n    font-family: \"Helvetica\", sans-serif;\n    color: #c0ccda;\n  }\n\n  #sib-container textarea::placeholder {\n    text-align: left;\n    font-family: \"Helvetica\", sans-serif;\n    color: #c0ccda;\n  }\n<\/style>\n<link rel=\"stylesheet\" href=\"https:\/\/sibforms.com\/forms\/end-form\/build\/sib-styles.css\">\n<!--  END - We recommend to place the above code in head tag of your website html -->\n\n<!-- START - We recommend to place the below code where you want the form in your website html  -->\n<div class=\"sib-form\" style=\"text-align: center;\n         background-color: #ffffff;                                 \">\n  <div id=\"sib-form-container\" class=\"sib-form-container\">\n    <div id=\"error-message\" class=\"sib-form-message-panel\" style=\"font-size:16px; text-align:left; font-family:&quot;Helvetica&quot;, sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;max-width:600px;\">\n      <div class=\"sib-form-message-panel__text sib-form-message-panel__text--center\">\n        <svg viewBox=\"0 0 512 512\" class=\"sib-icon sib-notification__icon\">\n          <path d=\"M256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm-11.49 120h22.979c6.823 0 12.274 5.682 11.99 12.5l-7 168c-.268 6.428-5.556 11.5-11.99 11.5h-8.979c-6.433 0-11.722-5.073-11.99-11.5l-7-168c-.283-6.818 5.167-12.5 11.99-12.5zM256 340c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28z\" \/>\n        <\/svg>\n        <span class=\"sib-form-message-panel__inner-text\">\n                          Tu suscripci\u00f3n no ha podido guardarse. Por favor vuelve a intentarlo.\n                      <\/span>\n      <\/div>\n    <\/div>\n    <div><\/div>\n    <div id=\"success-message\" class=\"sib-form-message-panel\" style=\"font-size:16px; text-align:left; font-family:&quot;Helvetica&quot;, sans-serif; color:#085229; background-color:#e7faf0; border-radius:3px; border-color:#13ce66;max-width:600px;\">\n      <div class=\"sib-form-message-panel__text sib-form-message-panel__text--center\">\n        <svg viewBox=\"0 0 512 512\" class=\"sib-icon sib-notification__icon\">\n          <path d=\"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 464c-118.664 0-216-96.055-216-216 0-118.663 96.055-216 216-216 118.664 0 216 96.055 216 216 0 118.663-96.055 216-216 216zm141.63-274.961L217.15 376.071c-4.705 4.667-12.303 4.637-16.97-.068l-85.878-86.572c-4.667-4.705-4.637-12.303.068-16.97l8.52-8.451c4.705-4.667 12.303-4.637 16.97.068l68.976 69.533 163.441-162.13c4.705-4.667 12.303-4.637 16.97.068l8.451 8.52c4.668 4.705 4.637 12.303-.068 16.97z\" \/>\n        <\/svg>\n        <span class=\"sib-form-message-panel__inner-text\">\n                          Gracias por suscribirte \ud83d\ude42\n                      <\/span>\n      <\/div>\n    <\/div>\n    <div><\/div>\n    <div id=\"sib-container\" class=\"sib-container--large sib-container--vertical\" style=\"text-align:center; background-color:rgba(249,250,251,1); max-width:600px; border-radius:7px; border-width:1px; border-color:#C0CCD9; border-style:solid; direction:ltr\">\n      <form id=\"sib-form\" method=\"POST\" action=\"https:\/\/45b7c589.sibforms.com\/serve\/MUIFAJUHX74hhdn6yVc3sScAj33FFxSgDh2U31jEyO8bXeQmVM0dKSOmYifgH3XNPOP2aDViwVBs9N6McSTxHJEzEx-3nNpomebkJUWOi7_tG2VHKFLj6EeyMplUrpj_VNPjl6BSC9WBN_uOLGnlnyKzUoB1RDaXbz1sakGbox07jJ2toYKwtJ0EyDjJmvQkZmF7Wk4iEcUMBwrU\" data-type=\"subscription\">\n        <div style=\"padding: 8px 0;\">\n          <div class=\"sib-form-block\" style=\"font-size:25px; text-align:center; font-weight:700; font-family:&quot;Helvetica&quot;, sans-serif; color:#3C4858; background-color:transparent; text-align:center\">\n            <p><strong>\u00danete a la Comunidad Big Data<\/strong><\/p>\n          <\/div>\n        <\/div>\n        <div style=\"padding: 8px 0;\">\n          <div class=\"sib-form-block\" style=\"font-size:16px; text-align:center; font-family:&quot;Helvetica&quot;, sans-serif; color:#3C4858; background-color:transparent; text-align:center\">\n            <div class=\"sib-text-form-block\">\n              <p>Tu conocimiento es la herramienta m\u00e1s potente. Suscr\u00edbete a la lista de correo para mantenerte al d\u00eda con los art\u00edculos m\u00e1s \u00fatiles para tu carrera en Big Data y Cloud. Sin spam, nunca.<\/p>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div style=\"padding: 8px 0;\">\n          <div class=\"sib-input sib-form-block\">\n            <div class=\"form__entry entry_block\">\n              <div class=\"form__label-row \">\n\n                <div class=\"entry__field\">\n                  <input class=\"input \" type=\"text\" id=\"EMAIL\" name=\"EMAIL\" autocomplete=\"off\" placeholder=\"TU EMAIL\" data-required=\"true\" required \/>\n                <\/div>\n              <\/div>\n\n              <label class=\"entry__error entry__error--primary\" style=\"font-size:16px; text-align:left; font-family:&quot;Helvetica&quot;, sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;\">\n              <\/label>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div style=\"padding: 8px 0;\">\n          <div class=\"sib-optin sib-form-block\" data-required=\"true\">\n            <div class=\"form__entry entry_mcq\">\n              <div class=\"form__label-row \">\n                <div class=\"entry__choice\" style=\"text-align:center;\">\n                  <label>\n                    <input type=\"checkbox\" class=\"input_replaced\" value=\"1\" id=\"OPT_IN\" name=\"OPT_IN\" required \/>\n                    <span class=\"checkbox checkbox_tick_positive\"\n            style=\"margin-left:\"\n            ><\/span><span style=\"font-size:13px; text-align:left; font-family:&quot;Helvetica&quot;, sans-serif; color:#3C4858; background-color:transparent;\"><p>Acepto la <a href=\"https:\/\/aprenderbigdata.com\/privacidad\/\" target=\"_blank\" rel=\"noopener\">pol\u00edtica de privacidad<\/a><\/p><span data-required=\"*\" style=\"display: inline;\" class=\"entry__label entry__label_optin\"><\/span><\/span> <\/label>\n                <\/div>\n              <\/div>\n              <label class=\"entry__error entry__error--primary\" style=\"font-size:16px; text-align:left; font-family:&quot;Helvetica&quot;, sans-serif; color:#661d1d; background-color:#ffeded; border-radius:3px; border-color:#ff4949;\">\n              <\/label>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div style=\"padding: 8px 0;\">\n          <div class=\"sib-form-block\" style=\"text-align: center\">\n            <button class=\"sib-form-block__button sib-form-block__button-with-loader\" style=\"font-size:13px; text-align:center; font-weight:700; font-family:&quot;Helvetica&quot;, sans-serif; color:#FFFFFF; background-color:#13aff0; border-radius:3px; border-width:0px;\" form=\"sib-form\" type=\"submit\">\n              <svg class=\"icon clickable__icon progress-indicator__icon sib-hide-loader-icon\" viewBox=\"0 0 512 512\">\n                <path d=\"M460.116 373.846l-20.823-12.022c-5.541-3.199-7.54-10.159-4.663-15.874 30.137-59.886 28.343-131.652-5.386-189.946-33.641-58.394-94.896-95.833-161.827-99.676C261.028 55.961 256 50.751 256 44.352V20.309c0-6.904 5.808-12.337 12.703-11.982 83.556 4.306 160.163 50.864 202.11 123.677 42.063 72.696 44.079 162.316 6.031 236.832-3.14 6.148-10.75 8.461-16.728 5.01z\" \/>\n              <\/svg>\n              \u00a1SUSCR\u00cdBEME GRATIS!\n            <\/button>\n          <\/div>\n        <\/div>\n\n        <input type=\"text\" name=\"email_address_check\" value=\"\" class=\"input--hidden\">\n        <input type=\"hidden\" name=\"locale\" value=\"en\">\n      <\/form>\n    <\/div>\n  <\/div>\n<\/div>\n<!-- END - We recommend to place the below code where you want the form in your website html  -->\n\n<!-- START - We recommend to place the below code in footer or bottom of your website html  -->\n<script>\n  window.REQUIRED_CODE_ERROR_MESSAGE = 'Please choose a country code';\n  window.LOCALE = 'en';\n  window.EMAIL_INVALID_MESSAGE = window.SMS_INVALID_MESSAGE = \"La informaci\u00f3n proporcionada no es v\u00e1lida. Por favor, revisa el formato y vuelve a intentarlo.\";\n\n  window.REQUIRED_ERROR_MESSAGE = \"Este campo no puede estar vac\u00edo. \";\n\n  window.GENERIC_INVALID_MESSAGE = \"La informaci\u00f3n proporcionada no es v\u00e1lida. Por favor, revisa el formato y vuelve a intentarlo.\";\n\n  window.translation = {\n    common: {\n      selectedList: '{quantity} list selected',\n      selectedLists: '{quantity} lists selected'\n    }\n  };\n\n  var AUTOHIDE = Boolean(1);\n<\/script>\n<script defer src=\"https:\/\/sibforms.com\/forms\/end-form\/build\/main.js\"><\/script>\n\n<!-- END - We recommend to place the above code in footer or bottom of your website html  -->\n<!-- End Brevo Form -->\n\n\n\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas<\/p>\n","protected":false},"author":1,"featured_media":13882,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"ocs-posts-sidebar","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[5],"tags":[173,9],"class_list":["post-13808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-big-data","tag-hotmart","tag-video","entry","has-media"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA<\/title>\n<meta name=\"description\" content=\"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA\" \/>\n<meta property=\"og:description\" content=\"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas\" \/>\n<meta property=\"og:url\" content=\"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/\" \/>\n<meta property=\"og:site_name\" content=\"Aprender BIG DATA\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-21T07:18:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-21T07:18:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Oscar Fernandez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@oscarfmdc\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oscar Fernandez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/\"},\"author\":{\"name\":\"Oscar Fernandez\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#\\\/schema\\\/person\\\/321e79dd84000e4b71b0dac998d5c707\"},\"headline\":\"Patrones Apache Kafka y Buenas Pr\u00e1cticas\",\"datePublished\":\"2025-07-21T07:18:14+00:00\",\"dateModified\":\"2025-07-21T07:18:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/\"},\"wordCount\":1091,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/Patrones-Apache-Kafka.jpg\",\"keywords\":[\"Hotmart\",\"Video\"],\"articleSection\":[\"Gu\u00edas Big Data\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/\",\"url\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/\",\"name\":\"Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/Patrones-Apache-Kafka.jpg\",\"datePublished\":\"2025-07-21T07:18:14+00:00\",\"dateModified\":\"2025-07-21T07:18:16+00:00\",\"description\":\"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#primaryimage\",\"url\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/Patrones-Apache-Kafka.jpg\",\"contentUrl\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/Patrones-Apache-Kafka.jpg\",\"width\":1280,\"height\":720,\"caption\":\"Patrones Apache Kafka\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/patrones-apache-kafka\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/aprenderbigdata.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Patrones Apache Kafka y Buenas Pr\u00e1cticas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#website\",\"url\":\"https:\\\/\\\/aprenderbigdata.com\\\/\",\"name\":\"Aprender BIG DATA\",\"description\":\"Aprende Big Data desde cero\",\"publisher\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/aprenderbigdata.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#organization\",\"name\":\"AprenderBigData\",\"url\":\"https:\\\/\\\/aprenderbigdata.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/cropped-favicon.png\",\"contentUrl\":\"https:\\\/\\\/aprenderbigdata.com\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/cropped-favicon.png\",\"width\":512,\"height\":512,\"caption\":\"AprenderBigData\"},\"image\":{\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/aprenderbigdata.com\\\/#\\\/schema\\\/person\\\/321e79dd84000e4b71b0dac998d5c707\",\"name\":\"Oscar Fernandez\",\"description\":\"Arquitecto de Datos con m\u00e1s de 10 a\u00f1os de experiencia en el sector del Big Data. Autor de cursos de formaci\u00f3n en tecnolog\u00edas Big Data, Cloud y Streaming completados por m\u00e1s de 7000 alumnos en Udemy y otras plataformas. Miembro de la Apache Software Foundation desde 2019.\",\"sameAs\":[\"instagram.com\\\/oscarfmdc\",\"linkedin.com\\\/in\\\/oscarfmdc\\\/\",\"https:\\\/\\\/x.com\\\/oscarfmdc\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCBqzJ1QI3jkkIYXLL9gVpWQ\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA","description":"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/","og_locale":"es_ES","og_type":"article","og_title":"Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA","og_description":"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas","og_url":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/","og_site_name":"Aprender BIG DATA","article_published_time":"2025-07-21T07:18:14+00:00","article_modified_time":"2025-07-21T07:18:16+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","type":"image\/jpeg"}],"author":"Oscar Fernandez","twitter_card":"summary_large_image","twitter_image":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","twitter_creator":"@oscarfmdc","twitter_misc":{"Escrito por":"Oscar Fernandez","Tiempo de lectura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#article","isPartOf":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/"},"author":{"name":"Oscar Fernandez","@id":"https:\/\/aprenderbigdata.com\/#\/schema\/person\/321e79dd84000e4b71b0dac998d5c707"},"headline":"Patrones Apache Kafka y Buenas Pr\u00e1cticas","datePublished":"2025-07-21T07:18:14+00:00","dateModified":"2025-07-21T07:18:16+00:00","mainEntityOfPage":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/"},"wordCount":1091,"commentCount":0,"publisher":{"@id":"https:\/\/aprenderbigdata.com\/#organization"},"image":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#primaryimage"},"thumbnailUrl":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","keywords":["Hotmart","Video"],"articleSection":["Gu\u00edas Big Data"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/","url":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/","name":"Patrones Apache Kafka y Buenas Pr\u00e1cticas - Aprender BIG DATA","isPartOf":{"@id":"https:\/\/aprenderbigdata.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#primaryimage"},"image":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#primaryimage"},"thumbnailUrl":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","datePublished":"2025-07-21T07:18:14+00:00","dateModified":"2025-07-21T07:18:16+00:00","description":"Descubre los principales patrones de Apache Kafka. Aprende a aplicarlos y evita los errores m\u00e1s comunes en arquitecturas distribuidas","breadcrumb":{"@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#primaryimage","url":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","contentUrl":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/Patrones-Apache-Kafka.jpg","width":1280,"height":720,"caption":"Patrones Apache Kafka"},{"@type":"BreadcrumbList","@id":"https:\/\/aprenderbigdata.com\/patrones-apache-kafka\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/aprenderbigdata.com\/"},{"@type":"ListItem","position":2,"name":"Patrones Apache Kafka y Buenas Pr\u00e1cticas"}]},{"@type":"WebSite","@id":"https:\/\/aprenderbigdata.com\/#website","url":"https:\/\/aprenderbigdata.com\/","name":"Aprender BIG DATA","description":"Aprende Big Data desde cero","publisher":{"@id":"https:\/\/aprenderbigdata.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/aprenderbigdata.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/aprenderbigdata.com\/#organization","name":"AprenderBigData","url":"https:\/\/aprenderbigdata.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/aprenderbigdata.com\/#\/schema\/logo\/image\/","url":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/2019\/08\/cropped-favicon.png","contentUrl":"https:\/\/aprenderbigdata.com\/wp-content\/uploads\/2019\/08\/cropped-favicon.png","width":512,"height":512,"caption":"AprenderBigData"},"image":{"@id":"https:\/\/aprenderbigdata.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/aprenderbigdata.com\/#\/schema\/person\/321e79dd84000e4b71b0dac998d5c707","name":"Oscar Fernandez","description":"Arquitecto de Datos con m\u00e1s de 10 a\u00f1os de experiencia en el sector del Big Data. Autor de cursos de formaci\u00f3n en tecnolog\u00edas Big Data, Cloud y Streaming completados por m\u00e1s de 7000 alumnos en Udemy y otras plataformas. Miembro de la Apache Software Foundation desde 2019.","sameAs":["instagram.com\/oscarfmdc","linkedin.com\/in\/oscarfmdc\/","https:\/\/x.com\/oscarfmdc","https:\/\/www.youtube.com\/channel\/UCBqzJ1QI3jkkIYXLL9gVpWQ"]}]}},"_links":{"self":[{"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/posts\/13808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/comments?post=13808"}],"version-history":[{"count":15,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/posts\/13808\/revisions"}],"predecessor-version":[{"id":14065,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/posts\/13808\/revisions\/14065"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/media\/13882"}],"wp:attachment":[{"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/media?parent=13808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/categories?post=13808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aprenderbigdata.com\/wp-json\/wp\/v2\/tags?post=13808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}