一、消息中間件
官方解釋:消息中間件利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。
通過提供消息傳遞和消息排隊模型,它可以在分佈式環境下擴展進程間的通信。
說白了就是在分佈式中進行消息的收發和處理的,但是爲什麼用,怎麼用,用來解決什麼問題
二、使用場景
版本:kafka2.10
簡易架構:一般消息中間件有三大模塊,producer(消息生產),broker或者叫Queue(消息存放),consumer(消息消費)如下圖
一般情況下producer和consumer在兩個不同系統A和B,A系統生產消息,並把消息存放到broker中,B系統消費存放在
Broker上的消息信息,乍一看跟系統之間RPC調用沒什麼區別,都是爲了系統間通信,相對於RPC調用優勢在哪裏
1.異步處理:貌似RPC調用也可以實現異步調用的功能,但是RPC調用的異步處理跟消息中間件還是有很大的區別的
rpc異步調用後,當前系統對是否通信成功並無感知(是否通信成功也可以理解爲消息是否已達),也許因爲網絡原
因,異步的消息並沒有發送到其他系統;針對這一點消息中間件對消息做了改善,比如說持久化,接下來會以
kafka講解支持消息重試
2.流量控制:系統的流量受到時間,季節,天氣,節日等因素的影響,流量並不是均勻的,比如說11.11,流量會很大,
如果所有流量全都直接打到底層系統,甚至到數據庫,那麼系統很有可能會掛掉,這時候消息中間件的作用就
體現出來了所有消息先存到broker上,consumer根據自己的消費能力處理broker的消息
3.服務解耦:電商項目中很多系統一般都會訂單感興趣,訂單創建,完成,取消或退回,如果沒有消息中間件,那麼每
個訂單的創建都要通知到對訂單創建感興趣的系統,這樣各個系統都會耦合到一塊,增加了系統的複雜度;但是
如果通過消息中間件實現,訂單創建後消息保存到消息中間件,對訂單感興趣的系統訂閱這個消息,然後處理自
己系統的邏輯很大程度上降低了系統的耦合度
整體來說消息中間件具有以上三大優勢,可以根據具體的業務場景分析,是否應該接入;不過不同的消息中間件也會提
供一些特殊的功能,比如事務,通過消息中間件的事務來保證系統數據的最終一致性,對於系統的性能及吞吐量都有很
大的提升目前支持事務的消息中間件有RocketMq和老牌ActiveMq都是apache下的產品,本文要講的kafka並不支持事務
三、kafka的優勢
1.高吞吐量:據說 每秒可以生產約 25 萬消息(50 MB),每秒處理 55 萬消息(110 MB)
在消息只支持持久化模式下能達到這麼高的吞吐量已經相當可觀了
2.高可用性:kafka只支持數據持久存儲,並且可以靈活配置數據備份模式及應答模式,有很高的可用性
3.高可擴展性:kafka基於zookeeper的,broker可以靈活擴展
4.消息被處理在consumer維護,而不是在server端,消費失敗可以靈活處理
四、kafka架構及使用
簡單瞭解一下kafka的架構:
producer:消息生產方,直接與broker進行連接;只需要連接到一臺broker上,就可以獲得整個集羣的broker信息,並
緩存在系統本地;並且定期更新緩存,防止broker掛掉系統無感知;生產消息到broker採用push的方式
consumer:消息消費方,kafka採用pull的模式消費topic
優點:可以根據自身系統的消費能力拉取並消費信息;相比於push方式來說,可以避免消息的丟失
缺點:需要實時關注broker中是否有消息產生
broker:消息存儲,並且把自身的信息註冊到zookeeper上
topic:主題,消息發送和消息接收指定的消息的主題,可以存在於多個broker上,但是一個消息只會存在一臺broker上
partitions:消息分區,在磁盤上表現爲一個文件夾,一個topic可以有多個partitions,並每一個partitions存放的數據是
互斥的,一個partitions只存在於一個broker上;一般會均勻的分佈在不同broker上
segment:消息片,在磁盤上表現爲一個文件,在partitions文件夾下,存放消息數據
replica:消息副本,對應於partitions,作爲消息的備份出現,可配置數量;一般會均勻的分佈在不同broker上