消息隊列-Message Queue

消息隊列-Message Queue

目前隨著互聯網的普及以及上網用戶的增多,擁有一套 安全穩定低耦合高性能內部通信工具尤為重要。

什么是消息隊列?

消息隊列(英語:Message queue)是一種進程間通信或同一進程的不同線程間的通信方式,軟件的貯列用來處理一系列的輸入,通常是來自用戶。消息隊列提供了異步的通信協議,每一個貯列中的紀錄包含詳細說明的數據,包含發生的時間,輸入設備的種類,以及特定的輸入參數,也就是說:消息的發送者和接收者不需要同時與消息隊列互交。消息會保存在隊列中,直到接收者取回它。 ——維基百

消息隊列 是指利用 高效可靠 的 消息傳遞機制 進行與平臺無關的 數據交流,并基于 數據通信 來進行分布式系統的集成。 ——互聯網

這些解釋都太深奧,我們通過圖片來了解一下。

  • Producer:消息生產者,負責產生和發送消息到 Broker;
  • Broker:消息處理中心。負責消息存儲、確認、重試等,一般其中會包含多個 queue;
  • Consumer:消息消費者,負責從 Broker 中獲取消息,并進行相應處理;

可能這個模型還是過于專業,那我們再看一個通俗一點的:

此時有一封信件,加入到隊列中,然后接收者從隊列中拿出自己的信件,這個隊列就好比 郵箱

消息隊列 一般作為 應用程序中的中間件。通過提供 消息傳遞消息排隊 模型,它可以在 分布式環境 下提供 應用解耦彈性伸縮冗余存儲流量削峰異步通信數據同步 等等功能,其作為 分布式系統架構 中的一個重要組件,有著舉足輕重的地位。

消息隊列的特點

異步性

消息發送者 可以發送一個消息而無須等待響應。消息發送者 將消息發送到一條 虛擬的通道(主題 或 隊列) 上,消息接收者訂閱 或是 監聽 該通道。一條信息可能最終轉發給 一個或多個 消息接收者,這些接收者都無需對 消息發送者 做出 同步回應。整個過程都是 異步的

解耦合

主要體現在如下兩點:

  • 發送者和接受者不必了解對方、只需要 確認消息
  • 發送者和接受者 不必同時在線

比如在線交易系統為了保證數據的 最終一致,在 支付系統 處理完成后會把 支付結果 放到 消息中間件 里,通知 訂單系統 修改 訂單支付狀態。兩個系統是通過消息中間件解耦的。

分布式

通過對 消費者 的橫向擴展,降低了消息隊列 阻塞 的風險,以及單個消費者產生單點故障的可能性(當然消息隊列本身也可以做成分布式集群)。

可靠性

消息隊列 一般會把接收到的消息存儲到 本地硬盤 上(當消息被處理完之后,存儲信息根據不同的消息隊列實現,有可能將其刪除),這樣即使 應用掛掉 或者 消息隊列 本身掛掉,消息也能夠 重新加載

消息隊列的傳輸模式

首先看一個經典的 消息隊列的傳遞服務模型

MOM: Message Oriented Middleware 消息的中間件

消息隊列目前有兩大分類: 點對點(P2P)

點對點模型 用于 消息生產者消息消費者 之間 點到點 的通信。消息生產者將消息發送到由某個名字標識的特定消費者。這個名字實際上對于消費服務中的一個 隊列Queue),在消息傳遞給消費者之前它被 存儲 在這個隊列中。隊列消息 可以放在 內存 中也可以 持久化,以保證在消息服務出現故障時仍然能夠傳遞消息。

一句話總結:消息生產者生產消息發送到queue中,然后消息消費者從queue中取出并且消費消息,消息被消費以后,queue中不再有存儲,所以消息消費者不可能消費到已經被消費的消息。Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。
**

發布/訂閱模型(Pub/Sub)

發布者/訂閱者 模型支持向一個特定的 消息主題 生產消息。0多個訂閱者 可能對接收來自 特定消息主題 的消息感興趣。

在這種模型下,發布者和訂閱者彼此不知道對方,就好比是匿名公告板。這種模式被概況為:多個消費者可以獲得消息,在 發布者訂閱者 之間存在 時間依賴性。發布者需要建立一個 訂閱(subscription),以便能夠消費者訂閱。訂閱者 必須保持 持續的活動狀態接收消息

