優秀的訊息佇列中介軟體有很多,比如rabbitmq和kafka,每個佇列都有各自的特性,在進行工程選擇時,往往眼花繚亂,不知所措。對於rabbitmq和kafka,到底應該選哪個?
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這個語言實現,但是終究擺脫不了架構設計上的致命缺陷。
說實話,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
rabbitmq 是用erlang實現的乙個高併發高可靠amqp訊息佇列伺服器。rabbitmq 依賴於erlang環境,所以先要安裝erlang 執行 otp win32 r16b03.exe 再安裝rabbitmq 執行 rabbitmq server 3.2.3.exe 新增環境變數 rabb...
訊息中介軟體RabbitMQ
1非同步 不等待 2解耦 任務的序列變並行 3流量削峰 大任務量負載均衡 rabbitmq,kafka,flume amqp advanced message queue protocol 0 訊息 分為訊息頭和訊息體,訊息頭包含 路由鍵 routing key,優先順序priority,deliv...
訊息中介軟體RabbitMQ
1.1.為什麼使用訊息佇列 應用場景 常見的訊息中介軟體有?用於實現分布式系統模組與模組之間的訊息通訊。原理 原理就是生產者生產訊息,把訊息傳送給activemq。activemq接收到訊息,然後檢視有多少個消費者,然後把訊息 給消費者,此過程中生產者無需參與。消費者接收到訊息後做相應的處理和生產者...