學成線上專案總結 - Day5 RabbitMQ訊息佇列

Borris發表於2020-08-13

CMS頁面釋出過程中,將靜態頁面儲存到GridFS後,還需要通知伺服器獲取介面。
由於伺服器不止一個,如果在頁面釋出時同步進行訊息傳送,直接與伺服器互動,通知獲取頁面,會增加程式間的耦合性。
通過一個訊息佇列,將釋出資訊傳遞給訊息佇列,再由訊息佇列把無需同步處理且耗時長的操作非同步通知各伺服器進行處理,將提高應用程式響應時間,降低程式耦合性

本專案使用RabbitMQ進行開發。

學成線上專案總結 - Day5 RabbitMQ訊息佇列

具體到本專案的頁面釋出方案,如下圖:

學成線上專案總結 - Day5 RabbitMQ訊息佇列

  • 站點服務部署 CMS Client 和交換機繫結,指定站點id為routingKey。
  • 我們需要指定routingKey給將釋出的頁面,如果該routingKey和某個門戶站點id相同,那麼訊息佇列將把釋出訊息傳遞到該站點的 CMS Client 上。

整個頁面釋出的流程如下:

學成線上專案總結 - Day5 RabbitMQ訊息佇列

我們將根據這個流程實現頁面釋出功能。
之前建立的CMS-Manage工程本身就是生產方,而我們需要新建一個頁面釋出的消費方,從訊息佇列中接收頁面釋出的訊息。

頁面釋出消費方

我們需要建立一個 CMS-Client 工程。
這個工程是作為頁面釋出的消費方。
回顧一下消費方建立的流程:

  • 配置檔案中除了配置mongodb資料庫,還要配置rabbitmq連線和mq名稱及routingKey
    • 正如上面內容說到的,不同的routingKey就是不同的站點id,對應不同的訊息接收方。
  • 新建Rabbitmq配置類,作為消費方,要建立佇列和交換機,並將兩者繫結。
  • 將靜態頁面儲存到頁面儲存路徑
    • 我們需要通過頁面資訊,及站點資訊的查詢,拼接成一個頁面路徑
    • 頁面儲存路徑 = 站點物理路徑 + 頁面物理路徑 + 頁面名稱
  • 建立釋出頁面的消費客戶端,監聽釋出佇列的訊息
    • 收到訊息後,從MongoDB下載檔案,儲存至本地

消費方程式碼

頁面釋出生產方

我們在前一天已經完成了靜態頁面的建立,所以現在需要做的就是建立一個Rabbitmq的頁面生產方,負責將頁面釋出的訊息訊息佇列。

  • 配置檔案中配置Rabbitmq連線
  • 新建Rabbitmq配置類,建立交換機
  • 在api工程中定義頁面釋出介面
  • 在業務層定義靜態頁面釋出方法
    • 執行靜態化
    • 儲存靜態化檔案到GridFS
    • 傳送頁面釋出訊息
  • 在Controller中執行業務層方法

前端實現

  • 在 cms.js 中定義介面,和後端建立連線
  • 在page_list中新增釋出按鈕,並將頁面id傳遞進“釋出”中

生產方及前端實現

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章