---
title: "Kafka Simulator v1.9 - a camada de plataforma e um formato de URL público"
date: 2026-10-09T00:00:00.000Z
author: "michal"
excerpt: "Observadores do Multi-Region Cluster, Cluster Linking e armazenamento em camadas completam a história de DR e de armazenamento em doze cenários - e o formato de URL do playground se torna público, com o monedula-sim-link para transformar um cluster em execução, ou a descrição de um agente de IA, em um link."
---
A v1.9 acrescenta **12 novos cenários** - mais dez no módulo dr e dois em um novo módulo tiered-storage - e leva o currículo do [Kafka Simulator](/kafka-simulator/) a **112 de 134**. Ela também publica algo de que o simulador depende desde o início: o formato dos seus links.

## O que há na v1.9

**Mais recuperação de desastres (`dr`, 10 cenários).** Duas respostas de plataforma aos problemas que a v1.8 apresentou com o MirrorMaker 2:

- **[Observadores do Multi-Region Cluster](/kafka-simulator/scenarios/mrc-observers/)** - réplicas que acompanham o log sem entrar no ISR, de modo que uma cópia remota não custa nada no caminho de escrita. [Quanto os observadores ficam para trás](/kafka-simulator/scenarios/observer-lag/), [onde posicioná-los](/kafka-simulator/scenarios/durability-vs-latency/) e [como são promovidos](/kafka-simulator/scenarios/observer-promotion/) - incluindo [o caso em que a promoção precisa de um líder que ela já não consegue alcançar](/kafka-simulator/scenarios/observer-promotion-reachable-leader/).
- **[Cluster Linking](/kafka-simulator/scenarios/cluster-linking-offset-preserving/)** - um mirror byte a byte que preserva os offsets, de modo que um consumidor que faz failover não precisa de tradução. [Os tópicos espelho continuam somente leitura até serem promovidos](/kafka-simulator/scenarios/mirror-read-only-promote-writable/), [os offsets confirmados dos consumidores são sincronizados pelo link tal como estão](/kafka-simulator/scenarios/consumer-offset-sync-link/), [o link se inverte no lugar para um failback limpo](/kafka-simulator/scenarios/bidirectional-links-failback/), e [um cenário executa o Cluster Linking lado a lado com o MirrorMaker 2](/kafka-simulator/scenarios/cluster-linking-vs-mm2/) na mesma topologia. O free play ganha o controle correspondente: um editor de regiões e de links de mirror nas topologias de duas regiões, onde cada link é MirrorMaker 2 ou Cluster Linking e pode ser invertido.

**Armazenamento em camadas (`tiered-storage`, 2 cenários).** Segmentos antigos descarregados para o armazenamento de objetos: [o ciclo de vida completo de descarga, leitura de volta e expiração](/kafka-simulator/scenarios/confluent-tiered-lifecycle/), com `localStartOffset` e `logStartOffset` se afastando um do outro - e a [retenção infinita](/kafka-simulator/scenarios/infinite-retention-tiered/), em que os segmentos envelhecidos saem do disco local, mas um consumidor atrasado ainda lê de volta cada um deles.

## Toda sessão é um link

O playground guarda todo o seu estado na URL. Um link pode abrir um cenário roteirizado em um passo específico, reproduzir uma sequência de operações no cluster ou montar um cluster free-play personalizado - e é assim que funciona todo botão de "compartilhar" do simulador.

A partir da v1.9, esse formato é [público e está documentado](/flock/docs/kafka-simulator/reference/url-format/) (em inglês): os parâmetros de query, a gramática do log de ações, a codificação da forma do cluster e o que o playground faz com uma entrada que ele não consegue interpretar. Cada exemplo da especificação é decodificado pela própria suíte de testes do simulador, por isso o documento não tem como se desalinhar do código.

Um formato documentado significa que os links podem vir de outro lugar que não o playground - um script, um job de CI ou um agente de IA. O primeiro gerador sai junto com esta versão.

## monedula-sim-link: um cluster real como link

Descrever à mão o cluster com o qual você realmente se importa - broker a broker, tópico a tópico - é demorado e propenso a erros. O [monedula-sim-link](/pt/flock/sim-link/) é uma pequena CLI em Go que se conecta em modo **somente leitura** a um cluster Kafka real e imprime o link do playground que visualiza esse cluster:

```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=…
```

O link abre o cluster em execução como um simulador: brokers, tópicos, posicionamento de partições, fator de replicação, brokers offline, lacunas de ISR, grupos de consumidores com os seus membros, configurações de tópico e uma amostra do volume de dados - uma imagem que você pode pausar, percorrer passo a passo, quebrar sem tocar na produção e enviar a um colega no meio de um incidente, em vez de um parágrafo que a descreva.

