Skip to main content

Learning Resources

This module is populated from the local chunked books in library/raw/semester-08-system-design-leadership/books and a curated set of canonical external references. Use this page as a source map, not as an instruction to read everything. Each concept file already carries its targeted "Read This Only If Stuck" list; this page is the module-wide index that explains why those sources exist and how to navigate between them.

Source Stack

SourceRoleHow to use it in this module
Fundamentals of Software Architecture (Richards & Ford), Ch. 14Primary teaching sourceDefault escalation for broker/mediator topology, async capabilities, request-reply over events, data loss prevention
System Design Primer (Martin, open source)Selective supportShort reinforcements on asynchronism, queues, consistency/availability patterns, cache update patterns, communication styles
Designing Event-Driven Systems (Ben Stopford, O'Reilly)Extended narrativeUse the free PDF for Kafka-as-platform reasoning and stream processing framing
Building Microservices (Sam Newman)Cross-module supportCh. on async comms; most microservices-specific event material is in S8M2
Designing Data-Intensive Applications (Kleppmann)Deep diveS6 path; here used only if you want depth on replication, stream processing, and delivery semantics
Martin Fowler's event-driven essaysCanonical framingSingle best short reference for the four lenses (notification, ECST, sourcing, CQRS)
Chris Richardson's microservices.io pattern languagePattern catalogDefault entry point for Saga, Outbox, CQRS, Event Sourcing, Idempotent Consumer
Greg Young, CQRS DocumentsCQRS/ES originLong-form write-up from the person who named modern CQRS
Alberto Brandolini, EventStormingDiscovery workshopThe practical way to derive a clean event list before code

Primary Chunks from Fundamentals of Software Architecture (Ch. 14)

These are the chunks this module leans on most heavily. Open them first when you need depth.

ChunkConcept homeWhy
041 -- Event-Driven Architecture StyleC1-C5 (foundational)Broker vs mediator topology; initiating vs processing events
042 -- Mediator TopologyC4 (orchestration)The orchestrator's place in the topology and its tradeoffs
043 -- Asynchronous CapabilitiesC1, C2, C3Why event-driven is naturally fire-and-forget; response-time framing
044 -- Preventing Data LossC2 (outbox), C3 (brokers), C4 (sagas), C5 (ES)Durability, acks, DLQ design -- the through-line for reliable events
045 -- Request-ReplyC1 (commands), C4 (orchestration)Sync-over-async mechanics when you truly need a reply
046 -- Event-Driven RatingsC3, C5Scalability/elasticity/evolvability ratings EDA earns and pays for
049 -- Data CollisionsC3 (ordering), C4 (idempotency)Concurrent-update failure modes that show up in consumer design

Primary Chunks from System Design Primer

ChunkConcept homeWhy
18 -- AsynchronismC1, C2, C3, C4The compact queue / task-queue / back-pressure framing; reappears in every cluster
05 -- Consistency patternsC3 (event-driven state), C4 (sagas), C5 (projections/CQRS)Eventual-consistency vocabulary EDA runs on
06 -- Availability patternsC2 (ECST), C3, C4Why independent subscribers and outbox-backed publish improve the availability envelope
17 -- Cache update patternsC5 (projections)Comparison substrate for "projection as derived, eventually-consistent view"
13 -- Database federation / shardingC3 (partitions)Sharding analogy for Kafka partition keys and hot partitions
21 -- Communication: RPC / RESTC1 (events vs requests)Synchronous end of the spectrum; contrast for when sync is the better tool

Resource Map by Cluster

Cluster 1: Events as a Mental Model

NeedBest resourceWhy
The mental model: event vs requestRichards & Ford: Event-Driven Architecture StyleContrasts request-based and event-based models with worked examples
Async postureRichards & Ford: Asynchronous CapabilitiesWhy event-driven is naturally fire-and-forget
Disentangling "event-driven"Fowler: What do you mean by "Event-Driven"?The four-lens essay; the single most clarifying reference
Events as a domain primitiveMicroservices.io: Domain events and Fowler: Domain EventCompact pattern entries that tie event to DDD
Event message vs command messageEIP: Event Message and Command MessageThe 2003-vintage canonical definitions
Command/query separation originFowler: Command Query SeparationMeyer's principle extended to service messaging
CRUD-to-events mental shiftSystem Design Primer: Asynchronism + Confluent: It's Okay To Store Data In KafkaShort, operational framing + Kafka-as-storage argument
Discovery / workshop practiceAlberto Brandolini: EventStormingForces teams to model in past-tense facts
Deep dive (optional)Kleppmann: Turning the Database Inside Out (talk) and Kleppmann: Stream Processing / Event Sourcing / Reactive / CEP50-min lecture + essay that reframe DBs as caches of a log

Cluster 2: Messaging Patterns

NeedBest resourceWhy
Pub-sub vs point-to-pointSystem Design Primer: Asynchronism + EIP: Publish-Subscribe Channel + Point-to-Point ChannelCanonical delivery-model references
Fanout in productionAWS: Fanout SNS -> SQS and AWS: Event-driven architecture overviewThe "pub-sub in front, point-to-point behind" pattern made concrete
Notification vs ECSTFowler: Event-Carried State Transfer + Event Notification + EIP: Document MessageSource of the terms plus the older EIP term for ECST
Schema governance for ECSTConfluent: Schema Registry overviewThe operational backbone ECST usually needs
Outbox patternMicroservices.io: Transactional outbox + Polling publisher + Transaction log tailingThree related pattern entries covering relay variants
Outbox in practiceConfluent: Transactional Outbox course + Debezium: Outbox event router + Debezium: PostgreSQL connectorThe production-grade CDC implementation
Durability tradeoffsRichards & Ford: Preventing Data LossBroker persistence and consumer acks
Availability framingSystem Design Primer: Availability patternsWhy ECST-style payloads can keep consumers alive when producer is sick

Cluster 3: Brokers and Log-Based Systems

NeedBest resourceWhy
Queue semanticsAWS SQS Developer Guide + Visibility timeout + Dead-letter queuesHosted-queue canonical references with the two most-often-misconfigured knobs broken out
AMQP modelRabbitMQ: AMQP 0-9-1 ModelExchanges, queues, bindings
DLQ and work-distribution patternsEIP: Dead Letter Channel + Competing ConsumersCanonical definitions for queue operations
Kafka designApache Kafka: Documentation -- Design + Consumer configs + Design: ConsumersLog-structured replicated design and consumer positioning
Kafka retention and compactionApache Kafka: Compaction + Confluent: Kafka retention explainedRetention/compaction mechanics with operational guidance
Kafka introductionConfluent: Apache Kafka 101Friendly walkthrough with diagrams
Consumer groups and rebalancingConfluent: Consumer Groups Explained + Incremental Cooperative Rebalancing + Cooperative Rebalancing (Streams, ksqlDB) + KIP-848Progressive depth: membership, modern rebalance protocol, next-generation protocol
Broker topology framingRichards & Ford: Event-Driven Architecture StyleWhere brokers sit in the architecture
Ratings (async characteristics)Richards & Ford: Event-Driven RatingsHow EDA rates on characteristics
Partitioning as shardingSystem Design Primer: Federation/shardingThe sharding analogy that carries over to Kafka partitioning
Foundational essaysJay Kreps: The Log + Confluent: It's Okay To Store Data In KafkaWhy log-based design matters and why the log is durable storage

Cluster 4: Distributed Workflow with Events

NeedBest resourceWhy
Choreography vs orchestrationRichards & Ford: Mediator TopologyCentral coordinator discussion with tradeoffs
Request-reply over eventsRichards & Ford: Request-ReplySync-over-async mechanics
Saga pattern (both variants)Microservices.io: Saga patternCanonical treatment
Saga on AWSAWS: Saga orchestration pattern + Saga pattern (modernization guide) + Serverless saga with Step Functions + Compute blog walkthroughPrescriptive guidance and runnable reference
Saga with TemporalTemporal: Saga pattern made easy + Compensating actions + Temporal docsCode-first orchestration reference
Saga historical depthGarcia-Molina & Salem: SAGAS (1987 paper)Foundational paper; optional
Modern saga practiceCaitie McCaffrey: Applying the Saga Pattern (talk)Reviving the pattern for microservices
Hybrid collaborationBernd Rücker: Why service collaboration needs choreography AND orchestrationPractical hybrid advice from Camunda co-founder
IdempotencyMicroservices.io: Idempotent consumer + EIP: Idempotent ReceiverPattern entries
Honest "exactly once"Confluent: Exactly-once Semantics Are PossibleExplains boundaries of EOS
Idempotency on external APIsStripe: Idempotent requests + AWS SQS: FIFO exactly-once processingCanonical Idempotency-Key contract and AWS's narrower flavor

Cluster 5: Event Sourcing and CQRS

NeedBest resourceWhy
Event sourcing conceptFowler: Event Sourcing + Fowler: Event-Driven StateCanonical essay + the "events-as-state" lens
Microservices framingMicroservices.io: Event sourcingPattern treatment
CQRS conceptFowler: CQRS + Fowler: Command Query SeparationShort, clear, with deliberate warnings; origin of the name
CQRS patternMicroservices.io: CQRS patternEntry with pros/cons
Projections practiceFowler: Reporting Database + Fowler: Eager Read Derivation + Confluent: Materialized views with ksqlDB + Confluent: Unifying stream processing and interactive queriesThe "derived view" heritage and the Kafka-native how
Stream processingKafka Streams: Stateful operationsOne way to implement projections
Classic lectureGreg Young: CQRS and Event Sourcing (talk) + CQRS Documents PDFDefined the modern practice; long-form companion
RetrospectiveGreg Young: A Decade of DDD, CQRS, Event SourcingCautions and refinements
Event store referenceEventStoreDB: What is event sourcing?Concrete implementation framing from a purpose-built event store vendor

Video and Lecture Lane

Book Lane

  • Stopford, Designing Event-Driven Systems (O'Reilly, free PDF from Confluent) -- event-driven at platform scale.
  • Richardson, Microservices Patterns -- Ch. on saga, outbox, event sourcing, CQRS; extends this module.
  • Newman, Building Microservices (2nd ed.) -- async communication chapter as a companion.
  • Kleppmann, Designing Data-Intensive Applications -- stream processing and replication (S6 path; deep dive only).
  • Vernon, Implementing Domain-Driven Design -- domain events as a DDD primitive (pairs with S7M3).
  • Young, CQRS Documents (free PDF) -- the original 2010 long-form write-up.

External Source Directory

Grouped by author/vendor for quick lookup when writing ADRs, RFCs, or design reviews.

Martin Fowler (martinfowler.com)

Chris Richardson (microservices.io)

Confluent (blog + learn + developer)

Apache Kafka (kafka.apache.org)

AWS

Debezium

Temporal

Greg Young

Alberto Brandolini / EventStorming

Martin Kleppmann

Enterprise Integration Patterns (EIP)

Payment APIs (idempotency reference)

Use Rules

  • If you are stuck on the mental model, Fowler's four-lens essay and Richards & Ford Ch. 14 are the first escalations.
  • For operational Kafka details, go straight to the Kafka docs; third-party tutorials vary wildly in quality. Confluent's engineering blog is the reliable second choice.
  • For sagas, microservices.io is the canonical pattern entry; Rücker's blog and the AWS/Temporal vendor docs are the best second opinions.
  • For CQRS and event sourcing, read Fowler first for the framing and Greg Young second for the origin-of-the-practice detail. The vendor docs (EventStoreDB, Confluent/Kafka Streams) come later and only for implementation specifics.
  • Open one chunk for one gap; do not wander through a whole chapter sequence by default.
  • Prefer official docs (Kafka, SQS, EventBridge, Debezium, Temporal, Stripe) over third-party summaries for implementation details.
  • Every concept file lists its own "Read This Only If Stuck" block with 8-12 refs. Use this page when you need a cross-concept map; use the concept file when you need a targeted escalation.