kafka與傳統的消息中間件對比


RabbitMQ和kafka從幾個角度簡單的對比

業界對於消息的傳遞有多種方案和產品,本文就比較有代表性的兩個MQ(rabbitMQ,kafka)進行闡述和做簡單的對比,

在應用場景方面,

RabbitMQ,遵循AMQP協議,由內在高並發的erlanng語言開發,用在實時的對可靠性要求比較高的消息傳遞上。

kafka是Linkedin於2010年12月份開源的消息發布訂閱系統,它主要用於處理活躍的流式數據,大數據量的數據處理上。

1)在架構模型方面,

RabbitMQ遵循AMQP協議,RabbitMQ的broker由Exchange,Binding,queue組成,其中exchange和binding組成了消息的路由鍵;客戶端Producer通過連接channel和server進行通信,Consumer從queue獲取消息進行消費(長連接,queue有消息會推送到consumer端,consumer循環從輸入流讀取數據)。rabbitMQ以broker為中心;有消息的確認機制。

kafka遵從一般的MQ結構,producer,broker,consumer,以consumer為中心,消息的消費信息保存的客戶端consumer上,consumer根據消費的點,從broker上批量pull數據;無消息確認機制。

2)在吞吐量,

kafka具有高的吞吐量,內部采用消息的批量處理,zero-copy機制,數據的存儲和獲取是本地磁盤順序批量操作,具有O(1)的復雜度,消息處理的效率很高。

rabbitMQ在吞吐量方面稍遜於kafka,他們的出發點不一樣,rabbitMQ支持對消息的可靠的傳遞,支持事務,不支持批量的操作;基於存儲的可靠性的要求存儲可以采用內存或者硬盤。

3)在可用性方面,

rabbitMQ支持miror的queue,主queue失效,miror queue接管。

kafka的broker支持主備模式。

4)在集群負載均衡方面,

kafka采用zookeeper對集群中的broker、consumer進行管理,可以注冊topic到zookeeper上;通過zookeeper的協調機制,producer保存對應topic的broker信息,可以隨機或者輪詢發送到broker上;並且producer可以基於語義指定分片,消息發送到broker的某分片上。

rabbitMQ的負載均衡需要單獨的loadbalancer進行支持。

原文:http://wbj0110.iteye.com/blog/1974988

收集的rabbitmq資料如下:

http://jzhihui.iteye.com/category/195005

http://lynnkong.iteye.com/blog/1699684

http://blog.csdn.net/anzhsoft/article/details/19607841

http://ybbct.iteye.com/blog/1562326

 

Kafka 對比 ActiveMQ

 

Kafka 是LinkedIn 開發的一個高性能、分布式的消息系統,廣泛用於日志收集、流式數據處理、在線和離線消息分發等場景。雖然不是作為傳統的MQ來設計,在大部分情況,Kafaka 也可以代替原先ActiveMQ 等傳統的消息系統。

Kafka 將消息流按Topic 組織,保存消息的服務器稱為Broker,消費者可以訂閱一個或者多個Topic。為了均衡負載,一個Topic 的消息又可以划分到多個分區(Partition),分區越多,Kafka並行能力和吞吐量越高。

Kafka 集群需要zookeeper 支持來實現集群,最新的kafka 發行包中已經包含了zookeeper,部署的時候可以在一台服務器上同時啟動一個zookeeper Server 和 一個Kafka Server,也可以使用已有的其他zookeeper集群。

和傳統的MQ不同,消費者需要自己保留一個offset,從kafka 獲取消息時,只拉去當前offset 以后的消息。Kafka 的scala/java 版的client 已經實現了這部分的邏輯,將offset 保存到zookeeper 上。每個消費者可以選擇一個id,同樣id 的消費者對於同一條消息只會收到一次。一個Topic 的消費者如果都使用相同的id,就是傳統的 Queue;如果每個消費者都使用不同的id, 就是傳統的pub-sub.

  ActiveMQ和Kafka,前者完全實現了JMS的規范,后者看上去有一些“野路子”,並沒有糾結於JMS規范,劍走偏鋒的設計了另一套吞吐非常高的分布式發布-訂閱消息系統,目前非常流行。接下來我們結合三個點(消息安全性,服務器的穩定性容錯性以及吞吐量)來分別談談這兩個消息中間件。今天我們談Kafka,ActiveMQ的文章在此。

  01 性能怪獸Kafka
  Kafka是LinkedIn開源的分布式發布-訂閱消息系統,目前歸屬於Apache定級項目。”Apache Kafka is publish-subscribe messaging rethought as a distributed commit log.”,官網首頁的一句話高度概括其職責。Kafka並沒有遵守JMS規范,他只用文件系統來管理消息的生命周期。Kafka的設計目標是:
