Rabbit MQ學習之《基礎概念》

Message Queue

1 什么是MQ

MQ(message queue),本質是個隊列,FIFO 先入先出,只不過隊列中存放的內容是message而已,同時是一種跨進程的通信機制,用于上下游傳遞消息。
在互聯網架構中,MQ 是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務。使用了 MQ 之后,消息發送上游只需要依賴 MQ,不用依賴其他服務。

2 為什么要使用MQ

流量消峰

舉個例子,如果訂單系統最多能處理一萬次訂單,這個處理能力應付正常時段的下單時綽綽有余,正常時段我們下單一秒后就能返回結果。
但是在高峰期,如果有兩萬次下單操作系統是處理不了的,只能限制訂單超過一萬后不允許用戶下單。
使用消息隊列做緩沖,我們可以取消這個限制,把一秒內下的訂單分散成一段時間來處理,這時有些用戶可能在下單十幾秒后才能收到下單成功的操作,但是比不能下單的體驗要好。

應用解耦

以電商應用為例,應用中有訂單系統、庫存系統、物流系統、支付系統。用戶創建訂單后,如果耦合調用庫存系統、物流系統、支付系統,任何一個子系統出了故障,都會造成下單操作異常。
當轉變成基于消息隊列的方式后,系統間調用的問題會減少很多,比如物流系統因為發生故障,需要幾分鐘來修復。在這幾分鐘的時間里,物流系統要處理的內存被緩存在消息隊列中,用戶的下單操作可以正常完成。當物流系統恢復后,繼續處理訂單信息即可,中單用戶感受不到物流系統的故障,提升系統的可用性。
在這里插入圖片描述

異步處理

有些服務間調用是異步的,例如 A 調用 B,B 需要花費很長時間執行,但是 A 需要知道 B 什么時候可以執行完,以前一般有兩種方式,A 過一段時間去調用 B 的查詢 api 查詢。或者 A 提供一個 callback api,B 執行完之后調用 api 通知 A 服務。
這兩種方式都不是很優雅,使用消息總線,可以很方便解決這個問題,A 調用 B 服務后,只需要監聽 B 處理完成的消息,當 B 處理完成后,會發送一條消息給 MQ,MQ 會將此消息轉發給 A 服務。這樣 A 服務既不用循環調用 B 的查詢 api,也不用提供 callback api。
同樣 B 服務也不用做這些操作。A 服務還能及時的得到異步處理成功的消息。
在這里插入圖片描述

Rabbit MQ

Rabbit MQ是一個在 AMQP(高級消息隊列協議)基礎上完成的,可復用的企業消息系統,是當前最主流的消息中間件之一。功能比較完備,健壯、穩定、易用、跨平臺、支持多種語言
Rabbit MQ中有幾個比較核心的概念:

  • 生產:產生數據發送消息的程序是生產者
  • 交換機:一方面它接收來自生產者的消息,另一方面它將消息推送到隊列中。交換機類型將會決定交換機是將消息推送到特定隊列還是推送到多個隊列,亦或者是把消息丟棄。
  • 隊列:隊列是 RabbitMQ 內部使用的一種數據結構,本質上是一個大的消息緩沖區。隊列僅受主機的內存和磁盤限制的約束。許多生產者可以將消息發送到一個隊列,許多消費者可以嘗試從一個隊列接收數據。
  • 消費者:消費與接收具有相似的含義,大多時候是一個等待接收消息的程序。同一個應用程序中既可以有生產者也可以有消費者

Rabbit MQ中的工作原理

在這里插入圖片描述

