---
title: "Multi-region active-active Kafka event backbone"
description: "Each region writes only its own region-named topic, mirrored both ways. Region-pinned consumers read the global Kafka stream once; a cut only delays it."
url: https://monedula.dev/kafka-simulator/scenarios/active-active-event-backbone/
---

# Multi-region active-active Kafka event backbone

Scenario 12.0.4 · Capstone: multi-DC active-active event backbone. Capstones · Advanced · about 4 min · Apache Kafka 4.3.

Two regions each own a region-named topic, mirror it bidirectionally (local read/write, remote read-only), and run region-pinned consumers subscribed to both - so every side reads the global stream exactly once. An inter-region cut grows mirror lag; a heal drains it.

Run it: https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4

## What you start with

A global active-active event backbone built the safe way. Each region owns and writes only its own region-prefixed topic (`west.events` / `east.events`), each topic is mirrored bidirectionally to the other region with an identity policy (local read/write, remote read-only), and a region-pinned consumer on each side subscribes to BOTH topics - so every region reads the full global stream exactly once. An inter-region cut then grows mirror lag, and a heal drains it.

## Step by step

1. **Active-active backbone ready** (t+0.000s): West owns west.events (local r/w) and mirrors it east; East owns east.events and mirrors it west. Each region runs its own 3-voter KRaft quorum and a region-pinned consumer subscribed to BOTH topics - so each side reads the global stream. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4&t=0)
2. **Both writes propagate to both sides** (t+1.600s): pw wrote Ew1 to west.events and pe wrote Ee1 to east.events. The bidirectional mirror carries each write to the other region, so both region-pinned consumers converge on the same global set - each event read exactly once per side. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4&t=1)
3. **Inter-region cut - local writes continue** (t+2.200s): The link between regions is cut. Each region keeps taking LOCAL writes against its own quorum (Ew2 on west, Ee2 on east) - active-active means neither side depends on the other to serve. The cross-region mirror can no longer flow. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4&t=2)
4. **Mirror lag grows across the cut** (t+2.900s): With the regions partitioned, the new local writes (Ew2, Ee2) pile up un-mirrored - each side's view of the OTHER region's stream falls behind. The lag is the unreplicated backlog waiting on the link. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4&t=3)
5. **Healed - backlog drains, sides re-converge** (t+3.600s): The link heals; the backlogged writes mirror across in both directions and both region-pinned consumers re-converge on the full global stream. No write was lost - active-active tolerates an inter-region outage and catches up. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=12.0.4&t=4)

## The takeaway

Region-namespaced topics plus identity bidirectional mirrors let both regions take writes at once while every consumer still sees the de-duplicated global stream - and an inter-region partition only stalls cross-region delivery, never local writes.

## Further reading

- [Apache Kafka documentation](https://kafka.apache.org/43/operations/geo-replication-cross-cluster-data-mirroring/)
