Kafka earliest vs latest β Quick Recap
1. Consumer Group A consumer group is identified by a group-id. spring: kafka: consumer: group-id: inventory-group You don't declare: number of groups = 1 Instead, you give consumersβ¦
1. Consumer Group
A consumer group is identified by a group-id.
spring:
kafka:
consumer:
group-id: inventory-group
You don’t declare:
number of groups = 1
Instead, you give consumers a group ID.
inventory-group β Inventory Service
notification-group β Notification Service
Different group-ids = different consumer groups.
2. First time Inventory Service starts
Suppose:
Kafka
Order1
Order2
Order3
Order4
Inventory starts with:
group-id: inventory-group
If inventory-group has never consumed before, Kafka has no committed offset for this group.
Now auto-offset-reset decides where to start.
3. earliest
auto-offset-reset: earliest
Means:
“If I don’t have a previous offset, start from the earliest message still available.”
Example:
Kafka:
0 β Order1
1 β Order2
2 β Order3
3 β Order4
Inventory starts
β
earliest
β
Order1 β Order2 β Order3 β Order4
So it can process old + new messages.
4. latest
auto-offset-reset: latest
Means:
“If I don’t have a previous offset, start at the current end and wait for new messages.”
Example:
Kafka:
0 β Order1
1 β Order2
2 β Order3
3 β Order4
β
END
Inventory starts with latest
β
wait for new events
If Order5 arrives:
Order5 β Inventory β
The existing Order1β4 are not consumed by this new consumer group.
5. Very important: Restarting the service
Suppose Inventory has already consumed:
Order1
Order2
Order3
and Kafka has a committed offset for:
inventory-group
Now Inventory crashes.
While it’s down:
Order4
Order5
Order6
arrive.
When Inventory starts again:
Kafka
β
Find inventory-group
β
Find committed offset
β
Resume from that position
It normally processes:
Order4 β Order5 β Order6
It does NOT use latest to skip them.
So:
latestdoes NOT mean “skip messages whenever my service is down.”
It matters when there is no valid committed offset.
6. Offset
An offset is the position of a record inside a Kafka partition.
Example:
Partition 0
Offset 0 β Order1
Offset 1 β Order2
Offset 2 β Order3
Offset 3 β Order4
You don’t declare the offset count yourself.
Kafka assigns offsets automatically.
7. Offset increases
For a particular partition, offsets increase as new records are appended:
0 β 1 β 2 β 3 β 4 β 5 β 6 β ...
For a long-running application, offsets can become:
millions
billions
even much larger
That’s completely normal.
8. Offset is per partition
If your topic has two partitions:
Partition 0 Partition 1
0 β Order1 0 β Order2
1 β Order3 1 β Order4
2 β Order5 2 β Order6
Both partitions can have offset 0.
So:
Offset is NOT a global message number.
It is the position within that partition.
9. Retention doesn’t reset offsets
Suppose Kafka had:
0 1 2 3 4 5 6
Old messages are deleted because of retention:
2 3 4 5 6
Kafka does not renumber them:
β 0 1 2 3 4
They remain:
β
2 3 4 5 6
So offsets represent positions in the log and can keep increasing.
β Most Important Mental Model
Remember this flow:
Consumer starts
β
βΌ
Does consumer group already
have a valid committed offset?
/ \
YES NO
β β
βΌ βΌ
Use committed auto-offset-reset
offset β
βββββββ΄ββββββ
βΌ βΌ
earliest latest
β β
βΌ βΌ
Oldest Current end
available / wait for
message new events
One-line memory trick
earliest β π “Give me the old available messages.”
latest β π “Start from now and give me new messages.”
Committed offset exists β π “Continue from where my group stopped.”
Offset β π’ “Position of a record inside a partition.”