Read and process a batch of messages from Kafka
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Apache Kafka is a distributed streaming platform that is designed to handle data streams in real-time. It is widely used for building real-time streaming data pipelines and applications. Kafka operates with a publish-subscribe model and allows for fault-tolerant storage and processing of streams of records.
Understanding Kafka Basics
At its core, Kafka manages streams of records in categories called topics. A producer sends messages to a topic and consumers read messages from a topic. To read messages efficiently and ensure fault tolerance, topics are split into partitions. Each partition can be replicated across multiple Kafka brokers (servers) within a cluster to ensure data redundancy.
Setting up Kafka Environment
To process messages from Kafka, you must first have access to a Kafka broker and at least one topic with data. Installation details for Kafka can be found on the official Apache Kafka website.
Configuring the Kafka Consumer
Kafka consumers are applications that read data from Kafka topics. They require a set of key configurations:
- Bootstrap servers: List of Kafka brokers to connect to.
- Group ID: Specifies the consumer group a Kafka consumer belongs to.
- Key and value deserializer: How to convert bytes from Kafka into data types used in your application.
- Auto offset reset: What to do when there is no initial offset in Kafka or if the current offset does not exist anymore.
A basic consumer configuration in Java might look like the following:
Polling for Messages
The fundamental operation of a Kafka consumer is to poll the server for new messages:
In this example, consumer.poll(Duration.ofMillis(100)) makes the consumer wait for the data, if necessary, for up to the specified duration.
Managing Offsets
Kafka consumers keep track of the records that have been read using offsets. By default, the consumer commits the offsets automatically in the background. However, for better control, it's possible to manually commit offsets:
Handling Consumer Failures
Understanding how to handle consumer group failures is crucial. If a consumer fails, Kafka reallocates the partitions originally assigned to the failed consumer to other consumers in the same group.
Performance Considerations
Batch processing of messages, as demonstrated in the polling example, benefits from tuning certain Kafka client settings, such as:
- fetch.min.bytes: Controls the minimum amount of data the server should return for a fetch request.
- fetch.max.wait.ms: Controls the maximum amount of time the server will block before answering the fetch request if there isn't sufficient data to immediately satisfy
fetch.min.bytes.
By adjusting these settings, you can make a trade-off between latency and throughput.
Table: Key Kafka Consumer Configuration Properties
| Property | Description | Typical Value |
| bootstrap.servers | List of Kafka brokers to connect to. | "localhost:9092" |
| group.id | Identifier of the consumer group. | "test-group" |
| key.deserializer | Deserializer class for key that implements the Deserializer interface. | "org.apache.kafka.common.serialization.StringDeserializer" |
| value.deserializer | Deserializer class for value that implements the Deserializer interface. | "org.apache.kafka.common.serialization.StringDeserializer" |
| auto.offset.reset | What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server. | "earliest" |
Conclusion
Reading and processing batches of messages from Kafka efficiently requires understanding the Kafka model, configuring the consumer appropriately, and potentially tuning performance settings based on the specific needs of your application. Proper management of offsets and handling consumer failures are also pivotal in building robust streaming applications with Kafka.
Related reading
- Read Avro messages from Kafka in terminal - kafka-avro-console-consumer alternative
- Read from Kafka and write to hdfs in parquet
- Read input stream twice
- Read json from Kafka and write json to other Kafka topic
- Read Kafka topic in a Spark batch job
- Read sharded output from Hadoop job from DistributedCache
- read kafka message starting from a specific offset using high level API
- Read keys only from Kafka

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.