成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:Kafka中的key有什么用?

開發 架構
對于某些應用場景,消費者可以根據消息的鍵來進行過濾或聚合操作。例如,在實時數據分析場景中,可能需要對具有相同鍵的消息進行分組處理。

我們在使用 Kafka 時,最簡單、最常用的方式是只設置 topic(主題)和 value(消息體),如下所示:圖片這樣的話獲取消息的代碼也很簡單,如下所示:

@KafkaListener(topics = "mytopic", groupId = "my-group")
public void listen(String data) {
    System.out.println("監聽到消息:" + data);
}

但是,除了我們可以設置和傳遞 topic 和 value 之外,我們還可以傳遞 key,如下圖所示:圖片那問題來了,發送消息時設置這個 key 有什么用呢?

key的作用

發送消息時,設置 key 的作用如下:圖片

1.決定分區

當生產者發送消息時,如果指定了 key,Kafka 會根據 key 的 hash 值來決定這條消息應該發送到哪個分區。

如果沒有指定 key,Kafka 會采用輪詢(早期版本)或隨機(最新版本)的方式將消息分配到其他分區中。

分區的具體實現源碼在 DefaultPartitioner 中 partition 方法中體現,核心源碼如下:

public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster, int numPartitions) {
    return keyBytes == null ? this.stickyPartitionCache.partition(topic, cluster) : BuiltInPartitioner.partitionForKey(keyBytes, numPartitions);
}

指定 key 之后的分區實現代碼如下:

public static int partitionForKey(byte[] serializedKey, int numPartitions) {
    return Utils.toPositive(Utils.murmur2(serializedKey)) % numPartitions;
}

以上源碼的大概含義是:使用 MurmurHash2 算法對字節數組 serializedKey 進行哈希運算,并將其結果轉換為正數,然后對 numPartitions 取模,以確定鍵在分區中的位置,返回值表示鍵所在的分區編號。

所以,從上述源碼可以看出,發送消息如果設置了 key 之后,會將相同 key 放到同一個分區中。

2.保證消息順序

在 Kafka 中,同一個分區中的消息是有序的。而相同的 key,根據上面的分區算法可知,它們會存放到同一個分區,這樣就能保證消息的有序性了。

3.消息過濾

對于某些應用場景,消費者可以根據消息的鍵來進行過濾或聚合操作。例如,在實時數據分析場景中,可能需要對具有相同鍵的消息進行分組處理。

Kafka 設置了 key 之后,可以通過以下方式實現消息過濾,如下代碼所示:

@KafkaListener(topics = "topicName", groupId = "groupId")
public void listen(String message, ConsumerRecord<?,?> record) {
    Object key = record.key();
    if (key instanceof String && ((String) key).matches("regexPattern")) {
        // 處理滿足正則表達式條件的消息
    }
}

也就是,我們在接收到消息之后,通過對 key 的正則匹配實現消息的過濾和聚合等操作。

責任編輯:武曉燕 來源: 磊哥和Java
相關推薦

2020-04-23 14:09:13

URI挖坑前端

2021-07-06 07:27:45

React元素屬性

2024-03-20 15:12:59

KafkaES中間件

2022-05-05 07:38:32

volatilJava并發

2025-04-01 00:00:00

項目CRUD單例模式

2023-06-05 07:57:53

Kafka消息事務消息

2021-12-20 10:30:33

forforEach前端

2023-02-17 08:10:24

2021-12-10 12:01:37

finalfinallyfinalize

2024-04-03 15:33:04

JWTSession傳輸信息

2021-11-30 07:44:50

FinalFinallyFinalize

2024-09-19 08:42:43

2024-09-09 08:30:56

代碼

2024-02-19 00:00:00

Python?starmap函數

2024-04-15 00:01:00

STWJava垃圾

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2023-12-13 15:28:32

Python工具數據

2024-04-19 08:23:06

2024-04-19 00:00:00

計數器算法限流算法

2021-09-07 10:44:33

Java 注解開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线免费观看 | 免费成人高清在线视频 | 国产精品不卡一区 | 久久久视频在线 | 九九久久精品 | 日本欧美黄色片 | 日韩在线视频免费观看 | 久久久久久久久久一区 | 国产精品乱码一区二三区小蝌蚪 | 麻豆一区二区三区精品视频 | 国产精品揄拍一区二区 | 精品国产乱码久久久久久88av | 久久久这里只有17精品 | 午夜精品一区二区三区在线视频 | 欧美一级欧美三级在线观看 | 亚洲欧美中文日韩在线v日本 | 日韩欧美在线视频 | 99久久婷婷国产综合精品电影 | 欧美日韩专区 | 日韩精品一二三区 | 国产日韩视频 | 精品久久久久久18免费网站 | 色接久久| 草草草久久久 | 国产 欧美 日韩 一区 | 看片国产 | 国产毛片毛片 | 天天夜夜操 | 日韩在线视频观看 | 午夜免费网| 国产精品乱码一区二三区小蝌蚪 | 久久精品二区亚洲w码 | 久久久女 | 91久久国产综合久久91精品网站 | 成人在线观看免费观看 | 国产一区二区久久 | www.日本在线播放 | 免费国产一区二区 | 天天操操操操操 | 国产精品亚洲综合 | 天天精品在线 |