日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聊一聊Kafka分区的隐藏属性——二次归类

發(fā)布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊一聊Kafka分区的隐藏属性——二次归类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/hidden-attribute-of-kafka-partition/

在使用Kafka的過程中,分區(qū)是一個不可忽視的概念。很多時候你會帶著這樣的疑問:Kafka的分區(qū)該怎么劃分?按什么劃分?分多少個?撰稿之時,我在《深入理解Kafka》一書中搜索了一下“分區(qū)”這個詞,結(jié)果發(fā)現(xiàn)出現(xiàn)的頻率至少有4位數(shù)之多。Kafka中分區(qū)的概念涉獵很多,比如:分區(qū)分配、分區(qū)重分配、失效分區(qū)等。在本公眾號里也發(fā)表過幾篇文章來講述Kafka分區(qū)中的某些知識點:

  • 如何為Kafka挑選合適的分區(qū)數(shù)?
  • Kafka主題中的分區(qū)數(shù)越多吞吐量就越高?
  • 為什么Kafka中的分區(qū)數(shù)只能增加不能減少?

本文并不延續(xù)講解這些內(nèi)容,而是要劍走偏鋒,聊一聊Kafka分區(qū)被大家所忽視的一個隱藏屬性——消息的歸類。

在Kafka中主題和分區(qū)是兩個非常重要的概念。Kafka中的消息向來以“主題”來進行歸類(劃分),一個主題可以包含若干個分區(qū),一個分區(qū)只屬于單個主題。同一主題下的不同分區(qū)所包含的消息不同的(如果需要數(shù)據(jù)冗余,那么涉及到的是Kafka的多副本機制,這里不展開論述)。對于單個分區(qū)而言,消息是順序追加的,也因此為Kafka提供了分區(qū)內(nèi)的順序特性,這一點在RabbitMQ不是太好保證(其實RabbitMQ也不是不可以,就是有點麻煩)。

使用分區(qū)最主要的作用還是提高可擴展性。如果一個主題只有一個分區(qū),那么所有的數(shù)據(jù)讀寫都經(jīng)過這一個分區(qū)的話勢必會造成性能瓶頸。當然,如果規(guī)定主題只能有一個分區(qū)的話,那么分區(qū)這個概念就可以去除掉了。如果主題有多個分區(qū),那么可以將這種讀寫的壓力分散開來。主題中的多個分區(qū)不一定要在同一個broker上,完全可以分布在多個broker上,特殊情況下還可以一個分區(qū)一個broker。

“消息的歸類”并不是不是主題所獨有的特性,其實分區(qū)也可以,分區(qū)可以看做是消息的二次歸類,讓分區(qū)變得有意義。舉個例子,我們創(chuàng)建了一個主題用來存儲人員信息,這個人員信息就是對數(shù)據(jù)的一種歸類。由于人員眾多,我們想著是要用多個分區(qū)來分攤一下讀寫壓力,那么我們可以依據(jù)什么來劃分呢?第一種,按照生肖,這樣就可以創(chuàng)建12個分區(qū),分區(qū)編號從0開始分別代表鼠、牛、虎、兔、牛等等,這樣的分區(qū)規(guī)則就是對人員信息的二次歸類。第二種,我們估算12個分區(qū)的壓力也有點頂不住,那么我們可以按照姓名拼音的首字母來劃分,這也是二次歸類。

在實際實踐時可以將消息(ProducerRecord<生肖,人員信息>)對應的key設置為與其對應分區(qū)的“歸類類別”即可。比如,按生肖分,那么“屬牛的肥朝”可以這一條消息(人員信息)可以表示為:key=“牛”,value=“姓名:肥朝,特長:帥”。

聰明的同學還會接著想到用姓氏來歸類。。也不是不可行,中國百家姓(其實何止)。但是要考慮到一種情況就是數(shù)據(jù)傾斜,“趙錢孫李”所對應的分區(qū)肯定比“令狐”、“獨孤”、“上官”之類的分區(qū)所承擔的數(shù)據(jù)負載要多很多,這樣嚴重的數(shù)據(jù)傾斜會導致服務整體效能的降低。“趙錢孫李”可以視為熱點數(shù)據(jù),而“令狐”、“獨孤”、“上官”可以視為冷數(shù)據(jù),我們可以這樣劃分,參考下圖:

對于大姓來說可以獨占一個分區(qū),而對于中等姓氏來說可以合用一個分區(qū),而對于生僻姓氏來說可以共用一個分區(qū)。

在某些時候,按照字面的類別劃分也很難避免數(shù)據(jù)傾斜。沿用上面的例子,宋朝時期,姓趙的人實在太多,劃分到一個分區(qū)還是會有嚴重的數(shù)據(jù)傾斜,那么就需要對這一姓氏做多一些處理,多化幾個分區(qū)給它。

舉這些例子是為了說明:如果要讓分區(qū)獲得“二次歸類”的特性,就需要做好“二次歸類”的準備,也就是需要應對數(shù)據(jù)熱點問題。為了盡可能的數(shù)據(jù)分布均勻而弱化熱點問題應該根據(jù)歸類的特性做好合理的規(guī)劃。

在Kafka中創(chuàng)建消息的時候,如果不指定分區(qū),那么就會根據(jù)消息的key來進行計算。

如果key不為null,那么默認的分區(qū)器會對key進行哈希(采用MurmurHash2算法,具備高運算性能及低碰撞率),最終根據(jù)得到的哈希值來計算分區(qū)號,擁有相同key的消息會被寫入同一個分區(qū)。如果key為null,那么消息將會以輪詢的方式發(fā)往主題內(nèi)的各個可用分區(qū)。前者根據(jù)key進行計算,潛在的使用了“二次歸類”這個特性,后者采用輪詢的方式,潛在的丟棄了“二次歸類”的特性。

當然,我們還可以自定義Kafka中的分區(qū)器來實現(xiàn)隨機的分類,這個實現(xiàn)很簡單,從[0,分區(qū)數(shù))中挑選一個整數(shù)而已,如此也同樣會丟棄“二次歸類”的特性。

關(guān)于分區(qū)的這個屬性,你還有什么需要補充的嗎?不妨在留言去留言來一起探討。

歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/hidden-attribute-of-kafka-partition/


歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。

總結(jié)

以上是生活随笔為你收集整理的聊一聊Kafka分区的隐藏属性——二次归类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。