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.
如果在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通常需要人工來創建,部署和維護較一般消息隊列成本更高
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!