1. 程式人生 > >高效能網站實用技巧之訊息佇列

高效能網站實用技巧之訊息佇列

什麼是訊息佇列?

訊息佇列( Message Queue )是一種程序間通訊或同一程序的不同執行緒間的通訊方式。程序或者執行緒之間通過 訊息 進行通訊,訊息傳送後可以立即返回,由訊息系統來確保資訊的可靠傳遞,訊息釋出者(生產者)只管把訊息釋出到訊息隊裡中而不用管誰來消費,訊息使用者(消費者)只管從訊息佇列中獲取訊息以進一步處理而不用管理誰釋出的訊息,這樣釋出者和使用者都不用知道對方的存在。

訊息( Message )是指在應用之間傳送的資料。訊息可以非常簡單,比如只包含文字字串,也可以很複雜,如嵌入物件。

訊息佇列的特點

通過提供 訊息傳遞 和 訊息排隊 模型,它可以在 分散式環境 下提供 應用解耦 、 彈性伸縮 、 冗餘儲存 、 流量削峰 、 非同步通訊 、 資料同步 等等功能,其作為 分散式系統架構 中的一個重要元件,有著舉足輕重的地位。訊息佇列主要特點有:

  • 非同步性:將耗時的同步操作,通過以傳送訊息的方式,進行了非同步化處理。減少了同步等待的時間。

  • 鬆耦合:訊息佇列減少了服務之間的耦合性,不同的服務可以通過訊息佇列進行通訊,而不用關心彼此的實現細節,只要定義好訊息的格式就行

  • 分散式:通過對消費者的橫向擴充套件,降低了訊息佇列阻塞的風險,以及單個消費者產生單點故障的可能性。

  • 可靠性:訊息佇列一般會把接收的訊息儲存到本地硬碟上(當訊息被處理完之後,儲存資訊根據不同的訊息佇列實現,有可能將其刪除),這樣即使應用掛掉或者訊息佇列本身掛掉,訊息也能夠重新載入。

訊息佇列應用場景

非同步處理

同步處理是指從請求的發起一直到最終的處理完成期間,請求的呼叫方一直在同步阻塞等待呼叫的處理完成。

非同步處理處理是指在請求發起的處理過程中,客戶端的程式碼已經返回了,它可以繼續進行自己的後續操作,而不需要等待呼叫處理完成。

對一些比較耗時且不需要即時(同步)返回操作結果的操作,可以把處理過程通過訊息佇列進行非同步處理。這樣做可以推遲耗時操作的處理,使耗時操作非同步化,而不必阻塞客戶端程式,客戶端的程式在得到處理結果之前可以繼續執行,從而提高客戶端程式的處理效能。

非同步處理的主要目的是 減少請求響應時間 ,實現非核心流程非同步化,提高系統響應效能。

應用解耦

使用訊息佇列,可以有多個生產者釋出訊息,多個消費者消費訊息,共同完成整個的業務處理邏輯,生產者只關心是否正確將訊息寫入訊息佇列,消費者只關心從訊息佇列中獲取訊息,然後進行處理邏輯,生產者和消費者之間不需要直接的互動呼叫,沒有程式碼的依賴耦合。

耦合度越低程式程式碼越容易維護,也容易進行擴充套件。

流量削峰

一般在秒殺活動中廣泛使用。

在秒殺活動中,一般由於瞬時訪問量過大,伺服器瞬間接收了大量的請求,流量暴增,這種情況下很有可能導致相關係統無法處理請求甚至崩潰。為了解決這個問題,一般會在應用的前端加入訊息佇列。

  • 請求先寫入訊息佇列,而不是由業務系統直接處理,做了一次緩衝,極大的減少了業務處理系統的壓力。

  • 佇列的長度可以做限制,一般秒殺活動都是有數量限制的,後寫入佇列的使用者無法秒殺到商品,這樣的請求可以直接被拋棄,可以直接返回活動已結束或商品已售完。

使用訊息佇列,即便是訪問流量持續的增長,系統依然可以持續的接收請求。雖然生產者生成的訊息比消費者消費的速度快,但是通過訊息佇列進行了緩衝,在短時間內,生產者和消費者之間處理能力不會互相影響,同樣也可以保證系統的穩定性。

訊息通訊

