Pulsar's separation of serving from storage is its great strength and the reason its incidents are so hard to place: the symptom you see on the broker almost always started one layer down.
The defaults work. Until one bookie's journal disk cannot fsync fast enough and every producer whose topic touches that bookie slows down at once — because a write is not acknowledged until the ack quorum has it on disk. Until a broker's off-heap memory fills and Netty throws OutOfDirectMemoryError, killing the broker while the heap dashboard still reads green. Until a GC pause outlasts the ZooKeeper session timeout, the broker is fenced, loses its bundles, and every client on it reconnects at once. Until a consumer stalls, backlog crosses its backlog quota, and the policy you never set turns a consumer problem into a producer outage. Until a bookie fills to diskUsageThreshold, flips to read-only, and new ledgers fail with NotEnoughBookiesException.
These guides are written for engineers who already run Pulsar, not for people learning what a topic is. The goal is the mental model of how brokers, BookKeeper, and the metadata store actually behave under load, the failure patterns that keep recurring across the two layers, the monitoring story that catches them before they page anyone, and the runbooks you wish someone had handed you before your last incident.