1、吞吐量
kafka吞吐量更高:
1)Zero Copy機制,內核copy數據直接copy到網絡設備,不必經過內核到用戶再到內核的copy,減小了copy次數和上下文切換次數,大大提高了效率。
2)磁盤順序讀寫,減少了尋道等待的時間。
3)批量處理機制,服務端批量存儲,客戶端主動批量pull數據,消息處理效率高。
4)存儲具有O(1)的復雜度,讀物因為分區和segment,是O(log(n))的復雜度。
5)分區機制,有助於提高吞吐量。
2、可靠性
rabbitmq可靠性更好:
1)確認機制(生產者和exchange,消費者和隊列);
2)支持事務,但會造成阻塞;
3)委托(添加回調來處理發送失敗的消息)和備份交換器(將發送失敗的消息存下來后面再處理)機制;
3、高可用
1)rabbitmq采用mirror queue,即主從模式,數據是異步同步的,當消息過來,主從全部寫完后,回ack,這樣保障了數據的一致性。
2)每個分區都可以有一個或多個副本,這些副本保存在不同的broker上,broker信息存儲在zookeeper上,當broker不可用會重新選舉leader。
kafka支持同步負責消息和異步同步消息(有丟消息的可能),生產者從zk獲取leader信息,發消息給leader,follower從leader pull數據然后回ack給leader。
4、負責均衡
1)kafka通過zk和分區機制實現:zk記錄broker信息,生產者可以獲取到並通過策略完成負載均衡;通過分區,投遞消息到不同分區,消費者通過服務組完成均衡消費。
2)需要外部支持。
5、模型
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;