訊息佇列一般都內建了高效的通訊機制,因此可以用於單純的訊息通訊,比如實現點對點訊息佇列或者聊天室。

廣播

如果沒有訊息佇列,每當一個新的業務方介入,那都需要聯調一次介面。有了訊息佇列,只需要關係訊息是否送達了佇列,至於誰希望訂閱,是下游的事情,無疑極大地減少了開發和聯調的工作量。

日誌處理

將訊息佇列用在日誌處理中,解決了大量日誌傳輸的問題(如Kafka)。

訊息佇列的傳輸模式

點對點模式(Point to Point)

點對點模式用於 訊息生產者 和 訊息消費者 之間 點到點 的通訊。訊息生產者將訊息傳送到由某個名字標識的特定佇列( Queue )。在訊息傳遞給消費者之前它被 儲存 在這個佇列中。 佇列訊息 可以放在 記憶體 中也可以 持久化 ,以保證在訊息服務出現故障時仍然能夠傳遞訊息。

點對點模式特點:

  • 每個訊息只有一個消費者(Consumer),即一旦訊息被消費,訊息就不再在訊息佇列中。

  • 生產者和消費者之間沒有依賴性,生產者傳送訊息之後,不管有沒有消費者在執行,都不會影響到生產者下次傳送訊息。

  • 消費者在成功接收訊息之後需向佇列應答成功,以便訊息佇列刪除當前接收的訊息。

釋出/訂閱模式(Publish/Subscribe)

釋出者/訂閱者模型支援向一個特定的 訊息主題 生產訊息。 0 或多個 訂閱者 可能對接收來自 特定訊息主題 的訊息感興趣。

在這種模型下,釋出者和訂閱者彼此不知道對方。多個消費者可以獲得訊息,在 釋出者 和 訂閱者 之間存在 時間依賴性 。釋出者需要建立一個 訂閱 ( subscription ),以便能夠消費者訂閱。 訂閱者 必須保持 持續的活動狀態 並 接收訊息 。

釋出/點閱模式特點:

  • 每個訊息可以有多個訂閱者。

  • 釋出者和訂閱者之間有時間上的依賴性,針對某個主題(Topic)的訂閱者,它必須建立一個訂閱之後,才能消費釋出者的訊息。

  • 為了消費訊息,訂閱者需要提前訂閱該角色主題,並保持線上執行。

集中訊息中介軟體對比

目前在生產環境,使用較多的訊息佇列有 ActiveMQ 、 RabbitMQ 、 ZeroMQ 、 Kafka 、 MetaMQ 、 RocketMQ 等。

相關推薦

高效能網站實用技巧訊息佇列

什麼是訊息佇列? 訊息佇列( Message Queue )是一種程序間通訊或同一程序的不同執行緒間的

Allegro實用技巧模塊復用(轉)

塊選擇 提示 好的 create mod 文件 實用技巧 lin app 需求分析:使用Allegro軟件進行PCB Layout設計時,當電路圖中有很多路相同的模塊,使用模塊復用的的操作方法,可以顯著提高工作效率,同時也可以使PCB布局在整體上顯得美觀。下面來講述這個方法

jquery實用技巧輸入框提示語句

ces 輸入數據 獲取 help lpad keyword 標簽 就是 tab 我們在編寫網頁的時候不可避免的會遇到輸入框,那麽怎麽設計輸入框才能更加優雅呢?不同的人會有不同的答案,下面分享一個比較不錯的設計。 效果圖 細節 這個效果主要是通過JQuery來實現,我的思

Docker實用技巧更改軟件包源提升構建速度

bing aspnet clean int dock tro 雲平臺 定義 找到 一.開篇 地球,中國,成都市,某小區的陽臺上,一青年負手而立,閉目沈思,陣陣的涼風吹得他衣衫呼呼的飄。忽然,他擡起頭,剎那間,睜開了雙眼,好似一到精光射向星空,只見這夜空......一顆星星都

大型網站架構系列:訊息佇列(二)(轉)

