RabbitMQKafka到底怎么選?

      網友投稿 774 2022-05-29

      前言

      開源社區有好多優秀的隊列中間件,比如RabbitMQ和Kafka,每個隊列都貌似有其特性,在進行工程選擇時,往往眼花繚亂,不知所措。對于RabbitMQ和Kafka,到底應該選哪個?

      RabbitMQ架構

      RabbitMQ是一個分布式系統,這里面有幾個抽象概念。

      broker:每個節點運行的服務程序,功能為維護該節點的隊列的增刪以及轉發隊列操作請求。

      master queue:每個隊列都分為一個主隊列和若干個鏡像隊列。

      mirror queue:鏡像隊列,作為master queue的備份。在master queue所在節點掛掉之后,系統把mirror queue提升為master queue,負責處理客戶端隊列操作請求。注意,mirror queue只做鏡像,設計目的不是為了承擔客戶端讀寫壓力。

      如上圖所示,集群中有兩個節點,每個節點上有一個broker,每個broker負責本機上隊列的維護,并且borker之間可以互相通信。

      集群中有兩個隊列A和B,每個隊列都分為master queue和mirror queue(備份)。那么隊列上的生產消費怎么實現的呢?

      隊列消費

      如上圖有兩個consumer消費隊列A,這兩個consumer連在了集群的不同機器上。RabbitMQ集群中的任何一個節點都擁有集群上所有隊列的元信息,所以連接到集群中的任何一個節點都可以,主要區別在于有的consumer連在master queue所在節點,有的連在非master queue節點上。

      因為mirror queue要和master queue保持一致,故需要同步機制,正因為一致性的限制,導致所有的讀寫操作都必須都操作在master queue上(想想,為啥讀也要從master queue中讀?和數據庫讀寫分離是不一樣的。),

      然后由master節點同步操作到mirror queue所在的節點。

      即使consumer連接到了非master queue節點,該consumer的操作也會被路由到master queue所在的節點上,這樣才能進行消費。

      隊列生產

      原理和消費一樣,如果連接到非 master queue 節點,則路由過去。

      所以,到這里小伙伴們就可以看到 RabbitMQ的不足:由于master queue單節點,導致性能瓶頸,吞吐量受限。雖然為了提高性能,內部使用了Erlang這個語言實現,但是終究擺脫不了架構設計上的致命缺陷。

      RabbitMQ和Kafka到底怎么選?

      Kafka

      說實話,Kafka我覺得就是看到了RabbitMQ這個缺陷才設計出的一個改進版,改進的點就是:把一個隊列的單一master變成多個master,即一臺機器扛不住qps,那么我就用多臺機器扛qps,把一個隊列的流量均勻分散在多臺機器上不就可以了么?

      注意,多個master之間的數據沒有交集,即一條消息要么發送到這個master queue,要么發送到另外一個master queue。

      這里面的每個master queue 在Kafka中叫做Partition,即一個分片。一個隊列有多個主分片,每個主分片又有若干副分片做備份,同步機制類似于RabbitMQ。

      如上圖,我們省略了不同的queue,假設集群上只有一個queue(Kafka中叫Topic)。每個生產者隨機把消息發送到主分片上,之后主分片再同步給副分片。

      隊列讀取的時候虛擬出一個Group的概念,一個Topic內部的消息,只會路由到同Group內的一個consumer上,同一個Group中的consumer消費的消息是不一樣的;Group之間共享一個Topic,看起來就是一個隊列的多個拷貝。

      所以,為了達到多個Group共享一個Topic數據,Kafka并不會像RabbitMQ那樣消息消費完畢立馬刪除,而是必須在后臺配置保存日期,即只保存最近一段時間的消息,超過這個時間的消息就會從磁盤刪除,這樣就保證了在一個時間段內,Topic數據對所有Group可見(這個特性使得Kafka非常適合做一個公司的數據總線)。

      隊列讀同樣是讀主分片,并且為了優化性能,消費者與主分片有一一的對應關系,如果消費者數目大于分片數,則存在某些消費者得不到消息。

      由此可見,Kafka絕對是為了高吞吐量設計的,比如設置分片數為100,那么就有100臺機器去扛一個Topic的流量,當然比RabbitMQ的單機性能好。

      總結

      本文只做了Kafka和RabbitMQ的對比,但是開源隊列豈止這兩個,ZeroMQ,RocketMQ,JMQ等等,時間有限也就沒有細看,故不在本文比較范圍之內。

      所以,別再被這些五花八門的隊列迷惑了,從架構上找出關鍵差別,并結合自己的實際需求(比如本文就只單單從吞吐量一個需求來考察)輕輕松松搞定選型。

      最后總結如下:

      吞吐量較低:Kafka和RabbitMQ都可以。

      吞吐量高:Kafka。

      本文內容參考自RabbitMQ和KafKa官方文檔,所以真要搞懂一個中間件的原理最好去看官方文檔,文檔里面有詳細的設計方案,我們可以自己進行設計方案的對比,從而找出符合自己實際情況的中間件。

      RabbitMQ Kafka

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:回顧Bigtable的經典設計
      下一篇:wxappUnpacker的bingo.bat腳本逐行解讀
      相關文章
      亚洲伊人久久大香线蕉苏妲己| 亚洲AV无码专区在线电影成人| 亚洲AV日韩AV永久无码色欲 | 亚洲国产人成在线观看69网站| 亚洲日韩精品一区二区三区 | 亚洲综合精品香蕉久久网| 国产成人毛片亚洲精品| jizzjizz亚洲| 亚洲成a人无码av波多野按摩| 婷婷亚洲综合五月天小说在线| 亚洲heyzo专区无码综合| 亚洲色成人网站WWW永久四虎| 亚洲中文字幕久久久一区| 在线综合亚洲欧洲综合网站| 亚洲乱妇老熟女爽到高潮的片| 亚洲乱码在线观看| 亚洲欧美不卡高清在线| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲午夜国产精品无码| 亚洲无线观看国产精品| 国产亚洲免费的视频看 | 亚洲欧美国产精品专区久久| 综合一区自拍亚洲综合图区| 亚洲AV无码乱码在线观看| 亚洲人成网站在线观看青青| 日日噜噜噜噜夜夜爽亚洲精品| 在线播放亚洲第一字幕| 久久精品国产亚洲香蕉| 亚洲天天做日日做天天欢毛片| 亚洲天堂中文字幕在线观看| 国产AV旡码专区亚洲AV苍井空 | 国产亚洲欧美在线观看| 亚洲Av无码乱码在线观看性色 | 亚洲熟妇无码八V在线播放| 亚洲AV永久无码精品放毛片| 高清在线亚洲精品国产二区| 精品亚洲一区二区三区在线观看| 国产偷国产偷亚洲清高动态图| 亚洲精品乱码久久久久66| 亚洲小视频在线观看| 亚洲18在线天美|