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+主鍵
這樣,消費到的數據就是有序的。不同的場景靈活運用即可。