<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RabbitMQ和Kafka到底怎么選?

          共 2417字,需瀏覽 5分鐘

           ·

          2021-11-15 15:50

          相關閱讀:一個90后員工猝死的全過程


          來源:cnblogs.com/haolujun/p/9632835.html

          前言

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

          RabbitMQ架構

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

          如上圖所示,集群中有兩個節(jié)點,每個節(jié)點上有一個broker,每個broker負責本機上隊列的維護,并且borker之間可以互相通信。集群中有兩個隊列A和B,每個隊列都分為master queue和mirror queue(備份)。那么隊列上的生產(chǎn)消費怎么實現(xiàn)的呢?

          隊列消費

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

          因為mirror queue要和master queue保持一致,故需要同步機制,正因為一致性的限制,導致所有的讀寫操作都必須都操作在master queue上(想想,為啥讀也要從master queue中讀?和數(shù)據(jù)庫讀寫分離是不一樣的。),然后由master節(jié)點同步操作到mirror queue所在的節(jié)點。即使consumer連接到了非master queue節(jié)點,該consumer的操作也會被路由到master queue所在的節(jié)點上,這樣才能進行消費。

          隊列生產(chǎn)

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

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

          Kafka

          說實話,Kafka我覺得就是看到了RabbitMQ這個缺陷才設計出的一個改進版,改進的點就是:把一個隊列的單一master變成多個master,即一臺機器扛不住qps,那么我就用多臺機器扛qps,把一個隊列的流量均勻分散在多臺機器上不就可以了么?注意,多個master之間的數(shù)據(jù)沒有交集,即一條消息要么發(fā)送到這個master queue,要么發(fā)送到另外一個master queue

          另外,關注互聯(lián)網(wǎng)架構師公眾號,回復“面試”,送你一份面試題寶典!

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

          如上圖,我們省略了不同的queue,假設集群上只有一個queue(Kafka中叫Topic)。每個生產(chǎn)者隨機把消息發(fā)送到主分片上,之后主分片再同步給副分片。
          隊列讀取的時候虛擬出一個Group的概念,一個Topic內(nèi)部的消息,只會路由到同Group內(nèi)的一個consumer上,同一個Group中的consumer消費的消息是不一樣的;Group之間共享一個Topic,看起來就是一個隊列的多個拷貝。

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

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

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

          總結

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

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

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

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




          1、滴滴、滿幫、Boss直聘都被調(diào)查,為啥知乎美國上市沒被查?

          2、字節(jié)跳動重大宣布:取消!員工炸了:直接降薪1

          3、再見了,Teamviewer!

          4、人臉識別的時候,一定要穿上衣服啊!

          5、程序員被公司辭退12天,前領導要求回公司講清楚代碼,結果懵了

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼片婷婷 | 蜜臀一二三区 | 乱伦不卡| 最会潮吹的小护士露比来了上篇顶级色影 | 亚洲专区欧美专区 |