Kafka
Message Processing
Topic Configuration
Data Management
Performance Optimization

Kafka set the maximum number of messages to read from the topic

System Design practice on Codemia

Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.

Practice system design

Apache Kafka is a robust, distributed event streaming platform capable of handling trillions of events a day. Initially conceived as a messaging queue, Kafka is based on an abstraction of a distributed commit log. Since being open-sourced by LinkedIn in 2011, Kafka has become a key component in data architectures and real-time processing pipelines, used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

Controlling Message Consumption

In certain scenarios, such as testing or specific application requirements, there might be a need to limit the number of messages a Kafka consumer reads from a topic. Kafka doesn't provide an explicit configuration parameter to specify the maximum number of messages to consume directly. However, developers can control this behavior programmatically in their consumer application.

Implementing Message Limits in Kafka Consumers

To set a maximum number of messages that a Kafka consumer should read, you can manage this on the client side using the programming language of your choice. Here, we’ll discuss a Java example to illustrate the concept:

java
1import org.apache.kafka.clients.consumer.ConsumerRecord;
2import org.apache.kafka.clients.consumer.ConsumerRecords;
3import org.apache.kafka.clients.consumer.KafkaConsumer;
4
5import java.time.Duration;
6import java.util.Collections;
7import java.util.Properties;
8
9public class LimitedMessageConsumer {
10    public static void main(String[] args) {
11        Properties props = new Properties();
12        props.put("bootstrap.servers", "localhost:9092");
13        props.put("group.id", "test-group");
14        props.put("enable.auto.commit", "true");
15        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
16        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
17
18        try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {
19            consumer.subscribe(Collections.singletonList("your-topic-name"));
20
21            int maxMessages = 100; // Maximum number of messages to consume
22            int messageCount = 0;
23
24            while (messageCount < maxMessages) {
25                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
26                for (ConsumerRecord<String, String> record : records) {
27                    System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
28                    messageCount++;
29                    if (messageCount >= maxMessages) {
30                        break;
31                    }
32                }
33            }
34        }
35    }
36}

Key Considerations

  1. Poll Loop: The consumer retrieves a batch of messages from Kafka in each poll loop iteration. You control the number of messages processed by controlling the number of times this loop executes in conjunction with the batch size retrieved in each poll.
  2. Consumer Configuration: The max.poll.records configuration in consumer properties can be set to control the maximum number of records returned in each poll call. Combining this setting with the control loop allows finer control over the number of messages consumed.

Summary Table

ParameterDescriptionExample
bootstrap.serversKafka cluster's addresslocalhost:9092
group.idConsumer group's identifiertest-group
enable.auto.commitEnables automatic offset committrue
key.deserializerKey deserializer used by consumerorg.apache.kafka.common.serialization.StringDeserializer
value.deserializerValue deserializer used by consumerorg.apache.kafka.common.serialization.StringDeserializer
max.poll.recordsMaximum records per poll request100 (explicit setting required)

Advanced Scenario

For more sophisticated scenarios, such as when processing must be paused after consuming a certain number of messages, Kafka's consumer APIs support pausing and resuming the consumption from specific partitions. This can be particularly useful in workflows where message processing involves complex computations or external system integrations.

Conclusion

While Kafka itself does not limit message consumption directly through configuration, it provides enough flexibility through its consumer API to implement this functionality as needed. By carefully managing the poll loop and leveraging consumer configurations, developers can effectively limit the number of messages processed, aligning with specific application requirements or system limitations.


Related reading
Course
Beginner
27 lessons
10 hours
System Design Fundamentals

Build a strong foundation in designing scalable, reliable distributed systems.

View the course
Track 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.

Practice system design

All Rights Reserved.