---
title: "Kafka Simulator v1.9 - la capa de plataforma y un formato de URL público"
date: 2026-10-09T00:00:00.000Z
author: "michal"
excerpt: "Los observadores de Multi-Region Cluster, Cluster Linking y el almacenamiento por niveles completan la historia de DR y de almacenamiento en doce escenarios - y el formato de URL del playground se hace público, con monedula-sim-link para convertir un clúster en vivo, o la descripción de un agente de IA, en un enlace."
---
v1.9 añade **12 escenarios nuevos** - diez más en el módulo dr y dos en un nuevo módulo tiered-storage - y lleva el temario del [Kafka Simulator](/kafka-simulator/) a **112 de 134**. Además publica algo en lo que el simulador se ha apoyado desde el principio: el formato de sus enlaces.

## Qué trae la v1.9

**Más recuperación ante desastres (`dr`, 10 escenarios).** Dos respuestas de plataforma a los problemas que la v1.8 planteó con MirrorMaker 2:

- **[Observadores de Multi-Region Cluster](/kafka-simulator/scenarios/mrc-observers/)** - réplicas que siguen el log sin entrar en el ISR, de modo que una copia remota no cuesta nada en el camino de escritura. [Cuánto se retrasan](/kafka-simulator/scenarios/observer-lag/), [dónde colocarlos](/kafka-simulator/scenarios/durability-vs-latency/) y [cómo se promocionan](/kafka-simulator/scenarios/observer-promotion/) - incluido [el caso en que la promoción necesita un líder al que ya no puede llegar](/kafka-simulator/scenarios/observer-promotion-reachable-leader/).
- **[Cluster Linking](/kafka-simulator/scenarios/cluster-linking-offset-preserving/)** - un mirror byte a byte que conserva los offsets, así que un consumidor que hace failover no necesita traducción. [Los mirror topics siguen siendo de solo lectura hasta que se promocionan](/kafka-simulator/scenarios/mirror-read-only-promote-writable/), [los offsets confirmados de los consumidores se sincronizan a través del enlace tal cual](/kafka-simulator/scenarios/consumer-offset-sync-link/), [el enlace se invierte in situ para un failback limpio](/kafka-simulator/scenarios/bidirectional-links-failback/), y [un escenario lo ejecuta lado a lado con MirrorMaker 2](/kafka-simulator/scenarios/cluster-linking-vs-mm2/) sobre la misma topología. El free play gana el control correspondiente: un editor de regiones y de enlaces de mirror en las topologías de dos regiones, donde cada enlace es MirrorMaker 2 o Cluster Linking y se puede invertir.

**Almacenamiento por niveles (`tiered-storage`, 2 escenarios).** Segmentos antiguos descargados al almacenamiento de objetos: [el ciclo de vida completo de descarga, relectura y expiración](/kafka-simulator/scenarios/confluent-tiered-lifecycle/), con `localStartOffset` y `logStartOffset` separándose - y [la retención infinita](/kafka-simulator/scenarios/infinite-retention-tiered/), donde los segmentos envejecidos salen del disco local pero un consumidor rezagado aun así vuelve a leerlos todos.

## Cada sesión es un enlace

El playground guarda todo su estado en la URL. Un enlace puede abrir un escenario guionizado en un paso concreto, reproducir una secuencia de operaciones sobre el clúster o levantar un clúster de free play personalizado - y así es como funciona cada botón de «compartir» del simulador.

Desde la v1.9 ese formato es [público y está documentado](/flock/docs/kafka-simulator/reference/url-format/) (en inglés): los parámetros de consulta, la gramática del registro de acciones, la codificación de la forma del clúster y lo que hace el playground con una entrada que no puede analizar. La propia batería de tests del simulador decodifica cada ejemplo de la especificación, así que el documento no puede desincronizarse del código.

Un formato documentado significa que los enlaces pueden venir de otro sitio que no sea el playground - un script, un job de CI o un agente de IA. El primer generador llega con esta versión.

## monedula-sim-link: un clúster real como enlace

Describir a mano el clúster que de verdad te importa - broker por broker, topic por topic - es tedioso y propenso a errores. [monedula-sim-link](/es/flock/sim-link/) es una pequeña CLI en Go que se conecta **en modo de solo lectura** a un clúster de Kafka real e imprime el enlace del playground que lo visualiza:

```bash
$ go install github.com/monedula-dev/monedula-sim-link/cmd/monedula-sim-link@latest
$ monedula-sim-link connect --brokers localhost:9092 --topics orders,payments
https://monedula.dev/kafka-simulator/playground?scenario=free&actions=…&size=…
```

El enlace abre el clúster en vivo como un simulador: brokers, topics, colocación de particiones, factor de replicación, brokers fuera de línea, huecos de ISR, grupos de consumidores con sus miembros, configuraciones de topic y una muestra del volumen de datos - una imagen que puedes pausar, recorrer paso a paso, romper sin tocar producción y enviar a un compañero en mitad de un incidente en lugar de un párrafo que la describa.

