
本節配套視頻:https://www.bilibili.com/video/BV1W44y1G7Z1
提到消息隊列可能一些朋友經常聽別人說起一些名詞,比如:服務程序解耦,處理流量削峰,通過異步處理提升用戶體驗,緩沖批處理提高處理性能。筆者擅于白話解說,所以我就不用專業的術語去解釋專業的問題了。**我一直覺得消息隊列的功能和快遞柜的功能非常相似**,怎么個相似法呢?讓我來詳細給你說說。
[TOC]
## 一、白話消息隊列
我們來將快遞柜與消息隊列做一個對比
* **消息隊列比作快遞柜**:有很多廠家生產快遞柜,如:豐巢(apache kafka),速遞易(alibaba RocketMQ),近鄰寶(ActiveMQ)等等,反正常用的就這幾個。快遞柜負責臨時保存郵件,消息隊列負責臨時保存消息數據。
* **快遞員比作消息生產者**:快遞員負責向快遞柜投遞郵件,生產者負責向消息隊列投遞消息。異曲同工之妙啊!
* **消費者比作消息消費者**: 可能是這個例子太貼切了,以至于這句怎么看都是廢話。廢話也還是要說,生活中的消費者取郵件,程序中的消費者取消息數據。

## 二、快遞柜(消息隊列)帶來的好處
我們先回顧一下在**沒有快遞柜的日子里是怎么度過的**:某天早上突然接到快遞員電話:"兄弟,有你的快遞啊"。心里想真糟糕:“你早不來晚不來,我馬上就要上班了,你這個時候來。好吧,我等你一會”。結果有可能快遞員很不靠譜,一會說堵車,一會說馬上到,等來等去你上班遲到了。這種情況讓你很崩潰!
突然有一天,小區里突然出現了一個叫做快遞柜的東西,這東西好啊。"兄弟,有你快遞啊",心想誰是你兄弟:"啊,你放快遞柜里面吧,我晚上下班回來取"。快遞員愉快的把快遞放入快遞柜,開始打下一個電話,一早上10個郵件。如果每個都送上門快遞員最少要半小時。現在好了,9個放快遞柜,1個用戶要求送上門,10分鐘就搞定了。快遞員覺得這個東東真的很好!
快遞員高興了,消費者用戶其實也很滿意,有的購物狂一天有可能收10來個郵件。沒有快遞柜的時候,快遞員來一個電話就去取一次(等一次)快遞。有了快遞柜,下班的時候就一起全都取了。上面的例子,體現了消息隊列(快遞柜)的幾個優越性,請讀者仔細品評:
* 異步解耦:有了快遞柜,消費者不用等待快遞員,用戶體驗增強。消費者與生產者(快遞員)之間解耦,不會因為對方的操作行為,影響自己獨立處事的程序。用戶不用疲于等待與接收事件阻塞耗時。
* 流量削峰:我們假定一種極端的情況,你通過各個渠道買了1000本書,突然某一小時集中的給你打電話。你肯定不具備一個小時收1000個郵件的能力,所以你讓快遞員將郵件放入快遞柜。所以你就可以按照自己的處理能力,按照自己的時間安排去取郵件。同樣我們的消費者程序在面臨多用戶、高并發的請求情況下,將數據放入消息隊列保存可以將流量數據削峰,按照程序能夠處理的能力和資源進行數據消費。
* 緩沖批處理:生產者批量投遞,爽!消費者一次性取多個郵件,爽!
## 三、引入快遞柜帶來的缺點
說了這么多的優點,那么快遞柜有沒有缺點呢?當然有
1. 引入復雜度。毫無疑問,快遞柜(消息隊列)這東西是多出來的,在原來的收取過程中是不存在的。所以需要地方放它,還需要防火、防盜防潮,需要去維護它。消息隊列中間件也是一樣的,你需要服務器區安裝它,還要對它進行維護。
2. 會導致暫時的數據不一致。 如果沒有快遞柜,你收到了郵件件就是真的收到了。但是使用快遞柜之后,你收到了"郵件放入快遞柜的消息",但是與你真的取到郵件這中間會有一定的延時。當然你最終還是會取到郵件,選擇"消息隊列"快遞柜,就是要忍受暫時不一致,接受"最終一致性"。
3. 當然極端情況下,快遞柜壞了,你要不可避免地接受"郵件可能會丟失"的事實,對于安保系數高的小區這幾乎不會發生。
- 文檔概要
- 如何提問
- 一、kafka基礎入門
- 1.1.白話消息隊列
- 1.2.消息傳遞模型
- 1.3.典型應用場景一
- 1.4.典型應用場景二
- 1.5.kafka簡單介紹
- 1.6.kafka核心概念解析
- 1.7.搭建kafka單機版
- 1.8.kafka3中zk替代方案
- 二、生產級集群安裝
- 2.1.linux安裝JDK
- 2.2.linux主機與ip解析
- 2.3.linux新建用戶
- 2.4.linux開放防火墻端口
- 2.5.最大打開文件句柄數
- 2.6.集群主機之間免密登錄
- 2.7.zookeeper集群安裝(腳本)
- 2.8.kafka集群安裝部署(腳本)
- 2.9.kafka3無需zk的集群安裝
- 2.10.集群可用性驗證及配置
- 2.11.kafka集群可靠性配置
- 2.12內外網絡映射問題
- 三、生產者客戶端
- 3.1.本章閱讀說明
- 3.2.圖解kafka生產者
- 3.3.數據生產可靠性
- 3.4.保證消息順序性
- 3.5.生產者Java實現
- 3.6.自定義攔截器
- 3.7.自定義序列化器
- 3.8.自定義分區器
- 3.9.冪等與事務處理
- 四、消費者客戶端
- 4.1.消費者組與數據積壓
- 4.2.消費者Java實現
- 4.3.消費偏移與可靠性
- 4.4.分區再均衡
- 4.5.線程池與消費者組
- 4.6.消費者攔截器
- 4.7.自定義反序列化器
- 五、SpringBoot集成kafka
- 5.1.整合集成kafka客戶端
- 5.2.生產者同步異步分區攔截
- 5.3.生產者事務處理
- 5.4.KafkaListener詳解
- 5.5.Header及sendTo
- 5.5.監聽器模式及偏移量提交
- 5.3.消費監聽器的異常處理
- 5.6.JSON序列化日期問題處理
- 六、kafka安全認證
- 6.1.用戶名密碼PLAIN認證
- 6.2.SCRAM認證
- 6.3.Kerberos認證(撰寫中)
- 七、kafka運維配置管理
- 7.1.topic管理命令
- 7.2.KafkaTool帶界面管理工具
- 7.3.LogiKM企業級監控管理(撰寫中)
- 附錄
- linux虛擬機集群的搭建
- 筆者其他作品推薦
- vue深入淺出系列
- 手摸手教你Spring Boot2.0
- Spring Security-JWT-OAuth2一本通
- 實戰前后端分離RBAC權限管理系統
- 實戰SpringCloud微服務從青銅到王者
- 送書活動