DDD Europe 2027 - Queues vs Streams - What We Learned from Chris Simon at DDD Europe

Blog

Queues vs Streams - What We Learned from Chris Simon at DDD Europe

Queues vs Streams - What We Learned from Chris Simon at DDD Europe

Posted on 2026-09-07 - 4 minute read

Chris Simon's talk, "It's Like 10,000 Streams When What You Need Is a Queue," tackles a question every team building event-driven architecture eventually hits: once you've done the event storming and identified your domain events, which technology should actually carry them? A queue, such as RabbitMQ or SQS? A stream, such as Kafka? Or an event store? Here's what we took away.

Queues and streams solve different problems, not the same problem differently

The core distinction is statefulness. With a queue, the broker tracks whether a message has been consumed. With a stream, that responsibility sits with the consumer, which has to track its own read position (its offset) in the log. This single difference cascades into everything else: how each system scales, how each recovers from failures, and how each handles a message that repeatedly fails to process.

Queues give you dead-letter queues and automatic retry handling for free. Streams give you a durable history of every message ever sent, but leave failure handling and read-position tracking to you.

Pick based on what you actually need, not what's trendy

The talk offers a clear, practical heuristic:

  • Business process choreography, where every message matters and a missed one means a missed payment or shipment, calls for a queue.
  • Streaming analytics, where individual messages are less important than the overall pattern, is what streams were built for.
  • State management and historical record-keeping is the job of a dedicated event store, not a repurposed stream.

Trying to make Kafka do the job of an event store, Simon argues, is a common and costly mistake: streams are optimised to query by topic and offset, while event sourcing needs to query by entity, a fundamentally different access pattern.

Public and private events need very different treatment

One of the clearer distinctions in the talk is between private domain events, which support internal decision-making, and public domain events, which other bounded contexts subscribe to. Public events should stay thin, carrying only what's needed, since anything more increases the risk that changing that event breaks a downstream consumer. Simon's practical fix for keeping public events genuinely thin without falling into the "clickbait event" anti-pattern: put the data where it's actually needed at the point each bounded context is designed, rather than forcing consumers to call back for more information.

What participants said:

It was both fun and useful!

Spot on on everything and a great speaker. Ensure everyone in the organisation sees the talk.

Watch the full talk for the complete walkthrough, including live comparisons of message distribution, consumer scale-out, and failure handling across queues and streams.

Watch this video on YouTube

Chris also has an upcoming workshop at DDD Academy: Imagine the Future and Build for the Now (Australian timezone).