**Somente leitura, e auditável em um único arquivo.** Apontar uma ferramenta para um cluster de produção é uma decisão de confiança, por isso a garantia é estreita e explícita. O `connect` envia apenas requisições de leitura - ApiVersions, Metadata, ListOffsets e, para grupos e configurações, ListGroups, DescribeGroups, OffsetFetch e DescribeConfigs. A requisição Metadata define `AllowAutoTopicCreation=false`, então nem mesmo consultar um tópico pode criar um tópico. Nenhum registro é produzido, nenhuma configuração é alterada, nenhum grupo recebe um novo membro, nenhum offset é confirmado. Toda a superfície do cliente fica em um único arquivo, [`snapshot/kafka.go`](https://github.com/monedula-dev/monedula-sim-link/blob/main/snapshot/kafka.go), com testes que provam que uma consulta que falha não cria o tópico automaticamente e que ler os offsets de um grupo nunca os altera.

**Se encaixa no jeito como os clusters são protegidos.** TLS, TLS mútuo e SASL/SCRAM são suportados, com a senha lida de `MONEDULA_SIM_LINK_PASSWORD` para que ela fique fora do histórico do 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
```

Os tópicos são selecionados por nome exato, por regex ou pelos dois, e `--dry-run` imprime os mapeamentos dos nomes reais para os nomes do simulador e o tamanho de cluster derivado antes de entregar a URL a você. Tudo o que o link codifica é uma descrição compacta da forma e uma amostra do volume; o simulador não tem backend, por isso os seus dados nunca saem da sua máquina.

## Um servidor MCP para agentes de IA

O `monedula-sim-link mcp` fala o **Model Context Protocol** via stdio, para que o Claude Code, o Claude Desktop ou qualquer outro cliente MCP possam construir links sob demanda. Peça "me mostre um cluster de 6 brokers em que o líder de `orders` morre" ou "visualize o nosso cluster de staging", e o agente devolve um link que abre exatamente isso. O servidor expõe quatro ferramentas:

- **`build_playground_url`** - uma sessão free-play a partir de uma descrição declarativa: uma topologia, uma forma de cluster (brokers; tópicos com partições, RF, `min.insync.replicas`, política de limpeza; rack awareness) e uma lista ordenada de ações temporizadas - produzir registros, matar e reiniciar brokers, adicionar produtores e grupos de consumidores, mudanças de configuração, reatribuição, descarga para o armazenamento em camadas, throttling.
- **`open_scenario`** - o link para um dos cenários roteirizados selecionados, pelo seu id com pontos (por exemplo, `00.1.3`).
- **`validate_actions`** - o que o playground *de fato* carregaria a partir de uma string `actions` bruta ou de uma URL completa: as ações que sobrevivem, cada entrada descartada com o seu motivo, e o comprimento e a contagem comparados aos limites do codec.
- **`cluster_to_url`** - o snapshot do `connect` como ferramenta, com a mesma garantia de somente leitura.

Entregar a construção de URLs a um LLM é exatamente onde as coisas dão errado em silêncio - um separador corrompido, um caminho de configuração que o simulador não aceita, um valor de `actions` acima do limite de comprimento - e o playground descarta silenciosamente o que ele não consegue interpretar. Por isso, toda ferramenta passa pelo mesmo codec fail-fast que a CLI, e nenhuma URL é retornada a menos que o seu valor de `actions` decodifique de volta para o log idêntico. Quando a validação falha, o erro aponta o campo, o separador ou o caminho de configuração problemático, para que o agente possa corrigir a própria entrada em vez de entregar um link truncado.

Registrar o servidor no Claude Code leva uma linha:

```bash
claude mcp add monedula-sim-link -- monedula-sim-link mcp
```

No Claude Desktop, adicione-o ao `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "monedula-sim-link": {
      "command": "monedula-sim-link",
      "args": ["mcp", "--base-url", "https://monedula.dev/kafka-simulator/playground"]
    }
  }
}
```

O `--base-url` é opcional; aponte-o para `http://localhost:4321/kafka-simulator/playground` para gerar links para um servidor de desenvolvimento local. O servidor é construído sobre o [`modelcontextprotocol/go-sdk`](https://github.com/modelcontextprotocol/go-sdk) oficial.

O monedula-sim-link vive no seu próprio repositório open source, [monedula-dev/monedula-sim-link](https://github.com/monedula-dev/monedula-sim-link) no GitHub - um módulo Go autocontido sob a licença Apache-2.0, instalado com `go install` ou como binário pré-compilado para Linux, macOS e Windows a partir da [página de releases](https://github.com/monedula-dev/monedula-sim-link/releases). Ele não envia telemetria e é o gerador de referência do formato de URL: um link gerado pela ferramenta é decodificado no playground exatamente no log que a ferramenta escreveu.

## Escalar um cluster do jeito que o Kafka faz

O free play agora muda o número de brokers do jeito que um cluster real faz. Até a v1.9, adicionar um broker rebalanceava silenciosamente as partições para ele - o que, como um leitor [apontou](https://github.com/monedula-dev/monedula-kafka-simulator-issues/issues/1), não é o que o Kafka faz. Um broker que você adiciona agora entra vazio: nenhuma partição passa para ele por conta própria, e o inspetor do cluster indica isso, com um botão **Rebalance partitions** ao lado. No terminal, `kafka-reassign-partitions --generate` propõe um plano a partir de uma lista de tópicos e de uma lista de brokers, `--execute` o inicia e `--verify` o confirma. A outra direção segue a mesma regra: um broker que ainda tem partições precisa ser drenado antes de poder ser removido, na mesma ordem em que você desativaria um broker real.

Abra o [simulador](/kafka-simulator/), faça o failover de uma região com Cluster Linking e compartilhe o link.