一、系統中為什麼需要用到訊息佇列,使用訊息佇列有什麼優點?
使用訊息佇列的優點很多,這裡就說比較重要的三個優點:解耦、非同步、削峰填谷。
①、解耦:
首先引入乙個場景:系統a作位乙個介面請求方,現在需要向b、c、d三個系統傳送請求,這個時候呢a系統不需要傳送請求給d系統了,而需要傳送請求給e系統,那麼在a系統裡面就需要修改**,每一次傳送的請求方改變的話,都需要改**,具有一定的耦合性。如下圖:
那麼我們引入訊息佇列之後呢,a系統把需要傳送的請求資料放到佇列裡即可,不需要關心哪個系統需要a系統的請求資料,如下圖所示:
②、非同步:
在引入乙個場景:使用者請求a系統,然後a系統還需同步呼叫b、c、d系統的介面,我們假設一下再a系統處理自身業務邏輯請求了乙個sql的時間是200ms,然後呼叫b系統等待b系統處理幾個sql的時間是300ms,在呼叫c系統處理業務邏輯200ms,在呼叫d系統處理業務邏輯200ms,那麼一次請求至少等待1秒才會響應。比較耗時,如下圖所示:
那麼我們再引入訊息佇列之後,使用者呼叫a系統花費了200ms,然後a系統傳送三條訊息到訊息佇列裡面去,總耗時是5ms左右,然後b、c、d系統去消費就行了,總共只花費200ms左右,如下圖所示:
③、削峰填谷
當大量的使用者(100萬)通過瀏覽器再中午高峰期,同時進行大量的操作,會給資料庫造成極大的壓力,可能導致mysql宕機,如圖所示:
但是中午高峰期過了的話,下午可能也就1萬左右的使用者在操作了,每秒50個請求左右,對系統沒有任何壓力,如果高峰期時將5000個請求寫到mq裡面的話,系統a最多每秒執行2000個請求,不要超過每秒做大請求數就行,經過了2個小時的中午高峰期,再慢慢消費佇列裡面的訊息,這個是可以接受的。如下圖所示:
二、使用訊息佇列有什麼缺點
上面說了引入訊息佇列的一些場景和優點,那麼使用訊息佇列有什麼缺點呢?
系統的可用性降低:比如第乙個例子,本來好好的呼叫三個介面,這個時候接入乙個訊息佇列,湊巧訊息佇列掛掉了,系統不是直接不能用了,崩潰掉了。
系統的複雜性:加入乙個訊息佇列,若是訊息丟失怎麼辦,訊息被重複消費了,訊息沒有按找既定的順序消費,都會導致系統出問題。
一致性問題:a系統處理完了直接返回成功了,那麼使用者就以為成功了,實際上,bc消費成功了,d消費失敗了,資料就不一致了。
所以使用訊息佇列會使系統的複雜程度增加乙個級別,但是需要用的時候還是得用,做好綜合考量。
MQ訊息佇列的作用與好處
在系統中使用訊息佇列mq,主要可以有 解耦合 非同步 削峰 解耦合如果乙個系統要給多個系統發資料。那麼接受者可能會變化,如減去a系統,加上b系統,這樣傳送端就要不時更改 這時候如果把傳送資料的請求發到訊息佇列裡,需要接收的系統自行訂閱訊息佇列,那麼這幾個系統之間的耦合就解開了。非同步如果乙個 的請求...
MQ 訊息佇列的概覽
目錄 前言 1.rocketmq對比kafka?rocketmq怎麼做到低延遲?2.主題和佇列有什麼區別?3.例外的訊息模型 rabbitmq 依然再用佇列的思想 4.rocketmq的訊息模型 5.kafka模型 6.總結 好的架構不是設計出來的,而是演進出來的。這個話很重要,也很有啟發。業務最適...
with this 中with的用法及其優缺點
with語句擴充套件乙個語句的作用域鏈。with expression 將給定的expression新增到在statement使用的作用域鏈上。表示式周圍的括號是必需的 j ascript查詢某個未使用命名空間的變數時,會通過作用域鏈來查詢,作用域鏈是跟執行 的context或者包含這個變數的函式有...