redis、kafka、rabittMQ對比 (轉)


本文不對三者之間的性能進行對比,只是從三者的特性上區分他們,並指出三者的不用應用場景。

1、publish/subscribe

發布訂閱模式如下圖所示可以具有多個生產者和發布者,redis、kafka、rebittMQ都滿足這樣的要求。

但是三者有各自的特色。

1.1 redis

redis的特征就是快,由於其數據是存儲在內存中的,處理速度相對另外兩者快了不少。通過使用redis可以實現一個簡單具有實時通信功能的聊天室。

2.2 kafka

kafka的設計初衷是一個日志系統,其隊列中的數據能夠持久化一段時間。因此后來的consumer能夠通過自定義offset來實現獲取之前的消息,而redis就不具備這樣的能力。

2.3 rabittMQ

rabittMQ設計的一個核心概念為Exchange,Exchange存在的意義是producer不會直接向queue發送消息,而是將消息先發給exchanger,而exchanger選擇將數據轉發給queue。rabittMQ的exchanger有4種轉發策略,包括direct、topic、headers、fanout。因此rabittMQ在消息的路由方面相比redis和kafka更加靈活。

2、work queue

work queue模式相比發布訂閱者模式更側重負載均衡,我們可以把一個隊列當做一個任務,而消費該隊列的worker需要共同處理隊列里的任務,同一條消息只能被處理一次。如下圖所示是work queue的示意圖:

 

2.1redis

redis可以使用list數據結構來實現這一任務,因為redis的單個操作是原子的,保障了一條消息只能被處理一次,但是缺點是consumer需要自己實現,還有一些負載均衡地策略也要自己去實現。

2.2rabittMQ

rabittMQ內部實現了這一功能,使用輪訓的方式給worker發消息保證了負載均衡。缺點是可拓展性不好,當consumer相當多的時候,所有的consumer都要向同一個queue去獲取數據,這樣導致queue的性能稱為了瓶頸。

2.3kafka

kafka通過consumer group的方式實現了work queue,同一個group的消費者能夠協調完成任務。kafka在分布式方面做得很好,在kafka中,一個queue和topic的概念等同,只是topic可以被分成多個partition,而這些partition分別存儲在不同的服務器上,這樣,同一個Consumer group中的consumer在消費數據的時候可以從不同的partition中獲取數據,減少了單台服務器的壓力。

3、更加復雜的情況

如下圖所示復雜的情況,以日志舉例,error日志需要持久化,所有的日志都應該打印出來。那么這里有兩個工作流,一個是持久化,一個是打印。

如果用redis和kafka來實現的話需要在producer上下功夫,將消息區分之后發送到不同的queue上,而rabittMQ則更加靈活,可以通過exchanger來實現消息的轉發。

4、小節

redis的特點就是快

kafka的特點是可拓展性高,可以持久化

rabittMQ的特點是靈活,能夠實現各種消息需求。

 

5 參考資料

原文鏈接:http://blog.csdn.net/maitianshouwei/article/details/57124155

 


免責聲明!

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



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