Broker(交換機):接收和分發消息的應用,RabbitMQ Server就是 Message Broker
Virtual host:出于多租戶和安全因素設計,把AMQP的基本組件劃分到一個虛擬的分組中,類似于網絡中的namespace概念。當多個不同的用戶使用同一個RabbitMQ server提供的服務時,可以劃分出多個vhost,每個用戶在自己的vhost創建 exchange/queue
Connectionpublisher/consumerbroker之間的 TCP 連接
Channel:Channel 是在 connection 內部建立的邏輯連接,如果應用程序支持多線程,通常每個 thread 創建單獨的 channel 進行通訊,AMQP method 包含了 channel id 幫助客戶端和 message broker 識別 channel,所以 channel 之間是完全隔離的。Channel作為輕量級的Connection 極大減少了操作系統建立 TCP connection 的開銷
Exchangemessage到達broker的第一站。根據分發規則,匹配查詢表中的routing key,分發消息到queue中去。常用的類型有:direct (point-to-point), topic (publish-subscribe) and fanout(multicast)
Queue:消息最終被送到這里等待 consumer 取走
Binding:exchange 和 queue 之間的虛擬連接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查詢表中,用于 message 的分發依據

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

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

相關文章

深入解析力扣166題:分數到小數(模擬長除法與字符串操作詳解及模擬面試問答)

力扣166題:分數到小數 在本篇文章中,我們將詳細解讀力扣第166題“分數到小數”。通過學習本篇文章,讀者將掌握如何使用多種方法來解決這一問題,并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋和ASCII圖解&am…

鋇錸技術BL205模塊在智能制造產線的靈活配置與優化

鋇錸技術的OPC UA耦合器BL205模塊在智能制造產線中的靈活配置與優化是當今工業領域中的一個關鍵議題。隨著工業4.0和數字化轉型的不斷推進,生產線的靈活性和智能化程度成為了企業追求的目標。在這一背景下,BL205模塊以其分布式、可插拔、結構緊湊、可編程…

【Python快速上手(三十三)】- Python operator 模塊

