Kafka Streams – best way to get KTable and KStream on same topic?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Apache Kafka Streams is a client library for building applications and microservices, where the input and output data are stored in Kafka clusters. It allows for stateful and stateless transformations of data into streams and tables. Key terms that frequently come up when working with Kafka Streams are KStream and KTable, which represent different views of data on a Kafka topic. Understanding how to effectively work with both of these objects on the same topic can significantly enhance your stream processing applications.
KStream vs. KTable
- KStream - This abstraction represents a record stream where each data record represents an independent entity/event in the real world. Each record in a KStream is a key-value pair, and records can be updated or deleted over time.
- KTable - In contrast, a KTable is a changelog stream to a Kafka topic and it represents the state of each record. Here, each data record is similar to an update (insert, update, delete) to an eventual consistency table where the key is the primary key.
Deciding when to use either KStream or KTable depends largely on the specific requirements of your application, such as whether you need to view data as a stream of events or as a latest snapshot state.
Handling both KStream and KTable on the Same Topic
To process streams where both the event stream and stateful representation are necessary, you can derive a KTable and KStream from the same Kafka topic. The methods and reasoning behind this approach are outlined below:
Example Scenario
Consider a scenario where user purchase actions are being sent to a Kafka topic. Each purchase has a unique ID and contains details about the user and the product. You might want to have both:
- A real-time stream of purchases (as a KStream).
- Aggregate information, such as the total number of purchases per user (as a KTable).
Implementation Steps
- Create a KStream from the Topic: Start by creating a KStream from the topic that records each purchase. This KStream will process or react to every single action as an independent event.
- Create a KTable from the Same Topic: You can create a KTable from the same topic to maintain the latest state of each key. This can be useful for tracking the most current record of each user or object.
- Use Cases for Combining KStream and KTable:
- Having both structures processing the same topic can help in scenarios where both event-at-a-time processing and update-at-a-time processing are useful.
- For example, you might utilize the KStream to trigger real-time alerts or running totals, while the KTable could be used for periodic snapshots or audit checks.
Important Operations
- Join Operations: Combining KStream and KTable is common for joining operations, such as enriching a data stream (KStream) with another dataset (KTable).
Summary Table
| Feature | KStream | KTable |
| Nature | Event-centric (record stream) | State-centric (changelog stream) |
| Updates | Record is independently processed | Record updates current state |
| Use case | Real-time data processing | Maintaining latest state, aggregations |
| Transformation | Yes (map, filter, etc.) | Yes (aggregate, mapValues, etc.) |
Conclusion
Utilizing both KStream and KTable from the same topic in Kafka Streams provides a robust way to handle real-time streaming data that also requires stateful operations. This approach improves efficiency since both types of data views are generated from the same data source, minimally impacting system resources. The decision to use KStream, KTable, or both will depend on your specific needs to process data as event streams or as aggregated states.
Related reading
- Kafka Streams Aggregation results for key differ based on the number of threads
- Kafka Streams and RPC is calling REST service in map() operator considered an anti-pattern?
- Kafka Streams app does NOT fail when the Kafka cluster goes down
- Kafka streams application design principles
- Kafka Streams application Endless rebalancing
- Kafka Streams Application Updates
- Kafka Streams can not recover in case of Exception while processing Messages
- Kafka Streams Cases where Coordinator selected invalid assignment protocol null

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.