消息队列 策略_消息模型:主题和队列有什么区别?
首發公眾號
可以看到,技術圈的風向一直在變,大數據、云的熱度已經在慢慢消退,現在當紅的是 AI 和 IoT。這些火熱的概念,它最終要從論文和 PPT 落地,變成真正能解決問題的系統,否則就是一個空中樓閣。那不變的是什么?(一些題外話的感觸)
主題和隊列有什么區別?
最初的消息隊列,就是一個嚴格意義上的隊列
- 消費者之間實際上是競爭的關系,每個消費者只能收到隊列中的一部分消息
如果需要將一份消息數據分發給多個消費者,要求每個消費者都能收到全量的消息,例如,對于一份訂單數據,風控系統、分析系統、支付系統等都需要接收消息。這個時候,單個隊列就滿足不了需求,一個可行的解決方式是,為每個消費者創建一個單獨的隊列,讓生產者發送多份 (不好的做法).
為了解決這個問題,演化出了另外一種消息模型:“發布 - 訂閱模型(Publish-Subscribe Pattern)”。
在發布 - 訂閱模型中,消息的發送方稱為發布者(Publisher),消息的接收方稱為訂閱者(Subscriber),服務端存放消息的容器稱為主題(Topic)。發布者將消息發送到主題中,訂閱者在接收消息之前需要先“訂閱主題”。“訂閱”在這里既是一個動作,同時還可以認為是主題在消費時的一個邏輯副本,每份訂閱中,訂閱者都可以接收到主題的所有消息。
現代的消息隊列產品使用的消息模型大多是這種發布 - 訂閱模型
RabbitMQ的消息模型
它是少數依然堅持使用隊列模型的產品之一.
在 RabbitMQ 中,Exchange 位于生產者和隊列之間,生產者并不關心將消息發送給哪個隊列,而是將消息發送給 Exchange,由 Exchange 上配置的策略來決定將消息投遞到哪些隊列中。
同一份消息如果需要被多個消費者來消費,需要配置 Exchange 將消息發送到多個隊列,每個隊列中都存放一份完整的消息數據,可以為一個消費者提供消費服務。這也可以變相地實現新發布 - 訂閱模型中,“一份消息數據可以被多個訂閱者來多次消費”這樣的功能。
RocketMQ的消息模型
RocketMQ 使用的消息模型是標準的發布 - 訂閱模型
確認機制很好地保證了消息傳遞過程中的可靠性,但是,引入這個機制在消費端帶來了一個不小的問題。為了確保消息的有序性,在某一條消息被成功消費之前,下一條消息是不能被消費的,否則就會出現消息空洞,違背了有序性這個原則。
也就是說,每個主題在任意時刻,至多只能有一個消費者實例在進行消費,那就沒法通過水平擴展消費者的數量來提升消費端總體的消費性能。為了解決這個問題,RocketMQ 在主題下面增加了隊列的概念。
- 每個主題包含多個隊列,通過多個隊列來實現多實例并行生產和消費
- RocketMQ 只在隊列上保證消息的有序性,主題層面是無法保證消息的嚴格順序的 (同一隊列有序, 隊列之間無序)
RocketMQ 中,訂閱者的概念是通過消費組(Consumer Group)來體現的。每個消費組都消費主題中一份完整的消息,不同消費組之間消費進度彼此不受影響,也就是說,一條消息被 Consumer Group1 消費過,也會再給 Consumer Group2 消費。
消費組中包含多個消費者,同一個組內的消費者是競爭消費的關系,每個消費者負責消費組內的一部分消息。如果一條消息被消費者 Consumer1 消費了,那同組的其他消費者就不會再收到這條消息。
在 Topic 的消費過程中,由于消息需要被不同的組進行多次消費,所以消費完的消息并不會立即被刪除,這就需要 RocketMQ 為每個消費組在每個隊列上維護一個消費位置(Consumer Offset),這個位置之前的消息都被消費過,之后的消息都沒有被消費過,每成功消費一條消息,消費位置就加一。這個消費位置是非常重要的概念,我們在使用消息隊列的時候,丟消息的原因大多是由于消費位置處理不當導致的。
Kafka的消息模型
Kafka 的消息模型和 RocketMQ 是完全一樣的.
唯一的區別是,在 Kafka 中,隊列這個概念的名稱不一樣,Kafka 中對應的名稱是分區(Partition)
總結
- 主題: 發布-訂閱
- 隊列: 先進先出
業務模型不等于就是實現層面的模型。比如說 MySQL 和 Hbase 同樣是支持 SQL 的數據庫,它們的業務模型中,存放數據的單元都是“表”,但是在實現層面,沒有哪個數據庫是以二維表的方式去存儲數據的,MySQL 使用 B+ 樹來存儲數據,而 HBase 使用的是 KV 的結構來存儲。同樣,像 Kafka 和 RocketMQ 的業務模型基本是一樣的,并不是說他們的實現就是一樣的,實際上這兩個消息隊列的實現是完全不同的。
更多技術文章歡迎關注「公眾號:碼農架構」
總結
以上是生活随笔為你收集整理的消息队列 策略_消息模型:主题和队列有什么区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘启动制作完成后怎么装 U盘启动制作后
- 下一篇: 计算机科学与技术专业导论_教育部最新公布