目錄 Python快速上手(三十三)- Python operator 模塊Python operator 模塊詳解1. 模塊簡介2. 算術運算符函數3. 比較運算符函數4. 位運算符函數5. 序列操作函數6. 方法調用函數7. 操作函數對象8. 實際應用案例9. 小結 Python快速上手(三十三&…

Java基礎入門day57

day57 JSP、Servlet&#xff0c;Java bean和JDBC整合項目 index.jsp頁面 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <!DOCTYPE html> <html> <head><title>JSP - Hello World</title> …

CSS 媒體查詢 響應式開發

介紹 媒體查詢&#xff08;Media Queries&#xff09;是CSS3的技術&#xff0c;可以根據設備的特性&#xff08;如屏幕寬度、高度、方向等&#xff09;來應用不同的樣式規則。媒體查詢可以使網頁在不同設備上呈現不同的樣式&#xff0c;以實現響應式設計。 語法 media scree…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加載預訓練模型參數對不齊和收到意外參數報錯解決方案

使用mmdetection時遇到的問題比較多&#xff0c;首先要對自己要使用的預訓練模型有一定的了解&#xff0c;并且懂得使用各種分類模型時不同的模型不同任務執行階段需要參數上的對其。&#xff08;比如mask-rcnn和它的三個頭之間的參數&#xff09;。 首先&#xff0c;談談torc…

什么是聲明式事務管理?

聲明式事務管理是Spring提供的一種事務管理機制&#xff0c;它允許開發者通過聲明的方式&#xff0c;而不是通過編程的方式&#xff0c;來管理事務的邊界和行為。在聲明式事務管理中&#xff0c;你可以通過注解或XML配置來指定方法或類上的事務屬性和行為。 在Spring中&#x…

Spring Boot集成六大常用中間件,附集成源碼,親測有效

目錄 萬字論文&#xff0c;從0到1&#xff0c;只需1小時獲取途徑1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

JavaEE(入門)

JavaEE &#xff08;詳細注釋版&#xff09; 1. 入門基礎 1.1 JavaEE簡介 JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;是由Sun Microsystems推出的一套標準&#xff0c;現由Oracle維護。JavaEE平臺主要用于開發和運行企業級應用程序&#xff0c;具有高…

11 Goroutine-并發與并行、阻塞與非阻塞

并發 順序執行&#xff1a;按照事先計劃好的順序&#xff0c;執行完一個操作后&#xff0c;再執行下一個操作。 順序執行效率不高的原因&#xff1a; 每個操作由多個步驟組成&#xff0c;每個步驟所需要的時間長短不一&#xff0c;有些步驟可能相當耗時。顧客點菜需要時間&a…

VectorDBBench在windows的調試

VectorDBBench在windows的調試 VectorDBBench是一款向量數據庫基準測試工具&#xff0c;支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等&#xff0c;可以測試其QPS、時延、recall。 VectorDBBench是一款使用python編寫的…

輕松學EntityFramework Core--Entity Framework Core 簡介

一、什么是Entity Framework Core Entity Framework Core&#xff08;簡稱EF Core&#xff09;是一個現代的、跨平臺的、開源的ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;由微軟開發。它允許.NET開發者通過.NET對象與關系型數據庫進行交互&#xff0c;而無需編…

putty中的plink.exe功能和用法

plink對于自動化的執行命令和工作非常有好處。plink可以讓我們直接在命令行制定好命令&#xff0c;然后執行&#xff0c;完成后自動關閉session。 Plink: command-line connection utility Release 0.81 Usage: plink [options] [user]host [command]("host" can al…

2024年150道高頻Java面試題(七十四)

147. 如何在 MyBatis 中實現一對多和多對一的關系映射&#xff1f; 在 MyBatis 中實現一對多&#xff08;One-to-Many&#xff09;和多對一&#xff08;Many-to-One&#xff09;的關系映射&#xff0c;主要是通過 <resultMap> 元素中的 <collection> 和 <assoc…

深度學習模型在OCR中的可解釋性問題與提升探討

摘要&#xff1a; 隨著深度學習技術在光學字符識別&#xff08;OCR&#xff09;領域的廣泛應用&#xff0c;人們對深度學習模型的可解釋性問題日益關注。本文將探討OCR中深度學習模型的可解釋性概念及其作用&#xff0c;以及如何提高可解釋性&#xff0c;使其在實際應用中更可…

在Linux系統上使用Nginx的詳解指南

目錄 簡介 準備工作 安裝Nginx 通過包管理器安裝 源碼編譯安裝 Nginx基礎配置 主配置文件nginx.conf詳解 基本服務器塊配置 SSL/TLS配置 動靜分離 反向代理配置 負載均衡配置 常見問題及解決方法 結論 1. 簡介 Nginx是一款高性能HTTP和反向代理服務器&#xff…

上位機圖像處理和嵌入式模塊部署(f103 mcu唯一的id)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 對于stm32f103系列mcu來說,一般每一顆原廠的mcu,都會對應一個唯一的id。那這個id可以用來做什么用呢?個人認為,可以用來做激活使用。舉個例子,第一次mcu模塊使用的時候,一般可…

Java 零基礎入門學習(小白也能看懂!)

&#x1f4da;博客主頁&#xff1a;愛敲代碼的小楊. ?專欄&#xff1a;《Java SE語法》 | 《數據結構與算法》 | 《C生萬物》 |《MySQL探索之旅》 |《Web世界探險家》 ??感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;&#xff0c;您的三連就是我持續更…

第16篇:JTAG UART IP應用<三>

Q&#xff1a;如何通過HAL API函數庫訪問JTAG UART&#xff1f; A&#xff1a;Quartus硬件工程以及Platform Designer系統也和第一個Nios II工程--Hello_World的Quartus硬件工程一樣。 Nios II軟件工程對應的C程序調用HAL API函數&#xff0c;如open用于打開和創建文件&#…

前端最新面試題(ES6模塊篇)

目錄 1 ES5、ES6和ES2015有什么區別? 2 babel是什么,有什么作用? 3 let有什么用,有了var為什么還要用let? 4 舉一些ES6對String字符串類型做的常用升級優化? 5 舉一些ES6對Array數組類型做的常用升級優化 6 舉一些ES6對Number數字類型做的常用升級優化 7 舉一些ES…