**Solo lectura, y auditable en un solo archivo.** Apuntar una herramienta a un clúster de producción es una decisión de confianza, así que la garantía es acotada y explícita. `connect` emite únicamente peticiones de lectura - ApiVersions, Metadata, ListOffsets y, para grupos y configuraciones, ListGroups, DescribeGroups, OffsetFetch y DescribeConfigs. Metadata fija `AllowAutoTopicCreation=false`, así que ni siquiera buscar un topic puede llegar a crearlo. No se produce ningún registro, no se cambia ninguna configuración, no se entra en ningún grupo, no se confirma ningún offset. Toda la superficie del cliente vive en un solo archivo, [`snapshot/kafka.go`](https://github.com/monedula-dev/monedula-sim-link/blob/main/snapshot/kafka.go), con tests que demuestran que una búsqueda fallida no crea automáticamente el topic y que leer los offsets de un grupo nunca los cambia.

**Se adapta a cómo se protegen los clústeres.** Se admiten TLS, TLS mutuo y SASL/SCRAM, y la contraseña se lee de `MONEDULA_SIM_LINK_PASSWORD` para que no quede en el historial de la shell:

```bash
export MONEDULA_SIM_LINK_PASSWORD='…'
monedula-sim-link connect --brokers broker1:9093,broker2:9093 \
  --tls --ca-cert ./cluster-ca.pem \
  --sasl-mechanism scram-sha-512 --username viewer
```

Los topics se seleccionan por nombre exacto, por regex o de ambas formas, y `--dry-run` imprime las correspondencias de nombres entre el clúster real y el simulador y el tamaño de clúster derivado antes de darte la URL. Todo lo que codifica el enlace es una descripción compacta de la forma y una muestra del volumen; el simulador no tiene backend, así que tus datos nunca salen de tu máquina.

## Un servidor MCP para agentes de IA

`monedula-sim-link mcp` habla el **Model Context Protocol** sobre stdio, de modo que Claude Code, Claude Desktop o cualquier otro cliente MCP pueden construir enlaces a petición. Pide «muéstrame un clúster de 6 brokers en el que muere el líder de `orders`» o «visualiza nuestro clúster de staging», y el agente devuelve un enlace que abre exactamente eso. El servidor expone cuatro herramientas:

- **`build_playground_url`** - una sesión de free play a partir de una descripción declarativa: una topología, una forma de clúster (brokers; topics con particiones, RF, `min.insync.replicas`, política de limpieza; rack awareness) y una lista ordenada de acciones programadas - producir registros, matar y reiniciar brokers, añadir productores y grupos de consumidores, cambios de configuración, reasignación, descarga al almacenamiento por niveles, throttling.
- **`open_scenario`** - el enlace a uno de los escenarios guionizados seleccionados, por su identificador con puntos (p. ej. `00.1.3`).
- **`validate_actions`** - lo que el playground cargaría *realmente* a partir de una cadena `actions` en bruto o de una URL completa: las acciones que sobreviven, cada entrada descartada con su motivo, y la longitud y el recuento frente a los límites del códec.
- **`cluster_to_url`** - la instantánea de `connect` como herramienta, con la misma garantía de solo lectura.

Dejar la construcción de URLs en manos de un LLM es justo donde las cosas se tuercen sin hacer ruido - un separador mal formado, una ruta de configuración que el simulador no acepta, un valor `actions` que supera el límite de longitud - y el playground descarta en silencio lo que no puede analizar. Por eso cada herramienta pasa por el mismo códec fail-fast que la CLI, y no se devuelve ninguna URL a menos que su valor `actions` se decodifique de vuelta exactamente en el mismo log. Cuando la validación falla, el error indica el campo, el separador o la ruta de configuración culpables, para que el agente pueda corregir su entrada en lugar de entregar un enlace truncado.

Registrarlo en Claude Code requiere una sola línea:

```bash
claude mcp add monedula-sim-link -- monedula-sim-link mcp
```

Para Claude Desktop, añádelo a `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "monedula-sim-link": {
      "command": "monedula-sim-link",
      "args": ["mcp", "--base-url", "https://monedula.dev/kafka-simulator/playground"]
    }
  }
}
```

`--base-url` es opcional; apúntalo a `http://localhost:4321/kafka-simulator/playground` para generar enlaces contra un servidor de desarrollo local. El servidor está construido sobre el [`modelcontextprotocol/go-sdk`](https://github.com/modelcontextprotocol/go-sdk) oficial.

monedula-sim-link vive en su propio repositorio de código abierto, [monedula-dev/monedula-sim-link](https://github.com/monedula-dev/monedula-sim-link) en GitHub - un módulo de Go autocontenido bajo la licencia Apache-2.0, que se instala con `go install` o como binario precompilado para Linux, macOS y Windows desde la [página de releases](https://github.com/monedula-dev/monedula-sim-link/releases). La herramienta no envía telemetría y es el generador de referencia del formato de URL: un enlace que produce se decodifica en el playground exactamente en el log que escribió.

## Escalar un clúster como lo hace Kafka

El free play cambia ahora el número de brokers como lo hace un clúster real. Hasta la v1.9, añadir un broker rebalanceaba en silencio particiones hacia él - lo cual, como [señaló](https://github.com/monedula-dev/monedula-kafka-simulator-issues/issues/1) un lector, no es lo que hace Kafka. Ahora, un broker que añades entra vacío: ninguna partición se mueve a él por sí sola, y el inspector del clúster lo indica, con un botón **Rebalance partitions** al lado. En el terminal, `kafka-reassign-partitions --generate` propone un plan a partir de una lista de topics y una lista de brokers, `--execute` lo inicia y `--verify` lo confirma. La otra dirección sigue la misma regla: un broker que aún tiene particiones tiene que drenarse antes de poder retirarlo, en el mismo orden en que darías de baja uno real.

Abre el [simulador](/kafka-simulator/), haz failover de una región con Cluster Linking y comparte el enlace.