【轉】消息隊列原理

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...