1.為什么需要消息隊列
舉個經典的例子。
你是一個網購達人,經常在網上購物。快遞小哥到了你的小區后,立刻給你打電話說:“你的快遞到了,請馬上來取。”
但你是一個合格的牛馬,在上班,不方便取快遞,只能等下班才能取快遞。那快遞小哥總不能一直傻等著你下班吧,他還有很多其他人的快遞要送。不管是你請假拿快遞,還是小哥干等著你來取快遞,這都會影響效率。
因此,快遞柜、快遞站應用而生,他的身份就是消息隊列。它充當了一個緩沖區的角色,快遞小哥按照自己的時間安排送快遞,我們按照自己的時間安排取快遞,如此一來,就解決了快遞員和你之間的時間差和溝通效率問題。
總結一下,消息中間件出現帶來的好處:
1、 解耦
快遞小哥手上有很多快遞需要送,他每次都需要先電話一一確認收貨人是否有空、哪個時間段有空,然后再確定好送貨的方案。這樣完全依賴收貨人了!如果快遞一多,快遞小哥估計的忙瘋了……如果有了快遞站,快遞小哥只需要將同一個小區的快遞放在同一個快遞站,然后通知收貨人來取貨就可以了,這時候快遞小哥和收貨人就實現了解耦!
2、 異步
快遞小哥打電話給我后需要一直在你樓下等著,直到我拿走你的快遞他才能去送其他人的。快遞小哥將快遞放在快遞站后,又可以干其他的活兒去了,不需要等待你到來而一直處于等待狀態。提高了工作的效率。
3、 削峰
假設雙十一我買了不同店里的各種商品,而恰巧這些店發貨的快遞都不一樣,有中通、圓通、申通、各種通等……更巧的是他們都同時到貨了!中通的小哥打來電話叫我去北門取快遞、圓通小哥叫我去南門、申通小哥叫我去東門。我一時手忙腳亂……此時,一個菜鳥驛站就解決了這些問題。
2.什么是kafka,應用場景
kafka是基于發布/訂閱的分布式消息系統。具有消息持久化速度快、高吞吐、高容錯、易擴展的特點。
kafka的作用和好處是:解耦、異步、削峰。
Kafka的主要應用場景有:
- 消息隊列:用作高吞吐量的消息系統,將消息從一個系統傳遞到另一個系統。
- 日志收集:集中收集日志數據,然后通過Kafka傳遞到實時監控系統或存儲系統。
- 流計算:處理實時數據流,將數據傳遞給實時計算系統,如Apache Storm或Apache Flink。
- 事件溯源:記錄事件發生的歷史,以便稍后進行數據回溯或重新處理。
3.kafka的集群架構
?推薦視頻:詳細原理_嗶哩嗶哩_bilibili
3.1架構圖
3.2.kafka基本架構包括的組件及作用
Kafka 的基本架構主要包括四個組件:Producer(生產者)、Consumer(消費者)、Broker(消息代理)和 Zookeeper(協調器)。
- Producer(生產者):負責將數據發布到 Kafka 的特定 Topic 上。它會根據要求將數據以不同的分區策略分布到各個分區里。
- Consumer(消費者):從 Kafka 的 Topic 中讀取數據。消費者可以屬于某個消費組(Consumer Group),這樣可以讓多個消費者平衡負載讀取數據。
- Broker(消息代理):是 Kafka 的核心。Kafka 集群由一個或多個服務器組成,每個服務器被稱為 Broker。Broker 負責接收消息、記錄消息、響應消費者請求等。
- Zookeeper(協調器):用于 Kafka 的分布式協調和管理任務,比如存儲 Broker 的元數據信息、管理集群成員關系、主題配置、選舉 Leader。Zookeeper 確保 Kafka 集群的高可用性和一致性。
其他名詞解釋:
- Topic:Topic 是特定類型的消息流。Kafka 中的消息被歸類為不同的主題,生產者將數據發送到特定的主題,消費者從特定的主題讀取數據。
- Partition:每個 Topic 可以分成多個 Partition(分區),以便于擴展和提高并行處理能力。每個 Partition 都是一個有序的、不可變的消息序列,并且可以持續地添加消息。
- Leader and Follower:在 Partition 的副本中,有一個副本是 Leader,其他副本則是 Followers。Leader 副本負責處理所有針對該 Partition 的讀寫請求,Follower 副本會同步 Leader 的數據作為備份。
- Replication:每一個分區都有多個副本,副本的作用是做備胎。當主分區(Leader)故障的時候會選擇一個備胎(Follower)上位,成為Leader。在kafka中默認副本的最大數量是10個,且副本的數量不能大于Broker的數量,follower和leader絕對是在不同的機器,同一機器對同一個分區也只可能存放一個副本(包括自己)。
- Offset:Offset 是 Partition 中每條消息的唯一標識符,它是一個單調遞增的整數。消費者通過 Offset 來追蹤其消費進度。
- Consumer Group:一組 Consumers 可以組成一個 Consumer Group,用于共同消費同一個 Topic 下的消息。Kafka 確保每條消息只會被同一個 Consumer Group 中的一個 Consumer 處理。