activeMQ與kafka比較
前言
消息中間件的主要作用是:解耦、異步、削峰填谷
解耦:將接口調用依賴的兩個服務解耦,方便分布式部署。
異步:服務器之間的不同接口調用會降低服務器執行性能,即每個接口都要等待返回,采用MQ可以異步完成接口調用
削峰填谷:MQ可以保存消息,在服務器處理消息壓力大的時候存儲消息,在服務器壓力小的時候傾瀉,可以提升服務器利用率。
簡介
ActiveMQ簡介
activeMQ是一種開源的,實現了JMS1.1規范的,面向消息(MOM)的中間件,為應用程序提供高效的、 可擴展的、穩定的和安全的企業級消息通信
Kafka簡介
Kafka是分布式發布-訂閱消息系統。它最初由LinkedIn公司開發,之后成為Apache項目的一部分。Kafka是一個分布式的,可劃分的,冗余備份的持久性的日志服務。它主要用于處理活躍的流式數據。
特性
ActiveMQ特性
(1)事務
AMQ支持事務,在connection對象創建session的過程中可以選擇是否支持事務,在支持事務的session中,生產者發送消息的時候會transactionId。broker收到消息后判斷是否有transactionId,如果有就把message保存在transaction store中,等待commit或者rollback消息。
(2)在傳統項目中,如果消息的量級不大,選擇AMQ更優,AMQ擁有更好的系統支持能力,且安裝配置簡單,安裝和維護成本低。
kafka特性
(1)利用zk實現負載均衡和leader選舉,且支持高并發
(2)零拷貝技術,減少數據拷貝,提升性能。
(3)可進行持久化操作。將消息持久化到磁盤。
(4)分布式系統,易于向外擴展,無需停機,就可以橫向擴展。
(5)一個topic可以分為多個partition,每個partition是一個有序的隊列,partition物理上由多個segment組成,每個Segment存著message信息。
(6)支持批量發送,可以配置收集一定數量的消息然后再進行發送
(7)支持順序生產,順序消費:kafka生產者發消息的時候可以指定一個key,那么這個key對應的消息會發到相同的partition中,又因為partition是一個有序的隊列,所以只要單個consumer來消費這個partition中key對應的消息,就可以保證這批消息的順序。
特殊情況
kafka消息可能出現亂序的情況
生產者在發送消息的時候,若是異步發送給broker的,那么這個broker可能存在多個未確認的消息在同時發送的,也就是說,可能有三條有順序要求的消息(m1,m2,m3)在發送,然后會存在消息發送成功狀態未知的情況,有可能存在m1發送失敗,m2,m3發送成功,如果m1進行了重試,重新發送后成功了,這個時候消息順序就亂了(m2,m3,m1)。如果對于數據有嚴格順序要求的,發送的時候可以配置參數max.in.flight.requests.per.connection為1,表示在后一條消息發送之前,就已經知道前面消息是否發送成功的狀態。這樣就可以避免前一條發送失敗的情況下,后一條消息繼續發送,導致的順序錯亂。
兩者區別
(1)kafka是appendLog形式記錄消息的,而AMQ類似于傳統數據庫形式記錄消息,顯然kafka這種形式的消息記錄模式效率更高(磁盤追加寫的性能要遠高于隨機寫)。
(2)kafka可配置參數較多,對于熟練使用它的人來說,可以更靈活的處置。AMQ使用簡單,配置較少,開箱即用,但靈活性較低。
(3)AMQ是被動接收消息的,kafka是主動拉取式的
(4)前期使用的時候kafka不支持SSL,而AMQ支持,所以選擇AMQ的企業如果不想做改動也就不會選擇kafka。
(5)kafka支持批量發送,它會在本地收集到一批消息之后再發送,而AMQ的批量需要客戶端自己實現
(6)kafka在消息發送的時候可以選擇partition數目,而AMQ只能發送到一個broker,kafka的容錯能力比AMQ強
(7)kafka部署成本較高,維護要求比AMQ高
(8)AMQ社區不活躍,kafka社區活躍
(9)AMQ支持jdk1.6版本,有些老項目需要維護的還需要依賴它
(10)另外,AMQ歷史悠久,支持的工具比較多
(11)AMQ采用的是kahadb,Kafka采用的是levelDb