Day 090: Event Streaming and Kafka Fundamentals
A streaming platform like Kafka becomes valuable when events are not just one-time deliveries, but a durable shared history that many consumers need to read, replay, and process independently over time.
Today's "Aha!" Moment
If the previous lesson was about the meaning of an event, this lesson is about what changes when those events stop behaving like disposable notifications and start behaving like a shared log.
Keep the same learning platform in mind. Purchases, lesson completions, video progress, and recommendation impressions are constantly being emitted. Analytics wants the full history. Fraud detection wants near-real-time signals. A new engagement team wants to build a projection from the last six months of activity. None of these consumers should steal messages from each other, and none of them should force the producer to send separate copies manually.
That is the aha. Kafka is not mainly a "faster queue." It is a durable append-only log. Producers append records. Consumers keep track of how far they have read. Multiple consumers can read the same topic independently because consumption is based on offsets, not destructive removal.
Once that clicks, several Kafka ideas start making sense at once. Replay is normal because the history is retained. Consumer groups exist because one logical consumer role may need many instances. Partitions exist because one giant totally ordered log would not scale. Kafka feels different from a queue because it is solving a different problem.
Why This Matters
The problem: Queue thinking is too narrow for systems that need shared event history, multiple independent consumers, and the ability to replay or rebuild downstream state later.
Before:
- Events are treated like transient deliveries with one immediate receiver.
- Adding a new consumer often means changing producers or building extra fanout logic.
- Reprocessing history is painful or impossible.
After:
- Events live in durable topics that multiple consumers can read independently.
- New consumers can often start from retained history instead of waiting for new traffic.
- Throughput, replay, and fanout become native properties of the platform rather than custom engineering every time.
Real-world impact: Better analytics pipelines, easier projections, safer recovery patterns, and more flexible downstream evolution, especially once event volume and consumer diversity grow.
Learning Objectives
By the end of this session, you will be able to:
- Explain why Kafka is a log-first system, not just a queue - Connect durable history, offsets, and replay to the model.
- Reason about partitions and consumer groups - Understand how Kafka balances scale with local ordering.
- Choose streaming for the right kind of problem - Recognize when shared retained event flow is more useful than one-time work dispatch.
Core Concepts Explained
Concept 1: Kafka Stores Events as Durable Append-Only Logs
In a classic work queue, a message is usually thought of as a task to be handed to one worker. In Kafka, a record is appended to a topic and kept for a retention period. Consumers do not "own" the message by removing it from existence. They read through the log and remember their own position.
That difference is the foundation of the model.
producer ---> topic log
[0] purchase.completed
[1] lesson.completed
[2] video.progressed
[3] purchase.refunded
consumer A reads from offset 0
consumer B reads from offset 2
For the learning platform, that means analytics can read all historical purchases from the beginning, while a near-real-time fraud detector may care mainly about the tail of the stream. Both can consume the same topic without competing for a single copy.
This is why Kafka feels closer to a journal than a to-do list. The interesting question is not "who took the message?" It is "what records exist in the log, and where is each consumer currently positioned?"
The trade-off is durability and independent consumption versus a more complex mental model than a simple queue. You gain history and replay, but you also need to reason about retention, offsets, and consumer state.
Concept 2: Partitions and Consumer Groups Are How Kafka Scales Without Pretending Global Order Is Free
One huge totally ordered stream would be easy to explain and hard to scale. Kafka solves that tension with partitions. Each partition is an ordered append-only log, and records are usually assigned to partitions by key.
If all events for one learner use the same key, they can stay ordered relative to each other while still allowing the cluster to process many other learners in parallel.
topic: learner-events
partition 0: learner-17 events in order
partition 1: learner-42 events in order
partition 2: learner-99 events in order
Consumer groups are the second half of the story. If the analytics enrichment service needs four instances, Kafka can divide partitions among them so that one logical consumer role scales horizontally without every instance processing every record.
topic partitions -> consumer group members
p0 -> worker-1
p1 -> worker-2
p2 -> worker-3
p3 -> worker-4
def publish(stream, topic, learner_id, event_name, payload):
stream.append(
topic=topic,
key=f"learner:{learner_id}",
value={"type": event_name, "payload": payload},
)
The code is only illustrating the key idea: partition keys are often business keys because ordering usually matters per entity, not across the whole company forever.
The trade-off is scalable parallelism versus limited ordering guarantees. Kafka gives you order within a partition, not a magical total order for every record in the system.
Concept 3: Replay Is an Architectural Capability, Not a Debugging Convenience
Replay changes what downstream systems are allowed to become.
Suppose the learning platform adds a new progress leaderboard six months after the original events began. In a queue-only world, that may require asking upstream systems to resend history or accepting that the new feature starts with no past data. In Kafka, if retention is sufficient, the new consumer can read old records and build its projection from the log.
That matters for:
- new analytics pipelines
- rebuilding corrupted projections
- backfilling derived state after code changes
- disaster recovery for downstream consumers
retained topic history
|
+--> existing consumer continues from latest offset
|
+--> new consumer starts from old offset and rebuilds
Replay is also why offset management matters so much. A consumer's position is part of the system's behavior. If you reset offsets, you are not just "restarting the app"; you may be reprocessing history and reproducing side effects unless consumers are designed carefully.
The trade-off is flexibility versus operational discipline. Replay is powerful, but it requires careful thinking about idempotency, retention windows, and what it really means to consume history again.
Troubleshooting
Issue: Treating Kafka as just a very large queue.
Why it happens / is confusing: Both systems have producers, consumers, and asynchronous delivery, so the surface vocabulary overlaps.
Clarification / Fix: Focus on the log model. Kafka is built around retained ordered records, consumer offsets, and replayable history.
Issue: Expecting perfect global ordering.
Why it happens / is confusing: People hear "ordered log" and assume every event everywhere has one total sequence.
Clarification / Fix: Kafka gives ordering within partitions. Choose keys so the ordering you actually need is local to the right entity or workflow.
Issue: Replaying data without considering side effects.
Why it happens / is confusing: Replay feels like simply rereading data, but many consumers trigger writes, notifications, or downstream updates.
Clarification / Fix: Treat replay as a real architectural operation. Design consumers so repeated processing is safe, bounded, or explicitly controlled.
Advanced Connections
Connection 1: Streaming Fundamentals ↔ Event-Driven Architecture
The parallel: The previous lesson explained what an event means. Streaming platforms make that event history durable and broadly consumable.
Real-world case: A cleanly defined domain event like purchase.completed becomes much more valuable when analytics, fraud, projections, and recovery workflows can all consume it independently.
Connection 2: Streaming Fundamentals ↔ Event Sourcing
The parallel: Both use event history, but they solve different problems. Kafka distributes retained event flow; event sourcing uses events as the source of truth for a domain state boundary.
Real-world case: A purchase aggregate may be event-sourced while the same purchase events are also published into Kafka for projections, monitoring, or machine-learning pipelines.
Resources
Optional Deepening Resources
- These resources are optional and are not required for the core 30-minute path.
- [DOC] Apache Kafka Documentation
- Link: https://kafka.apache.org/documentation/
- Focus: Review the core model of topics, partitions, offsets, consumer groups, and retention.
- [BOOK] Kafka: The Definitive Guide
- Link: https://www.confluent.io/resources/kafka-the-definitive-guide/
- Focus: Deepen the practical mechanics of producers, consumers, scaling, and operational trade-offs.
- [BOOK] Designing Event-Driven Systems
- Link: https://www.confluent.io/designing-event-driven-systems/
- Focus: Connect Kafka-style streaming to broader event-driven architecture and log-centric thinking.
- [ARTICLE] Kafka, the Log, and Event Streaming
- Link: https://martinfowler.com/articles/201701-event-driven.html
- Focus: Reconnect streaming infrastructure with the semantic distinction between events, commands, and reactions.
Key Insights
- Kafka is a retained log, not just a delivery channel - Consumers read by offset from shared durable history.
- Partitions and consumer groups are the core scaling model - They trade global order for local order plus parallelism.
- Replay changes what downstream systems can do - New consumers, rebuilt projections, and historical reprocessing become first-class options.
Knowledge Check (Test Questions)
-
What is the most important architectural difference between Kafka and a simple work queue?
- A) Kafka keeps a durable log that multiple consumers can read independently using offsets.
- B) Kafka only allows one consumer per topic.
- C) Kafka guarantees one global total order for all records in the cluster.
-
Why do Kafka partitions exist?
- A) To scale throughput while preserving order within each partition.
- B) To make consumer groups unnecessary.
- C) To ensure every record is processed by every worker in a group.
-
Why is replay such a significant feature?
- A) Because consumers can rebuild state or add new projections from retained history instead of relying only on future events.
- B) Because replay removes the need for idempotent consumers.
- C) Because replay is useful only during debugging and never in product architecture.
Answers
1. A: Kafka consumers read through durable retained history by offset, rather than destructively taking one-time ownership of a task.
2. A: Partitions are Kafka's way of balancing parallelism with ordering guarantees that remain local to a partition.
3. A: Replay lets new or recovering consumers process past events, which is one of the biggest architectural advantages of log-based streaming.