Kafka 訊息偏移量的維護
阿新 • • 發佈:2019-01-26
Kafka是大資料領域常用的訊息佇列,其高效的吞吐量和分散式容錯等特性是其收到青睞的重要原因。
kafka訊息的位置
用好Kafka,維護其訊息偏移量對於避免訊息的重複消費與遺漏消費,確保訊息的Exactly-once是至關重要的。
kafka的訊息所在的位置Topic、Partitions、Offsets三個因素決定。
Kafka消費者消費的訊息位置還與consumer的group.id有關。
consumerOffsets與earlieastLeaderOffsets的關係
名稱 | 含義 |
---|---|
earlieastLeaderOffsets | 儲存在broker上的leader節點的最早的訊息偏移量 |
consumerOffsets | 消費者消費的訊息偏移量位置 |
為了表述方便,我們記earlieastLeaderOffsets為A,記consumerOffsets為B 。
- 情況一:正常情況下,消費的訊息偏移量應該大於broker上儲存的最早的訊息偏移量,即 A < B:
我們知道,儲存在broker上的kafka的訊息常設定訊息過期配置,當到達過期時間時過期的訊息將會被清除。
情況二:如果A 依然小於 B,則仍可以正常消費:
情況三:然而,當 A > B 時,則說明還沒有被消費的訊息已經被清除:
此種情況會丟擲kafka.common.OffsetOutOfRangeException
consumerOffsets 小於 earlieastLeaderOffsets的影響與解決辦法
當情況三發生時,在(B,A)區間內的訊息還沒有被消費就已經被清除了,將導致兩個後果。
1. 訊息丟失。
2. 丟擲 kafka.common.OffsetOutOfRangeException
異常。
在對訊息完整性有嚴格要求的系統中,訊息的丟失造成的影響會比較嚴重,所以在這種情況下,要保證訊息不會遭到丟失。
避免訊息丟失包含兩個方面:
- 還沒有被消費過的訊息不會被清除。
在沒有外部系統清除kafka訊息的情況下,協調設定broker的最大保留大小log.retention.bytes
log.retention.hours
等,來配合消費者端的讀取訊息。可以通過讀取和監控消費者消費的offsets,來保證訊息不會被意外清除。 - 消費者端消費訊息沒有遺漏。
當消費者意外中斷時,重新啟動消費時能夠從上一次中斷的訊息偏移量開始消費。