系統學習消息隊列分享(一) 怎樣系統學習消息隊列?


從系統之間有通信需求開始呢,就產生了消息隊列,它也是最古老的中間件之一。它的應用場景非常廣泛,分布式系統中的很多進程間通信問題,都可以用消息隊列來解決。可以說消息隊列是所有后端程序員的必備技能。但是,想要系統、深入地學習消息隊列,卻並不容易。

要了解消息隊列的完整知識體系,想深度進階為消息隊列達人,從理論到實踐,從基礎到進階,從深度到廣度,全方位吃透消息隊列。

哪些人適合學消息隊列?

后端開發者:消息隊列幾乎是每個后端程序員都會用到的中間件,無論你是開發微服務,實時計算,還是機器學習程序,都需要解決進程間通信的問題。

渴望技術提升的開發者:消息隊列所涉及的高性能通信、海量數據存儲、高並發這些底層的技術比較全面,並且功能簡潔、結構清晰,容易入門但又同時具有足夠的深度,非常適合用來深入分析和學習底層技術,幫助你實現從用“輪子”到造“輪子”的技術提升。

學習消息隊列,有哪些門檻?

至少熟練掌握一門編程語言,掌握所有程序員都需要具備的一些基礎技術知識和能力,例如:

  • 熟練使用各種常用集合,比如:數組、鏈表、字典等;
  • 掌握 Linux 系統的基礎知識,會使用常用的命令;
  • 具備多線程、並發控制編程能力;
  • 編寫過讀寫文件、通過網絡收發數據的程序;
  • 能看懂最基本的 UML 圖,包括類圖、時序圖等;
  • 了解最常用的幾種設計模式和算法。

以下內容是一些“加分項”,當然這些“加分項”你不一定非要具備,但會讓你的學習過程更加愜意。

1. 英文的閱讀能力

因為整個技術圈大部分的技術類資料、開源軟件的文檔、代碼的注釋和論文都是用英文撰寫的,如果你不滿足於平時只看過時的二手資料,一定要努力提升自己,達到能獨立、快速看懂英文技術文檔的水平。

這對於技術人,其實並不是非常難的事兒。大多數英文技術文檔涉及的專業詞匯不超過一百個,使用的語法和句式都比較簡單,理解起來絕對不會比中學英語考試題中的閱讀理解更難。所以,最重要的是不要對英語過於恐懼,並且不要怕麻煩,多讀多練習,平時多進行英文搜索,你會發現自己快速閱讀能力的提升。

2. 掌握 Java 語言和其生態系統

大部分服務端的開源軟件,包括我們這個課程涉及的 RocketMQ、Kafka、Pulsar 等,都是使用 Java 語言開發的。雖然 Java 本身有很多讓人詬病的地方,比如僵化的泛型系統,不確定的 GC 機制等,也不斷有 Go、Scala 等這些新興語言來挑戰 Java 的江湖地位,但是 Java 強大的生態系統在短時間內還是難以替代的。所以,無論你現在使用的是什么編程語言,學一點 Java 總是一個不錯的選擇。

3. 積極的學習態度

最后,也是最重要的一點是,對待寫代碼這件事兒的,你的真實態度是什么?

你是不是會認真地思考每一個細節是否已經做到最優?有沒有為使用到的每個集合,仔細考慮到底是用數組,還是鏈表,還是其他哪種數據結構更合適?你有多少次迫於項目進度的壓力而交出“算了,雖然我知道這么做不好,但也能湊合用”的代碼?你有沒有過為自己的某個(哪怕是自認為)絕妙設計,而成就感滿滿,幸福好幾天的時刻?你會不會因為溝通時別人提到了一個你不知道的技術名詞感到焦慮和羞愧,然后趕緊偷偷學習補齊這個技術短板?

針對這些問題,你可以做一個自我評估,了解自己到底對技術有多熱愛?因為只有發自內心的對技術的熱愛,才是保證持續學習並且不斷提升自己的唯一動力。

由淺入深學習消息隊列

要想學好消息隊列,不應該僅僅停留在使用層面上,還需要深入了解它的設計思路、實現原理和使用的底層技術。但是要注意循序漸進,由淺入深地去學習。

第一步就是去了解消息的基本概念,比如主題、訂閱、分區等。這些基礎的概念,就像我們學習一門編程語言中的基礎語法一樣,你只有搞清楚它們,才能進行后續的學習。然后,你需要去掌握使用消息隊列的技能,能夠處理一些常見的問題。