在這種情況下,在訂閱者 未連接時,發布的消息將在訂閱者 重新連接重新發布,如下圖所示:

特性:

  • 每個消息可以有多個訂閱者;
  • 客戶端只有訂閱后才能接收到消息;
  • 持久訂閱和非持久訂閱。
  • 發布者和訂閱者有時間依賴:接受者和發布者只有建立訂閱關系才能收到消息;
  • 持久訂閱:訂閱關系建立后,消息就不會消失,不管訂閱者是否都在線;
  • 非持久訂閱:訂閱者為了接受消息,必須一直在線。 當只有一個訂閱者時約等于點對點模式

消息隊列應用場景

當你需要使用 消息隊列 時,首先需要考慮它的必要性。可以使用消息隊列的場景有很多,最常用的幾種,是做 應用程序松耦合、異步處理模式、發布與訂閱、最終一致性、錯峰流控 和 日志緩沖 等。

異步處理

非核心 流程 異步化,減少系統 響應時間,提高 吞吐量。例如:短信通知、終端狀態推送、App 推送、用戶注冊 等。

應用案例

系統解耦

  • 系統之間不是 強耦合的,消息接受者 可以隨意增加,而不需要修改 消息發送者的代碼。消息發送者 的成功不依賴 消息接受者。
  • 不強依賴 于非本系統的核心流程,對于 非核心流程,可以放到消息隊列中讓 消息消費者 去按需消費,而 不影響核心主流程

廣播

生產者/消費者 模式,只需要關心消息是否 送達隊列,至于誰希望訂閱和需要消費,是 下游 的事情,無疑極大地減少了開發和聯調的工作量。

消息通訊

消息隊列一般都內置了 高效的通信機制,因此也可以用于單純的 消息通訊,比如實現 點對點消息隊列 或者 聊天室 等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Angular 第一章 開始

第一章 開始 用 JavaScript 開發應用程序是一個很大的挑戰。由于它的延展性和缺少類型檢查,在 JavaScript 中構建一個適當大小的應用程序是很困難的。除此之外,我們對所有類型的處理都使用JavaScript,例如用戶界面(UI),操作、客戶端-服務器交互和業務處理/驗證。因此,我們…

Typescript實現單例之父類調用子類

Typescript實現單例之父類調用子類 設計要求 在程序中,需要一個對象可以全局使用,并且只有一個實例Breakpoint 類是一個可以被繼承的類,然后子類必須實現 updateView函數updateView 這個函數可以被自動調用,當窗口發生變化的時候構思 UML 圖 Layout 是一個單例類,也就是全局只…

Angular性能優化之臟檢測

Angular性能優化之臟檢測 當我們在使用 Angular 框架搭建項目時,隨著組件越來越多,頁面也來越復雜,性能會越來越低,主要表現在 CPU 使用率 很高。所以我們要對項目做一定的優化。 Angular臟檢查(Change Detection)機制 Angular 的臟檢測主要是指 zone.js,這是一個開源的…

第一章、第一節 Angular基礎

第一章、第一節 Angular基礎 讓我們先來看看Angular是如何實現組件模式的。 組件模式 Angular 應用程序使用組件模式。你可能聽說過這個模式,它不僅用于軟件開發,還用于制造、建筑和其他領域。簡單地說,它涉及到將更小的、離散的構建塊組合…

Angular Chart.js第三方庫ng-chartjs基礎使用

Angular Chart.js第三方庫ng-chartjs基礎使用 項目github地址 這個項目支持基本的Chart.js圖表,并且支持內聯插件和全局插件的使用。 Demo地址 支持圖表類型 linebarradarpiepolarArea安裝 npm install ng-chartjs --save npm install chart.js --save導入 正常導入模塊i…

linux一鍵安裝node+npm

分享一個linux下一鍵安裝nodenpm腳本。 使用方式為: ./install-node.sh,然后輸入版本號,node.js版本查詢 切記不需要加 sudo 執行!!! 默認安裝10.15.0。 #! /bin/bash############################################################ # …

Angular Material 陰影使用

Angular Material 陰影使用 依托于 Angular Material 庫,可以直接使用通用的符合 Material Design 風格的陰影。 使用 使用方式有兩種: 外聯樣式設定,即在css或scss中設定通過class名稱設定,即 元素的class名稱方式一:外聯樣式使用 在scss或css文件中導入@import ~@ang…

