1,生產者生產之后怎么放到隊列里面的
生產者投遞消息到exchange 上,exchange會把消息路由到指定的queue上,(根據某種路由規則去路由的)
消費者只需要監聽mq然后去消費就可以了
消費者確認接收到的消息之后就 rabbitMQ從隊列中刪除相應己經被確認的消息
生產者生產消息,消費者消費消息的過程可參考這個網址:
https://blog.csdn.net/myFirstCN/article/details/93501215
2,mq有哪些消費模式
(1)推送consumer
注冊一個消費者后,RabbitMQ會在消息可用時,自動將消息進行推送給消費者。這種方式效率最高最及時。
(2)拉取get
屬於一種輪詢模型,發送一次get請求,獲得一個消息。如果此時RabbitMQ中沒有消息,會獲得一個表示空的回復。
(3)自動確認
方法channel.basicConsume和方法channel.basicGet表示同步或異步獲取消息,第二個參數都表示是否自動確認。前面我們都設置為了true。這個時候我們只需要處理邏輯,將自動向RabbitMQ進行確認。
當autoAck=true時,一旦消費者接收到了消息,就視為自動確認了消息。如果消費者在處理消息的過程中,出了錯,就沒有什么辦法重新處理這條消息,所以我們很多時候,需要在消息處理成功后,再確認消息,這就需要手動確認。
(4)手動確認
(5)qos預取模式
在確認消息被接收之前,消費者可以預先要求接收一定數量的消息,在處理完一定數量的消息后,批量進行確認。如果消費者應用程序在確認消息之前崩潰,則所有未確認的消息將被重新發送給其他消費者。所以這里存在着一定程度上的可靠性風險。
這種機制一方面可以實現限速(將消息暫存到RabbitMQ內存中)的作用,一方面可以保證消息確認質量(比如確認了但是處理有異常的情況)
參考:https://www.cnblogs.com/duanjt/p/10075897.html
3,rabbitmq的延遲隊列和死信隊列
在rabbitmq中不存在延時隊列,但是我們可以通過設置消息的過期時間和死信隊列來模擬出延時隊列。消費者監聽死信交換器綁定的隊列,而不要監聽消息發送的隊列。
參考:https://www.iteye.com/blog/huan1993-2432175
4,rabbitmq怎么保證數據不丟失
三個方面:
(1)生產者不弄丟消息:開啟confirm模式,生產者開啟confirm之后,每次寫的消息都會分配一個唯一的id,如果寫入了rabbitmq中,會回傳一個ack消息,告訴你ok了,否則會回調一個nack接口,告知你失敗了。
(2)rabbitmq不弄丟消息:設置持久化有兩個步驟:創建queue的時候設置持久化,發送消息的時候把deliveryMode=2消息設置為持久化
(補充:聲明隊列,生命交換機,發送消息的時候 都需要持久化)
(3)消費端設置持久化:用到rabbitmq的ack機制,關閉自動ack,處理完業務邏輯之后再程序里面ack
5,rabbitmq相對其他隊列的特點是什么
(1)基於erlang開發,開發能力強,性能好,延時低
(2)時效性高,是微秒級別
(3)可用性比較高,基於主從架構實現高可用
(4)消息可靠性高
6,rabbitmq有哪些工作模式:
6.1,基本消息模型
一個生產者對應一個消費者,生產者生產一個消息到隊列,消費者消費這個消息。
6.2,工作隊列模式:
在實際生產過程中,消息生產會發送很多條消息,如果消費者只有一個的花效率就會很低
一個生產者發送消息到隊列,允許有多個消費者接收消息,但是一條消息只會被一個消費者獲取。
6.3,訂閱模式
在訂閱模式中,一條消息可以被多個消費者獲取。
消息傳遞過程中多了一個交換機,生產者不是直接發送消息到隊列,而是先發送到交換機,經由交換機分配到不同的隊列,每個消費者都有自己的隊列。
6.3.1,fanout 廣播模式
每個消費者都有自己的隊列,隊列和交換機綁定,交換機把消息發送到隊列中
6.3.2,direct 路由模式
在路由模式下可以實現不同的消息被不同的隊列消費。
交換機和隊列綁定的時候會設定一個routing key ,生產者發送消息的時候也需要攜帶一個routing key
6.3.3,topic 路由匹配模式
跟路由模式一樣,只不過路由名稱可以進行匹配識別
第6題和第4題可參考: