Kafka系列四 之 多分區如何保證數據的有序性


Apache Kafka 消息怎么寫?
kafka是一個分布式的流消息隊列
生產者將消息發布到某個主題
broker 進行存儲
消費者 訂閱+讀數據 從該主題中

消息(記錄)以序列化字節存儲,
消費者負責反序列化消息,
消息可以具有任何格式,最常見的是字符串,JSON和Avro。
JSON 格式的好處與壞處!? √

1.消息始終具有鍵值結構,鍵或值可以為null。

當鍵為null時,將使用循環分發來分發消息。
如何根據 自定義設定 key 來保證全局局部有序!?                   √
	比如說現在有兩條消息,一個是支付消息,一個是發貨消息,如果這兩個消息的key是一樣的,
	比如是同一個訂單id就可以讓這兩條消息都走同一個partition,保證消息消費的順序

在這里插入圖片描述

2.主題分區包含一組有序的消息,並且分區中的每個消息都有唯一的偏移量。

0.8 kafka 需要自定義管理offset,這里可以存儲在hdfs,zk,mysql...!?   √
0.10+  不需要

默認情況下,Kafka將數據保留7天。

重點場景 mysql的數據–>通過canal–>發送到kafka–>mysql、hive

在做canal集成kafka的時候,發現一個問題,多分區的情況下,跨分區的數據消費是無序的。

這時候就會出現問題,如果消費端消費的更新日志在插入日志之前,就會因為數據缺失導致異常(這
樣的情況隨着並發出現的概率會增大),所以,需要保證新增的日志和更新的日志是有序的被消費。

kafka發送數據是支持指定分區的,這時候,只要把同一個表的同一個主鍵的數據發到同一個分區即
可(如果多數據庫得加入數據庫名)

分區定義如下:

private int partitionDefine(String keyToPartition) {
	if (keyToPartition == null) {
		return new Random().nextInt(numPartitions);
	} else {
		return Math.abs(keyToPartition.hashCode()) % numPartitions;
	}
}

傳入的參數 tableName+主鍵

這樣,消費到的數據就是有序的。不同的場景靈活運用即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM