【轉】消息隊列原理

来源:http://www.cnblogs.com/zdd-java/archive/2017/11/19/7862766.html
-Advertisement-
Play Games

發佈-訂閱消息模式 一、訂閱雜誌 我們很多人都訂過雜誌,其過程很簡單。只要告訴郵局我們所要訂的雜誌名、投遞的地址,付了錢就OK。出版社定期會將出版的雜誌交給郵局,郵局會根據訂閱的列表,將雜誌送達消費者手中。這樣我們就可以看到每一期精彩的雜誌了。 發佈-訂閱消息模式 一、訂閱雜誌 我們很多人都訂過雜誌 ...


發佈-訂閱消息模式

一、訂閱雜誌

我們很多人都訂過雜誌,其過程很簡單。只要告訴郵局我們所要訂的雜誌名、投遞的地址,付了錢就OK。出版社定期會將出版的雜誌交給郵局,郵局會根據訂閱的列表,將雜誌送達消費者手中。這樣我們就可以看到每一期精彩的雜誌了。

仔細思考一下訂雜誌的過程,我們會發現這樣幾個特點:1、消費者訂雜誌不需要直接找出版社;2、出版社只需要把雜誌交給郵局;3、郵局將雜誌送達消費者。郵局在整個過程中扮演了非常重要的中轉作用,在出版社和消費者相互不需要知道對方的情況下,郵局完成了雜誌的投遞。
二、發佈-訂閱消息模式

剛剛講了訂閱雜誌,下麵我們會講傳統調用模式演化到發佈-訂閱消息模式。
有些網站在註冊用戶成功後發一封激活郵件,用戶收到郵件後點擊激活鏈接後才能使用該網站。一般的做法是在註冊用戶業務邏輯中調用發送郵件的邏輯。這 樣用戶業務就依賴於郵件業務。如果以後改為簡訊激活,註冊用戶業務邏輯就必須修改為調用發送簡訊的邏輯。如果要註冊後給用戶加點積分,再加一段邏輯。經過 多次修改,我們發現很簡單的註冊用戶業務已經越來越複雜,越來越難以維護。相信很多開發者都會有類似痛苦的經歷。

即使用戶業務實現中對其他業務是介面依賴,也避免不了業務變化帶來的依賴影響。怎麼辦?解耦!將註冊用戶業務邏輯中註冊成功後的處理剝離出來。
再回頭看看"訂閱雜誌",如果沒有郵局,出版社就必須自己將雜誌送達所有消費者。這種情形就和現在的註冊用戶業務一樣。我們發現問題了,在用戶業務和其他業務之間缺少了郵局所扮角色。
我們把郵局抽象成一個管理消息的地方,叫"消息管理器"。註冊用戶成功後發送一個消息給消息管理器,由消息管理器轉發該消息給需要處理的業務。現在,用戶業務只依賴於消息管理器了,它再也不會為了註冊用戶成功後的其他處理而煩惱。

註冊用戶的改造就是借鑒了"訂閱雜誌"這樣原始的模式。我們再進一步抽象,用戶業務就是消息的"生產者",它將消息發佈到消息管理器。郵件業務就是 消息的"消費者",它將收到的消息進行處理。郵局可以訂閱很多種雜誌,雜誌都是通過某種編號來區分;消息管理器也可以管理多種消息,每種消息都會有一個 "主題"來區分,消費者都是通過主題來訂閱的。

發佈-訂閱消息模式已經呈現在我們面前,利用它可以產生更靈活、更鬆散耦合的系統。

 

 

MQ相關概念

1.消息(Message)

消息是MQ中最小的概念,本質上就是一段數據,它能被一個或者多個應用程式所理解,是應用程式之間傳遞的信息載體。

2.隊列(Queue)

2.1本地隊列

本地隊列按照功能可劃分為初始化隊列,傳輸隊列,目標隊列和死信隊列。

初始化隊列用作消息觸發功能。

傳輸隊列只是暫存待傳的消息,條件許可的情況下,通過管道將消息傳送到其他的隊列管理器。

目標隊列是消息的目的地,可以長期存放消息。

如果消息不能送達目標隊列,也不能再路由出去,則被自動放入死信隊列保存。

2.2別名隊列&遠程隊列

只是一個隊列定義,用來指定遠端隊列管理器的隊列。使用了遠程隊列,程式就不需要知道目標隊列的位置。

2.3模型隊列

模型隊列定義了一套本地隊列的屬性結合,一旦打開模型隊列,隊列管理器會按照這些屬性動態地創建出一個本地隊列。

3.隊列管理器(Queue Manager)

隊列管理器是一個負責嚮應用程式提供消息服務的機構,如果把隊列管理器比作資料庫,那麼隊列就是其中一張表。

4.通道(Channel)

通道是兩個管理器之間的一種單向點對點的的通信連接,如果需要雙向交流,可以建立一對通道。

5.監聽器(listner)

MQ產品的特性

 

可靠性傳輸

這個特點可以說是消息中間件的立足之本,對於應用來說,只要成功把數據提交給消息中間件,那麼關於數據可靠傳輸的問題就由消息中間件來負責。

不重覆傳輸

不重覆傳播也就是斷點續傳的功能,特別適合網路不穩定的環境,節約網路資源。

非同步性傳輸

非同步性傳輸是指,接受信息雙方不必同時線上,具有離線能力和安全性。

消息驅動

接到消息後主動通知消息接收方。

支持事務

應用程式可以把一些數據更新組合成一個工作單元,這些更新通常是邏輯相關的,為了保障數據完整性,所有的更新必須同時成功或者同時失敗)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發過程中,我們經常需要列印一些變數的值,便於調試。這個時候就會發現如果在dict list這些容器中,如果包含中文字元,不管是str類型,還是unicode類型,都列印不出來。如下: >>> print {'name': '張三'}{'name': '\xd5\xc5\xc8\xfd'}>>> ...
  • 選擇列 根據列名來選擇某列的數據 輸出結果: 也可以用點符號來進行: 上面的功能跟data["A"]一樣。 選擇某幾行數據 輸出為: 也可以根據索引號範圍來選擇某幾行的數據。 比如,如下的例子中我們就選擇出2017 01 10到2017 01 12的數據: 輸出為: 使用loc進行選擇 使用loc選 ...
  • 感冒咳嗽停更了幾天,今天恢復更新了。 先來看下instanceof與向下轉型的概念: 1.instanceof instanceof是一個二元操作符,用法是:boolean result = a instanceof ClassA,即判斷對象a是否是類ClassA的實例,如果是的話,則返回true, ...
  • 遠端創建倉庫 登陸鏡像倉庫 使用 登陸遠端倉庫 生成需要發佈 修改鏡像名發佈 使用 通過容器生成鏡像 使用 通過已有容器生成鏡像 推送到遠端伺服器 使用 推送遠端伺服器 遠端查看 ...
  • 環境安裝 Go 語言支持以下系統: Linux FreeBSD Mac OS X(也稱為 Darwin) Window Linux FreeBSD Mac OS X(也稱為 Darwin) Window 安裝包下載地址為:https://golang.org/dl/。 Windows下直接下載對應的 ...
  • 使用靜態方法實現類的多態 類的封裝--升級版 繼承升級版 ...
  • 註:本文為mysql基礎知識的總結,基礎點很多若是有些不足夠,還請自行搜索。後續增加 一、mysql簡介 資料庫簡介 資料庫是電腦應用系統中的一種專門管理數據資源的系統 資料庫是一組經過電腦處理後的數據,存儲在多個文件中,而管理資料庫軟體被稱為資料庫管理系統 DBMS 而MYSQL ORACLE ...
  • [TOC] PS: 本地預覽目錄OK,但是博客園貌似不支持,那就只能這樣了。 前言(可以不看) 最開始只是想寫一篇博文,準備使用markdown,感覺很流行(github、簡書……很多都支持),而且渲染出來很好看,一直很想學,沒有合適的機會,結果拖到了現在。比起什麼python、C之類的編程語言,m ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...