一、吞吐量
kafka吞吐量更高:
1)Zero Copy機制,內核copy數據直接copy到網絡設備,沒必要通過內核到用戶再到內核的copy,減少了copy次數和上下文切換次數,大大提升了效率。
2)磁盤順序讀寫,減小了尋道等待的時間。
3)批量處理機制,服務端批量存儲,客戶端主動批量pull數據,消息處理效率高。
4)存儲具備O(1)的複雜度,讀物由於分區和segment,是O(log(n))的複雜度。
5)分區機制,有助於提升吞吐量。
二、可靠性
rabbitmq可靠性更好:
1)確認機制(生產者和exchange,消費者和隊列);
2)支持事務,但會形成阻塞;
3)委託(添加回調來處理髮送失敗的消息)和備份交換器(將發送失敗的消息存下來後面再處理)機制;
三、高可用
1)rabbitmq採用mirror queue,即主從模式,數據是異步同步的,當消息過來,主從所有寫完後,回ack,這樣保障了數據的一致性。
2)每一個分區均可以有一個或多個副本,這些副本保存在不一樣的broker上,broker信息存儲在zookeeper上,當broker不可用會從新選舉leader。
kafka支持同步負責消息和異步同步消息(有丟消息的可能),生產者從zk獲取leader信息,發消息給leader,follower從leader pull數據而後回ack給leader。
四、負責均衡
1)kafka經過zk和分區機制實現:zk記錄broker信息,生產者能夠獲取到並經過策略完成負載均衡;經過分區,投遞消息到不一樣分區,消費者經過服務組完成均衡消費。
2)須要外部支持。
五、模型
1)rabbitmq:
producer,broker遵循AMQP(exchange,bind,queue),consumer;
broker爲中心,exchange分topic,direct,fanout和header,路由模式適合多種場景;
consumer消費位置由broker經過確認機制保存;
2)kafka:
producer,broker,consumer,未遵循AMQP;
consumer爲中心,獲取消息模式由consumer本身決定;
offset保存在消費者這邊,broker無狀態;
消息是名義上的永久存儲,每一個parttition按segment保存本身的消息爲文件(可配置清理週期);
consumer能夠經過重置offset消費歷史消息;
須要綁定zk;網絡