上個觀念 IOC 強調程式碼的品質,第二個觀念 message queue 強調的則是 “訊息的溝通”。
接下來會利用三篇文章的篇幅講解 message queue 的基礎概念,第一篇文章以介紹 message queue 概念與使用時機為主,第二篇則是選擇介紹業界常用的 RabbitMQ service,第三篇則是結合第一篇的知識與第二篇的 RaabitMQ 實作一個小範例。
在進入主題 message queue 以前,想先跟各位談談應用程式的整合 - Application Intergration。
在一個系統中,一般不會只有一隻程式在運作,而是會有多隻程式同時負責各種不同的任務,而程式之間難免會有互相傳遞資料進行處理的需求,而這類的需求,以下都統稱為 applcation 的整合。
而常見的 Application Intergration 方式又分為以下幾種:
source application 根據要處理的任務,產生檔案到特定的路徑,其中任務成功或失敗可以存放到不同 folder 中。
而其他接收訊息的 application(或稱 process application) 則是不停監控該路徑有沒有新檔案產生,有則取出檔案進行處理。
基本上方法和 file based 差不多:
這個方式也就是今天的主角,而它的特性有:
了解幾種不同的方式後,可以了解到 message broker 的方式是以上幾種模式改良後產生的結果。
訊息佇列(Message Queue,簡稱MQ),從字面意思上看,本質是個佇列,FIFO 先入先出,只不過佇列中存放的內容是message。
其主要用途:
的訊息溝通
queue 是將等待處理的任務排好,之後依照順序將任務從 queue 中取出處理(先進先出), Message Queue 就是將存在 queue 中的 message 在兩端(Producer、Consumer)中傳遞。
Message 其實就是 sender 與 reciever 之間傳遞的資料,例如通知一個服務執行某項任務的訊息或是傳遞一項 task 執行後的相關資訊
基本上 message queue 的架構由 Producers 、 Message Queue 、 Consumers 組成, Producers 負責創建訊息並傳遞訊息至 Message Queue,Consumers 負責從 queue 中取出訊息並執行對應的行為。存放在 queue 中的 Message 會在被 Consumers 接收後才會移除。
Asynchronous Communications Protocol
非同步,這是 message queue 很大的特性。
Producers 傳送訊息至 Message Queue 之後不需要立即得到 response 以繼續處理其他事情。
舉例: Email,你在送出 email 之後不會特別去確認信件真的傳遞到對方信箱,而是會繼續去做其他事情。
Better performance:
Decouple 解耦性
Reliablity
Flexiability of scaling
Q:假設你擁有一個 web service,每秒需要接受大量 request,request 不能被丟失,但 request 又要經過一個大量運算的 function 才能得到 response....
換句話說,你需要你的 server 可以保持在可以接收 request 的狀態,不被前一個 request block 住。
A:在 web service 跟 process service 中間加入 message queue。
而這樣的特性也讓 message queue 成為 microservice 服務間溝通的主流方式之一。
這篇文章講述了 message queue 的基本概念、與其他訊息傳遞方式的異同、message queue 的優點與特性、message queue 的 simple use case,下篇文章將介紹常見的 message queue 服務 - RabbitMQ,讓我們可以更輕易的建構出 message queue 的架構,也介紹一些它獨有的一些功能。
想盡辦法當好一個Junior Backend Developer
用舒服的姿勢開發 Python Project
https://godleon.github.io/blog/ChatOps/message-queue-concepts/