前言

延續上述練習,接下來我們想做到,當 HangFire 撈取新 Youbike 資料的同時,讓系統能夠同步更新我們的快取資料確保使用者能夠拿到最即時的資料,這時候 Message Queue就會派上用場,接下來就來研究看看Message Queue 能做到那些事,以及如何實作。

本文

Application Intergration(系統整合)

在開始認識 Message Queue 之前我們需要先對系統整合有些許概念。

系統整合指的是:
一個完整的系統,不會只有一支程式在運作,而是有各種不同的程式各個相互合作下達成不同的任務,在合作的過程中就需要透過訊息傳遞的幫助來協助彼此間相互合作,這類的需求我們就稱之為系統整合需要做到的事。

Ex:設想一個工廠的運作也是如此,工廠內不會只有一個產線在運行,像是特斯拉的工廠,我們從源頭需要備料,每一個零件的組裝,到一個完整的汽車烤漆,層層都有各個產線需要完成的事情,而相互間溝通就是需要透過系統整合來協助達成。

而系統整合分為了以下幾種方式:

1、Filed Based Integration(檔案為主的整合方式)。

Source Appication(來源程式)會根據要處理的任務,產生相對應的檔案到指定的路徑中,而 Proccess Appication(處理程式)就會一直監看資料夾內有沒有需要處理的任務,當有的時候就會取出檔案作相對應的處理,並將處理的結果放到合適的檔案存放區。

2、Shared Database Integration(共享資料庫的整合方式)。

Source Appication(來源程式)將要處理的任務寫入 DB,Proccess Appication(處理程式)就會一直監看 DB 有沒有需要處理的任務,當有的時候就會取出任務作相對應的處理,並將處理的結果寫回到 DB。
這種方式就有點像我們Hangfire的運作模式

3、Direct Connection Integration(直接連結的整合方式)。

Source Appication(來源程式)透過提前協議好的連結方式(TCP/IP、Named pipe connection),直接傳遞要處理的任務,傳遞的資料格式可能為(Binary、XML、JSON等),Proccess Appication(處理程式)處理完任務後再將結果傳回。

4、Asynchronous Message Broker(透過Message Broker的非同步傳遞方式)。

來源程式(這邊會稱為:Producer Appication)將任務傳給 Message Broker,Message Boker 在透過佇列(Queue)的方式將任務排列先後順序,最後將任務傳遞給處理程式進行處理(這邊稱之為Consumer Application)。

這種類型的傳遞方式特點為:

  • 不限制傳遞的資料格式。
  • 需要有一個 Message Broker Middleware 進行協助處理任務的排列。
  • 非同步的溝通方式,Producer 傳送訊息至 Message Queue 後不需要立即得到回應,可以先行處理其他事情。
  • Comsumer 可以等到有空的時候再來處理任務。

所以這邊最大的特點是,將收發訊息的雙方進行了解耦合的動作,兩邊在開發上可以專注在開發自己的程式上、收送雙方也不需要彼此的實體位置(IP地址、接收訊息的程式在哪)僅需要把訊息往 Message Broker 送即可。

有著好的可靠性,訊息放在 Queue 中使得資料不容易流失、Comsumer 就算暫時無法消化訊息也沒關係,Message Queue 會暫時將資料存起來等到 Comsumer 有資源可以消化時再將訊息送出去。

架構上也可以達到彈性擴展,Poducer、Message Broker、Comsumer 都可以依照需求增減,Message Queue 也是微服務的架構下最主要的溝通模式。

RabbitMQ

這次我們要研究的 Message Queue 就是 RabbitMQ

主要的腳色有:

  • Producer - 負責丟訊息到 Queue 的。
  • Consumer - 負責消化來自 Queue 的訊息。
  • Queue - 負責存放所需的資料,一樣有著 First-In-First-Out 的特性。
  • Exchange - 在 Poducer 與 Queue 中間的一個元件,如果有 Exchage 的時候 Poducer 不再是直接把 Message 丟給 Queue,而是把 Message 丟給 Exchange 後,由他來決定要丟給誰,主要有四種方式
    – Direct:直接丟給指定的 Queue。
    – Topic:可以透過類似於正則表達式來設定 Binding 的規則,丟給符合的 Queue。
    – Headers:透過傳送資料的 Header 來指定要丟給哪個 Queue。
    – Fanout:一次丟給全部的 Queue。

常見的模式有:

Simple Mode

最簡單的模式,Poducer、Message Broker、Consumer 都只有一個。

Work queues

Woker 模式下,可以有多個 Consumer 來幫忙消化訊息。
(還記得 Hangfire 的 Worker 嗎 ,就是差不多的東西)

Publish/Subscribe

在訂閱模式下,Exchange 是透過 Fanout 的方式,確保所有訂閱的 Queue 都能接收到訊息。

Routing

在路由的模式下,Exchange 會透過 direct 的方式,直接將 Message 丟給指定的 Queue。

Topics

在此模式下 Exchange 就是透過 Topic 的方式,將 Message 丟給符合的 Queue。

RPC

若 Client 需要收到回傳訊息的話就可以透過 RPC 的模式來進行。

後記

我們今天介紹了系統整合傳遞訊息的方式,也因此帶到了 Message Queue,介紹了 RabbitMQ 常見的幾種傳遞訊息方式,下一篇我們就會進行實際的練習。

參考連結