queues

  • A retry policy copied from a tutorial in 2019

    Three attempts, one second apart, applied to every consumer regardless of what it does. One retry policy across four consumers means three of them are wrong, and the…

  • A consumer that stopped on a poison message, on purpose

    A message that cannot be processed and must not be skipped, in a stream where order matters. Halting is the right answer when skipping would corrupt the state…

  • Quorum queues, and the mirroring we removed

    Classic mirrored queues have been the deprecated way to get replication for a while, and the replacement has different failure behaviour worth understanding first. The throughput cost is…

  • An outbox, and the publisher we removed from the transaction

    An order committed and an event never published, twice in one week. A broker call inside a database transaction, and a rollback after it.

  • Testing a queue by asserting the payload, not the effect

    A test that dispatched a job and then asserted on the database is testing two things and failing for two reasons. Splitting at the queue boundary is the…

  • A saga in a table, because the alternative was a framework

    A three-step process across two external systems, needing compensation when step two fails, and no appetite for a workflow engine. A state machine in a table, advanced by…

  • An event log that is not an event store

    Wanting to know what happened to an order without adopting event sourcing. A support question that takes twenty minutes and three tables.

  • Message versioning by adding fields only

    A message shape is a contract with every consumer that exists and every consumer that is mid-deploy. Adding an optional field is safe because an old consumer ignores…

  • A queued listener that should have been a job

    An event listener marked as queued, doing 20 seconds of PDF generation, and failing in a way that made the original event look like the problem. A queued…

  • An outbox table, and the relay that reads it

    Publishing to a broker inside a database transaction is two systems and one commit, which cannot be made atomic. The index on (published_at, id) with nulls first is…