Skip to content
Katabench
Try free
Course preview Katabench Labs for .NET developers

Build a production outbox.
Then break it on purpose.

Take the on-call seat for a commerce relay. Recover through the failure windows, scale competing workers, survive real process and broker failures, and finish with a measured flash-sale game day.

Advanced .NET · PostgreSQL · RabbitMQ · Disposable browser workspace · Pro workspace in private beta

The Orders API commits an order and outbox row in PostgreSQL, fenced relays publish to RabbitMQ, and eight incidents prove recovery from crash and pressure windows.
The architecture and failure boundaries covered by the course.
Course
1
Lab
1
Incidents
8
Practice
125 min

One course, deeply finished

An on-call shift you can rehearse safely

Start with one advanced course, built around eight connected incidents. Each lesson builds on the previous fixes and adds the next production invariant, so the final game day tests the system you actually built.

Module 1

Make every accepted order publishable

Close the dual-write gap, then build a hot-table index that stays cheap as history grows.

  • Atomic order + outbox commit
  • Partial due-work index

Module 2

Survive competing relays

Fence publisher-confirm completion, split claims, reclaim dead workers, and face the acknowledgement gap.

  • Publisher confirms
  • SKIP LOCKED
  • Lease reclaim
  • Replay-safe consumer inbox

Module 3

Operate under pressure

Separate event poison from dependency outage, then drain a 200-order flash sale.

  • Poison vs outage
  • Four-relay game day

Save the orders: the production outbox lab

1 lab · 8 lessons · 125 minutes · Advanced

View course preview

The lesson loop

Challenging decisions, not typing marathons

The full implementation stays visible for code reading. You change the handful of lines that carry the design decision, using copy or Insert at cursor, then explain and prove the result.

OutboxDispatcher.cs
FOR UPDATE SKIP LOCKED

Interlocked.Exchange(
    ref transportCircuitOpen, 1);
await ReleaseTransportFailureAsync(...);
  1. 1

    Reproduce

    Run the failing scenario against real PostgreSQL and RabbitMQ.

  2. 2

    Inspect

    Compare database truth, broker truth, query plans, leases, and acknowledgements.

  3. 3

    Patch

    Make one focused engineering decision using a ready-to-insert snippet.

  4. 4

    Prove

    Clear an executable invariant that rereads the real systems, not your source text.

Executable evidence

The check reads the systems, not your source

PostgreSQL

Rows, leases, fencing tokens, queue buckets, and real query plans.

RabbitMQ

Publisher confirms, durable queues, redelivery, and transactional consumer deduplication.

Processes

SIGKILL, competing relays, post-ack crashes, and bounded concurrency.

Operations

Lag, retry budgets, dead letters, retention, and a 200-order drain.

Preview the Production Outbox lab

Explore the complete course experience while live Pro workspaces remain in private beta.

Practice in the playground

Get new puzzles and .NET tips in your inbox

A short note when fresh kata land, plus the C# and performance tricks behind the grading. No spam, unsubscribe anytime.