kafka删除队列_Kafka消息队列
剛做完一個項目,從現在開始習慣在有時間的時候做一些總結,也為大家分享一些我踩坑的經驗。先說說我在項目中使用kafka遇到的坑。首先,介紹一下背景,kafka的基礎實現是項目組另一位大哥幫忙編寫的,我只需要配置和消費。
坑1:在配置消費者的時候,一定要配置好url、集群、主題、消費組+校驗碼。如果消費不到,需要反復校驗2~3次。
坑2:在消費的第一時間給接收kafka數據的字符串打印日志,為方便提示。和生產者那邊的同事核對發送過來的實體是否和我們消費的實體是一致的,這點還是蠻重要的。
Kafka是啥?
kafka是一個實時數據處理系統,也是一個消息中間件。可以橫向擴展、高可靠、還變態快。
實時數據處理系統,就是數據一旦產生,就要能快速進行處理。
Kafka中的名詞和解釋
Producer:消息生產者。發送消息
Consumer:消息消費者,讀取消息
Topic:主題,可以理解為一個隊列。Kafka二代是這么做的。
消費組 Consumer Group(CG):若干個消費者的集合。這是kafka用來實現一個主題消息的廣播和單播的手段。一個主題可以有多個消費組,主題消息會復制(不是真正的復制,是概念上的)到所有的消費組。但每個消費組只會把消息發送給其中的一個消費者。如果要實現廣播,只需要每個消費者占據一個獨立的消費組就可以了。
一臺kafka服務器 Broker:一臺kafka服務器就是一個broker。一個集群有多個broker,一個broker可以容納多個topic。
Partition:為了實現擴展性,一個非常大的topic可以分布到多個kafka服務器上,一個topic可以分為多個partition,每個partition都是一個有序隊列。每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。kafka只保證一個partition中的順序,不保證一個topic的整體(多個partition)的順序。
Offset:kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找,例如你想找到位于2049的位置,只要找到2048.kafka的文件即可。第一個offset就是00000.kafka。
為什么需要消息中間件?
消息中間件的作用:
解耦消息的生產和消費。
緩沖。
想象一個場景:你的一個創建訂單的操作,在訂單創建完成之后,需要觸發一系列其他操作,比如進行用戶數據統計,給用戶發送短信,給用戶發送郵件等等。比如這樣:
createOrder(...){
...
startOrderData(...);//
sendSMS();
sendEmail();
}
這么寫似乎也沒有問題,但是如果你想給系統引進一個用戶行為分析服務,它也需要在訂單創建完成之后進行。像這樣的行為不斷增多,系統不斷壯大,代碼也逐漸膨脹:
createOrder(...){
...
startOrderData(...);
sendSMS();
sendEmail();
// new operation
statUserBehavior(...);
doXXX(...);
doYYY(...);
// more and more operations
...
}
導致代碼越來越膨脹的原因在于:消息的生產和消費耦合在一起了。
若把創建訂單,和創建訂單完成后的一系列操作解耦。如果使用消息中間件,創建訂單在生產者中完成,那其他一切訂單創建的行為就在消費者中完成,這樣我們可以把創建訂單簡化成一個接口。
createOrder(...){
...
sendOrderCreatedMessage(...);
}
通過解耦,消費者在消費數據時就會更加靈活,不用每次消息一生產就馬上去處理。等到自己有空了,再去處理也不遲。
kafka一代 - 消息隊列
kafka能把生產者和消費者解耦,主要是因為它把消息存在了一個消息隊列中,這個消息隊列的數據結構是一個先進先出的隊列。

kafka是怎么保證隊列按順序消費的?
kafka不會因為一個消費者消費了index=0的數據而去刪除這條數據,因為消費者是多個,其他的消費者還需要去消費這條index=0的數據。
事實是:kafka會對數據持久化存儲(至于存放多久,可以進行配置)。消費端會記錄一個offset,表明消費者當前消費到哪條數據,當下一次消費時,只需取offset+1的數據就好了。
這算是一個簡單的消息中間件,暫稱消費者一代。它會存在一些問題:
主題(topic)魚龍混雜。想象一下,若一個消費者訂閱了主題“A”,卻要在ABCDEF…等各種各樣的主題中尋找主題為“A”的消息,這樣的性能是很慢的。
吞吐量低。我們把全部消息都放在一個消息隊列里,請求一多,這個隊列肯定應付不過來。
由此,我們引入消費者二代。
Kafka二代 - Partition
要解決前面提到的兩點問題,很簡單--分布存儲。
二代Kafka引入了Partition的概念,也就是采用多條隊列,每條隊列里的消息都是相同的topic:

Partition在設計上解決了上面提到的兩個問題:
純Topic隊列。一個隊列只有一種主題。消費者不用擔心會碰到不是自己想要的主題的消息了。
提高吞吐量。不同主題的消息交給不同隊列去存儲,再也不用以一敵十了。
總結
以上是生活随笔為你收集整理的kafka删除队列_Kafka消息队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详谈为什么要写测试用例
- 下一篇: Luzj's Zte 中兴认证客户端开放