有了這些基礎知識的儲備以后,你就可以深入到源碼中去,進而加深你對消息隊列的理解,提升你的技術深度了。這時候你要了解其中必備的底層技術,比如高性能的網絡傳輸、內存管理和鎖的使用;同時也要深入學習消息隊列一些高級特性的實現原理,比如如何實現事務消息、消息隊列如何支撐海量 IoT 設備同時在線。

當然,學習消息隊列的知識,最后一定要付諸實踐,也就是落到代碼層面上去操作執行。你可以選擇用消息隊列去實現你的業務系統,也可以使用實現消息隊列的底層技術,去實現其他的中間件系統。

一份知識圖譜

我整理了一張 “消息隊列生態全景圖”,涵蓋了消息隊列產品、標准和協議、應用場景、編程語言以及實現技術,希望可以幫助你對整個消息隊列生態系統有宏觀的了解和認知。

 

我們一起來大概瀏覽一下圖中涉及的內容,首先我們來看看消息隊列的產品、標准和協議,以及應用場景的部分。

目前,市面上有的消息隊列產品很多,像 Kafka、ActiveMQ、RocketMQ、Pulsar、RabbitMQ 等等,其中比較主流的開源消息隊列為 Kafka、RocketMQ 和 RabbitMQ。當然你並不需要把每個消息隊列都去學習一遍,因為這些消息隊列中很多的原理和知識都共通的。

在接下來的課程中,我會以這些開源消息隊列產品為例子對具體的知識點進行講解,也會順便講解每個產品它的特點。掌握了這些通用的原理,即使你以后碰到一款全新的、我們沒有講過的消息隊列,你也可以做到很快上手。

與消息隊列相關的協議和標准有 JMS、AMQP、MQTT 和 OpenMessaging。不過,目前為止還沒有哪個標准或者協議能“一統江湖”,你做一個大概的了解即可,如果需要用到的時候再深入學習也來得及。

消息隊列的應用范圍廣泛,在一些典型且常用的消息隊列應用場景中,比如像處理日志數據、監控、流計算等,你需要了解,對應不同場景,應該選用哪個消息隊列產品?什么樣的姿勢才是最佳的使用方式?在課程中,我會穿插着介紹一些最佳實踐,幫助你在遇到類似場景時少踩一些坑。

然后,我們來看看這些開源消息隊列產品實現中,涉及的編程語言和技術要點。

消息隊列涉及到的語言有 Java、Scala 和 Erlang。實際上對於編程語言本身,你並不需要特別的關注,無論你最熟悉的語言是不是 Java 或者 Scala 都沒關系,鑒於語言的相通性,只要你有編程語言的基礎,即使是一門從未接觸過的語言,通過短時間的學習達到可以讀懂代碼的水平,一般來說都是不成問題的。

我們學習的大部分知識點也不是和某種語言強相關的,你更多需要關注的是其中的設計思想、實現原理和實踐方法這些技術本身的東西。

對於實現消息隊列中涉及的重要的實現技術,像網絡通信、序列化反序列化、分布式事務、內存管理等,這部分內容是這門課程中的精粹,需要你重點學習。每一個技術要點我都會在進階篇中對應一節課程來專題講解。這些基礎的技術要點不僅僅可以用於實現消息隊列,在其他各種中間件的實現過程中都會涉及,也是各種高級研發職位面試題中經常會被問到的內容。

學習資源推薦

消息隊列的最佳學習資料就是它們的官方文檔,因為官方文檔更加詳細准確,並且隨着版本迭代,很多第三方教程文檔會過時,而官方文檔總能保持與當前版本同步更新。以下是幾個開源消息隊列的官方文檔:

RocketMQ 官方文檔: https://rocketmq.apache.org/docs/quick-start/

RocketMQ 中國開發者中心:http://rocketmq.cloud/zh-cn/ (感謝專欄用戶 @0xFFFFFFFF 同學推薦)

Kafka 官方文檔: http://kafka.apache.org/documentation/

RabbitMQ 官方文檔: https://www.rabbitmq.com/documentation.html

在使用消息隊列的過程中,如果遇到問題,要善用搜索引擎,我推薦你首選 Google,次之是 Stack Overflow,相對而言,這些搜索引擎搜索到有價值信息的概率會更高一些。

Stack Overflow:https://stackoverflow.com/

 

 


免責聲明!

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



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