What if a Kafka's consumer handles a message too long? Will Kafka reappoint this partition to another consumer and the message will doubly handled?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Kafka, a popular event streaming platform, handles large volumes of data efficiently. Consumers in Kafka subscribe to one or more topics and process the stream of records sent to them. However, how Kafka handles situations where a consumer might take too long to process a message is a facet of the system's design worth exploring.
Consumer Groups and Partition Rebalance
In Kafka, consumers are typically part of a consumer group. When multiple consumers are subscribed to a topic within the same group, the topic's partitions are divided among them. This division of labor helps in parallel processing and increases the overall throughput of the system.
If a consumer fails or takes excessively long to process a message, Kafka's consumer group coordinator may decide to trigger a rebalance of the partitions among the available, active consumers. This action, however, is not directly in response to the time taken by a consumer to process a specific message, but it might be indirectly linked through the failure or slowness of heartbeat responses from the consumer to the broker.
Heartbeats and Session Timeouts
The primary mechanism that Kafka uses to detect if a consumer is alive is through heartbeats. Each consumer sends periodic heartbeats to the Kafka brokers to indicate it is alive and well. Two important timeout settings related to this are:
session.timeout.ms: This controls the time a consumer can be non-responsive before being considered dead by the brokers.max.poll.interval.ms: This specifies the maximum amount of time between poll calls before the consumer is considered dead.
If a consumer fails to send heartbeats within the session.timeout.ms limit or fails to call poll within max.poll.interval.ms, it is assumed to be faulty. Consequently, Kafka will trigger a rebalance, redistributing the partitions among other consumers in the group.
Handling Long Processing Times
If a consumer is legitimately taking a long time to process a message due to the nature of the workload, two scenarios can unfold:
- Consumer Misses Heartbeats: If processing a message takes longer than the heartbeat rate and interferes with the sending of heartbeats, Kafka assumes the consumer to be dead, hence triggering a rebalance.
- Adjusting Configurations: Developers can adjust
session.timeout.msandmax.poll.interval.msto higher values if the nature of the processing tasks requires more time. This prevents the consumer from being wrongly considered unresponsive.
Possible Duplicate Processing
During a rebalance, messages that were being processed by a consumer deemed dead might not have been committed back to Kafka. As a result, these messages could potentially be consumed and processed again by another consumer that picks up the reconciled partition. This is an example of at-least-once processing semantics of Kafka, where messages might be processed more than once but will not be missed.
Strategies to Handle Long Processing
To handle scenarios where message processing is inherently lengthy without causing unnecessary rebalances, consider:
- Increasing timeouts: Adjust
max.poll.interval.msandsession.timeout.msappropriately. - Batch Processing: Batch several records per poll to reduce the likelihood that processing times mess with heartbeat or poll intervals.
- Asynchronous Processing: Decouple the message consumption from processing using an internal queue to keep the consumption responsive.
Summary Table
| Property | Description | Impact When Increased |
session.timeout.ms | Time a consumer can be inactive before considered dead. | Less sensitive to failures/long processing. |
max.poll.interval.ms | Maximum duration between poll calls before considering the consumer dead. | Lesser rebalances due to slow processing. |
| Heartbeats | Indicates life-sign of consumers consisting of heartbeat.interval.ms and session/maintenance timeouts. | Keeps consumer group stable |
Conclusion
Handling large processing times in Kafka requires a fine balance between keeping the consumer responsive to Kafka's brokers via heartbeats and adjusting the Kafka and application settings to accommodate lengthy processing tasks. Each Kafka deployment might need tailored configuration tuning based on specific workload characteristics and consumer behavior patterns.