typescript或javascript深拷貝Object json

typescript或javascript深拷貝Object json Object的json對象很多時候我們需要深拷貝,我寫了兩個工具函數,供大家參考。 deepCopyObject 深拷貝一個Object對象,返回深復制的對象。 /** * method 深復制一個json對象 * param source 需要深復制的對象 * return 返…

linux安裝zsh終端

linux安裝zsh終端 ZSH 已經被收錄到了 Ubuntu 18.04 LTS 的官方軟件包存儲庫中了 sudo apt install zshZSH Shell 安裝好之后,可以使用如下命令查看其版本: zsh --version取代bash,設為默認shell sudo usermod -s /bin/zsh username也可以…

HTML meta使用

HTML meta使用 meta標簽是什么? meta標簽是HTML語言head區的一個輔助性標簽。 meta標簽是干什么用的? meta標簽用來描述一個HTML網頁文檔的屬性,例如作者、日期和時間、網頁描述、關鍵詞、頁面刷新等。它提供的信息雖然用戶不可見&#x…

共享圖片方案

共享圖片方案 安裝chrome插件 極簡圖床安裝,鏈接地址 插件使用 使用阿里云 OSS 存儲圖片 阿里云 OSS 提供了安全、低成本、高可靠的云存儲服務,極簡圖床針對阿里云 OSS 做了整合,通過簡單的設置,即可方便地將圖片上傳到阿里…

javascript復制到黏貼板之完美兼容

javascript復制到黏貼板之完美兼容 很多時候我們需要給用戶方便,提供一鍵復制的功能,但是在實現的過程中遇到各式各樣的坑。 原生解決方案 document.execCommand()方法 MDN上的定義: which allows one to run commands to manipulate the contents of the edita…

制作windows啟動盤-大于4GB鏡像

制作windows啟動盤-大于4GB鏡像 制作一個 Windows 安裝 U 盤是很容易的,使用 UltraISO 這樣的刻錄工具量產一個 iso 鏡像文件到 U 盤即可。然而隨著 Windows 10 版本號的提升,鏡像變得越來越大,終于 FAT32 文件系統不再能夠容納得下安裝鏡像…

DIY 主機 所有AMD IntelCPU及主板

DIY 主機 所有AMD IntelCPU及主板 查看intel的cpu及amd的cpu或者對應的主板可以查看這個項目。diy-pc

PC介紹之電腦組成

電腦組成 CPU cpu就是中央處理器,英文為central processing unit。 CPU一般我們需要知道以下幾點即可: 主頻 CPU的主頻,即CPU內核工作的時鐘頻率(CPU Clock Speed),通常所說的某某CPU是多少兆赫的&#xff…

PC介紹之PCIE、總線、內存、電源

PC介紹之PCIE、總線、內存、電源 PCIE降速 PCI-E的總線性能 目前我們所使用的顯卡是x16 走 PCIE 3.0,有些顯卡雖然插在x16的插槽上,但是速度只有x8的速度,總的來說好的顯卡目前都是x16。 主板一般會提供一條x16,x8, x1三個插槽&#xff0c…

PC介紹之顯卡

PC介紹之顯卡 一、什么是顯卡? 顯示接口卡(Video card,Graphics card)、顯示器配置卡簡稱為顯卡,是個人電腦基本組成部分之一。 用途是將計算機系統所需要的顯示信息進行轉換驅動,并向顯示器提供信號&…

Sublime Text 3 無法輸入中文解決方案

Sublime Text 3 安裝及無法輸入中文解決方案 安裝sublime-text 3 如果是ubuntu系統終端輸入: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://download.…

Linux Server 安裝 raid 1

Linux Server 安裝 raid 1 兩組以上的N個磁盤相互作鏡像,在一些多線程操作系統中能有很好的讀取速度,理論上讀取速度等于硬盤數量的倍數,與RAID 0相同。另外寫入速度有微小的降低。只要一個磁盤正常即可維持運作,可靠性最高。其原…

0-安裝Vagrant和使用

0-安裝Vagrant和使用 Vagrant 是一款軟件,可以自動化虛擬機的安裝和配置流程。用來管理虛擬機,如 VirtualBox、VMware、AWS等,主要好處是可以提供一個可配置、可移植和復用的軟件環境,可以使用shell、chef、puppet等工具部署。所以…