(1)以時間復雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數據也能保證常數時間復雜度的訪問性能。
(2)高吞吐率。即使在非常廉價的商用機器上也能做到單機支持每秒100K條以上消息的傳輸。
(3)支持Kafka Server間的消息分區,及分布式消費,同時保證每個Partition內的消息順序傳輸。
(4)同時支持離線數據處理和實時數據處理。
(5)Scale out:支持在線水平擴展。
  所以,不像AMQ,Kafka從設計開始極為高可用為目的,天然HA。broker支持集群,消息亦支持負載均衡,還有副本機制。同樣,Kafka也是使用Zookeeper管理集群節點信息,包括consumer的消費信息也是保存在zk中,下面我們分話題來談:
1)消息的安全性
Kafka集群中的Leader負責某一topic的某一partition的消息的讀寫,理論上consumer和producer只與該Leader 節點打交道,一個集群里的某一broker即是Leader的同時也可以擔當某一partition的follower,即Replica。Kafka分配Replica的算法如下:
(1)將所有Broker(假設共n個Broker)和待分配的Partition排序
(2)將第i個Partition分配到第(i mod n)個Broker上
(3)將第i個Partition的第j個Replica分配到第((i + j) mode n)個Broker上
同時,Kafka與Replica既非同步也不是嚴格意義上的異步。一個典型的Kafka發送-消費消息的過程如下:首先首先Producer消息發送給某Topic的某Partition的Leader,Leader先是將消息寫入本地Log,同時follower(如果落后過多將會被踢出出 Replica列表)從Leader上pull消息,並且在未寫入log的同時即向Leader發送ACK的反饋,所以對於某一條已經算作commit的消息來講,在某一時刻,其存在於Leader的log中,以及Replica的內存中。這可以算作一個危險的情況(聽起來嚇人),因為如果此時集群掛了這條消息就算丟失了,但結合producer的屬性(request.required.acks=2 當所有follower都收到消息后返回ack)可以保證在絕大多數情況下消息的安全性。當消息算作commit的時候才會暴露給consumer,並保證at-least-once的投遞原則。
2)服務的穩定容錯性
前面提到過,Kafka天然支持HA,整個leader/follower機制通過zookeeper調度,它在所有broker中選出一個 controller,所有Partition的Leader選舉都由controller決定,同時controller也負責增刪Topic以及 Replica的重新分配。如果Leader掛了,集群將在ISR(in-sync replicas)中選出新的Leader,選舉基本原則是:新的Leader必須擁有原來的Leader commit過的所有消息。假如所有的follower都掛了,Kafka會選擇第一個“活”過來的Replica(不一定是ISR中的)作為 Leader,因為如果此時等待ISR中的Replica是有風險的,假如所有的ISR都無法“活”,那此partition將會變成不可用。
3) 吞吐量
Leader節點負責某一topic(可以分成多個partition)的某一partition的消息的讀寫,任何發布到此partition的消息都會被直接追加到log文件的尾部,因為每條消息都被append到該partition中,是順序寫磁盤,因此效率非常高(經驗證,順序寫磁盤效率比隨機寫內存還要高,這是Kafka高吞吐率的一個很重要的保證),同時通過合理的partition,消息可以均勻的分布在不同的partition里面。 Kafka基於時間或者partition的大小來刪除消息,同時broker是無狀態的,consumer的消費狀態(offset)是由 consumer自己控制的(每一個consumer實例只會消費某一個或多個特定partition的數據,而某個partition的數據只會被某一個特定的consumer實例所消費),也不需要broker通過鎖機制去控制消息的消費,所以吞吐量驚人,這也是Kafka吸引人的地方。
最后說下由於zookeeper引起的腦裂(Split Brain)問題:每個consumer分別單獨通過Zookeeper判斷哪些partition down了,那么不同consumer從Zookeeper“看”到的view就可能不一樣,這就會造成錯誤的reblance嘗試。而且有可能所有的 consumer都認為rebalance已經完成了,但實際上可能並非如此。

 

如果在MQ的場景下,將Kafka 和 ActiveMQ 相比:

Kafka 的優點

分布式可高可擴展。Kafka 集群可以透明的擴展,增加新的服務器進集群。
高性能。Kafka 的性能大大超過傳統的ActiveMQ、RabbitMQ等MQ 實現,尤其是Kafka 還支持batch 操作。下圖是linkedin 的消費者性能壓測結果:
 
容錯。Kafka每個Partition的數據都會復制到幾台服務器上。當某個Broker故障失效時,ZooKeeper服務將通知生產者和消費者,生產者和消費者轉而使用其它Broker。
Kafka 的不利

重復消息。Kafka 只保證每個消息至少會送達一次,雖然幾率很小,但一條消息有可能會被送達多次。 
消息亂序。雖然一個Partition 內部的消息是保證有序的,但是如果一個Topic 有多個Partition,Partition 之間的消息送達不保證有序。 
復雜性。Kafka需要zookeeper 集群的支持,Topic通常需要人工來創建,部署和維護較一般消息隊列成本更高


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM