用戶註冊後,須要發註冊郵件和註冊短信,傳統的作法有兩種1.串行的方式;2.並行的方式前端
(1)串行方式:將註冊信息寫入數據庫後,發送註冊郵件,再發送註冊短信,以上三個任務所有完成後才返回給客戶端。 這有一個問題是,郵件,短信並非必須的,它只是一個通知,而這種作法讓客戶端等待沒有必要等待的東西.數據庫
(2)並行方式:將註冊信息寫入數據庫後,發送郵件的同時,發送短信,以上三個任務完成後,返回給客戶端,並行的方式能提升處理的時間。服務器
引入消息隊列後,把發送郵件,短信不是必須的業務邏輯異步處理架構
由此能夠看出,引入消息隊列後,用戶的響應時間就等於寫入數據庫的時間+寫入消息隊列的時間(能夠忽略不計),引入消息隊列後處理後,響應時間是串行的3倍,是並行的2倍。併發
用戶下單後,訂單系統須要通知庫存系統,傳統的作法就是訂單系統調用庫存系統的接口.當庫存系統出現故障時,訂單就會失敗異步
引入消息隊列後分佈式
訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。日誌
庫存系統:訂閱下單的消息,獲取下單消息,進行庫操做。中間件
就算庫存系統出現故障,消息隊列也能保證消息的可靠投遞,不會致使消息丟失blog
秒殺活動,通常會由於流量過大,致使應用掛掉,爲了解決這個問題,通常在應用前端加入消息隊列。
1.能夠控制活動人數,超過此必定閥值的訂單直接丟棄
2.能夠緩解短期的高流量壓垮應用(應用程序按本身的最大處理能力獲取訂單)
1.用戶的請求,服務器收到以後,首先寫入消息隊列,加入消息隊列長度超過最大值,則直接拋棄用戶請求或跳轉到錯誤頁面.
2.秒殺業務根據消息隊列中的請求信息,再作後續處理.
日誌處理是指將消息隊列用在日誌處理中,好比 Kafka 的應用,解決大量日誌傳輸的問題。架構簡化以下:
日誌採集客戶端,負責日誌數據採集,定時寫入 Kafka 隊列:Kafka 消息隊列,負責日誌數據的接收,存儲和轉發;日誌處理應用:訂閱並消費 kafka 隊列中的日誌數據
若是通常的業務系統要引入 MQ,怎麼選型:
用戶訪問量在 ActiveMQ 的可承受範圍內,並且確實主要是基於解耦和異步來用的,能夠考慮 ActiveMQ,也比較貼近 Java 工程師的使用習慣,可是 ActiveMQ 如今中止維護了,同時 ActiveMQ 併發不高,因此業務量必定的狀況下能夠考慮使用。
RabbitMQ 做爲一個純正血統的消息中間件,有着高級消息協議 AMQP 的完美結合,在消息中間件中地位無可取代,可是 erlang 語言阻止了咱們去深 入研究和掌控,對公司而言,底層技術沒法控制,可是確實是開源的,有比較穩定的支持,活躍度也高。
對本身公司技術實力有絕對自信的,能夠用 RocketMQ,可是 RocketMQ 誕生比較晚,而且更新迭代很快,這個意味着在使用過程當中有可能會遇到很 多坑,因此若是大家公司 Java 技術不是很強,不推薦使用。