消息隊列已經逐漸成爲分佈式應用場景、內部通訊、以及秒殺等高併發業務場景的核心手段,它具備低耦合、可靠投遞、廣播、流量控制、最終一致性 等一系列功能。java
不管是 RabbitMQ、RocketMQ、ActiveMQ、Kafka仍是其它等,都有的一些基本原理、術語、機制等,總結分享出來,但願你們在使用消息隊列技術的時候可以快速理解。面試
1. 消息生產者、消息者、隊列數據庫
2.設計Broker主要考慮架構
1)消息的轉儲:在更合適的時間點投遞,或者經過一系列手段輔助消息最終能送達消費機。併發
2)規範一種範式和通用的模式,以知足解耦、最終一致性、錯峯等需求。分佈式
3)其實簡單理解就是一個消息轉發器,把一次RPC作成兩次RPC。發送者把消息投遞到broker,broker再將消息轉發一手到接收端。微服務
總結起來就是兩次RPC加一次轉儲,若是要作消費確認,則是三次RPC。高併發
3. 點對點消息隊列模型架構設計
點對點模型 用於 消息生產者 和 消息消費者 之間 點到點 的通訊。設計
點對點模式包含三個角色:
每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,能夠放在 內存 中也能夠 持久化,直到他們被消費或超時。
特色
4. 發佈訂閱消息模型Topic
發佈訂閱模型包含三個角色:
多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
特色
5.點對點和發佈訂閱的區別
生產者發送一條消息到隊列queue,只有一個消費者能收到。
發佈者發送到topic的消息,只有訂閱了topic的訂閱者纔會收到消息。
6. 消息的順序性保證
基於Queue消息模型,利用FIFO先進先出的特性,能夠保證消息的順序性。
7. 消息的ACK機制
即消息的Ackownledge確認機制,
爲了保證消息不丟失,消息隊列提供了消息Acknowledge機制,即ACK機制,當Consumer確認消息已經被消費處理,發送一個ACK給消息隊列,此時消息隊列即可以刪除這個消
息了。若是Consumer宕機/關閉,沒有發送ACK,消息隊列將認爲這個消息沒有被處理,會將這個消息從新發送給其餘的Consumer從新消費處理。
8.最終一致性的設計思路
主要是用「記錄」和「補償」的方式。
本地事務維護業務變化和通知消息,一塊兒落地,而後RPC到達broker,在broker成功落地後,RPC返回成功,本地消息能夠刪除。不然本地消息一直靠定時任務輪詢不斷重發,這樣就保證了消息可靠落地broker。
broker往consumer發送消息的過程相似,一直髮送消息,直到consumer發送消費成功確認。
咱們先不理會重複消息的問題,經過兩次消息落地加補償,下游是必定能夠收到消息的。而後依賴狀態機版本號等方式作判重,更新本身的業務,就實現了最終一致性。
若是出現消費方處理過慢消費不過來,要容許消費方主動ack error,並能夠與broker約定下次投遞的時間。
對於broker投遞到consumer的消息,因爲不肯定丟失是在業務處理過程當中仍是消息發送丟失的狀況下,有必要記錄下投遞的IP地址。決定重發以前詢問這個IP,消息處理成功了嗎?若是詢問無果,再重發。
事務:本地事務,本地落地,補償發送。本地事務作的,是業務落地和消息落地的事務,而不是業務落地和RPC成功的事務。消息只要成功落地,很大程度上就沒有丟失的風險。
9. 消息的事務支持
消息的收發處理支持事務,例如:在任務中心場景中,一次處理可能涉及多個消息的接收、處理,這應該處於同一個事務範圍內,若是一個消息處理失敗,事務回滾,消息從新回到隊列中。
10. 消息的持久化
消息的持久化,對於一些關鍵的核心業務來講是很是重要的,啓用消息持久化後,消息隊列宕機重啓後,消息能夠從持久化存儲恢復,消息不丟失,能夠繼續消費處理。
11. 消息隊列的高可用性
在實際生產環境中,使用單個實例的消息隊列服務,若是遇到宕機、重啓等系統問題,消息隊列就沒法提供服務了,所以不少場景下,咱們但願消息隊列有高可用性支持,例如
RabbitMQ的鏡像集羣模式的高可用性方案,ActiveMQ也有基於LevelDB+ZooKeeper的高可用性方案,以及Kafka的Replication機制等。
12.消息隊列的選型和應用場景
以上是就是消息隊列MQ技術的一些梳理和概括,但願對你們有幫助。更多Redis系列、Dubbo微服務系列、數據庫系列等高併發架構設計,具體請參考高併發架構專題。
若是對java微服務、分佈式、高併發、高可用、大型互聯網架構技術、面試經驗交流。
能夠加我架構圈子羣:692-845-439 領取資料,羣內天天更新資料,免費領取。