本文是大型網站架構系列:訊息佇列(二),主要分享JMS訊息服務,常用訊息中介軟體(Active MQ,Rabbit MQ,Zero MQ,Kafka)。【第二篇的內容大部分為網路資源的整理和彙總,供大家學習總結使用,最後有文章來源】 本次分享大綱 訊息佇列概述(見第一篇:大型網站架構系列:分散式訊息

Redis訊息佇列

SpringBoot 結合redis實現訊息佇列功能 釋出者: 配置連線工廠 @Bean public StringRedisTemplate template(RedisConnectionFactory connectionFactory){ retu

日誌系統訊息佇列的應用

kafka的概述 Kakfa是由LinkedIn公司開發的一個分散式的訊息系統,後成為Apache頂級開源專案,它使用Scala編寫,以可水平擴充套件和高吞吐率的特性而被廣泛使用。 ps: 通過上述百度百科的概述,只知其然而不知其所以然。 kafka 大家都知道是訊息佇列,那麼籠統的說訊息佇列是

Cris 玩轉大資料系列訊息佇列神器 Kafka

Cris 玩轉大資料系列之訊息佇列神器 Kafka Author:Cris 文章目錄 Cris 玩轉大資料系列之訊息佇列神器 Kafka Author:Cris 1. Kafka 概述

Java架構訊息佇列 (一):訊息佇列的概述

訊息佇列系列分享大綱:  一、訊息佇列的概述 二、訊息佇列之RabbitMQ的使用 三、訊息佇列之Kafka的使用 四、訊息佇列之RabbitMQ的原理詳解 五、訊息佇列之Kafka的原理詳解 六、訊息佇列之面試集錦 1.訊息佇列的概述 訊息佇列(Me

Java程式設計師從笨鳥到菜鳥(五十四) 分散式訊息佇列

##目錄 該文只是一個複習思路,不瞭解訊息佇列的人建議先看《訊息佇列從入門到精通》 ##一、為什麼使用訊息佇列 三個最主要的應用場景:解耦、非同步、削峰 1、解耦 傳統模式: 缺點:系統間的耦合性太強,如上圖示,系統 A 在程式碼中直接呼叫系統 B 和

分散式訊息佇列複習精講

文章轉自www.cnblogs.com/rjzheng/p/8994962.html 引言 為什麼寫這篇文章? 博主有兩位朋友分別是小A和小B: 小A,工作於傳統軟體行業(某社保局的軟體外包公司),每天工作內容就是和產品聊聊需求,改改業務邏輯。再不然就是和運營

視訊第13章(高併發訊息佇列思路)

1、訊息佇列 訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步RPC的主要手段之一。 訊息被處理的過程相當於流程A被處理。我們這裡以一個實際的模型來討論下,比如使用者下單成功時給使

【Linux】Linux程序間通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

Linux 學習筆記—程序通訊 訊息佇列、訊號量、共享記憶體的概念區別聯絡

2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過

PHP高階程式設計訊息佇列

轉載:https://blog.csdn.net/luyaran/article/details/53034382 1. 什麼是訊息佇列 訊息佇列(英語:Message queue)是一種程序

mysql訊息佇列

訊息佇列:在訊息的傳輸過程中儲存訊息的容器。 訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。 如圖所示: 在不使用訊息佇列的情況下,使用者的請求資料直接寫入資

C#基礎 --- 訊息佇列例子

本機上建立一個訊息佇列: namespace XXX.XXX.MSMQBuilder { class Program { static void Main(strin

高效能網站架構設計快取篇(6)- Redis 叢集命令

叢集cluster info :列印叢集的資訊cluster nodes :列出叢集當前已知的所有節點( node),以及這些節點的相關資訊。節點cluster meet <ip> <port> :將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。cluster

C++實用技巧配置Visual C++的偵錯程式顯示資料結構的格式(附Vczh Library++配置檔案)

今天我寫了一個給Visual C++用的配置,用來讓VC++在顯示自己寫的字串和容器等設施變得跟顯示STL一樣漂亮。VC++的可配置型還是很高的,我們只要寫一個xml,就可以改變偵錯程式對自己的資料結構的顯示了. 在這裡我簡單地介紹一下用法。假設大家覺得vlpp(Vczh Library++,也

高效能網站架構設計快取篇(3)- Redis 的配置

我們說Redis是一個強大的Key-Value儲存系統,在前面我們已遇到了兩個問題: 1、redis server 啟動後,獨佔程序,能不能修改為後臺服務呢? 2、redis server 服務是單執行緒的,而我的機器是多核的,能不能在同一臺機器上開啟多個例項更充分的利用 cpu 資源呢?但6379埠已經