一、理論基礎
1.1、RabbitMQ有哪些重要的組件(6個)
ConnectionFactory連接管理器:用戶與MQ建立的連接管理器;
Channel信道:消息推送使用的通道;
Exchange交換機:用於接收、分配消息;
Queue隊列:用於存儲生產者的消息;
RoutingKey路由鍵:用於把生產者的數據分配(路由)到交換機上;
BingDingKey綁定建:用於把交換器的消息綁定到隊列中。
1.2、Rabbitmq 的消息是怎麼發送的
客戶端通過TCP連接到MQ服務器,連接成功後MQ與客戶端建立了一條amqp信道Channer,信道是創建的真實的TCP上的虛擬連接,amqp命令都是通過信道發送出去的
1.3、MQ怎麼避免消息丟失
消息持久化、ACK確認機制、集羣、消息補償機制
1.4、三種廣播模式
fanout:凡事綁定到此交換機和隊列都可以接受消息;
direct:通過路由鍵和交換機決定唯一的隊列可以接受消息;
topic:所有符合路由鍵所綁定的隊列都可以接受消息。
1.5、延遲隊列
什麼是延遲隊列:用來存放需要在指定時間被處理的元素的隊列,延遲隊列中的元素都是帶時間屬性(TTL)的
什麼場景使用延遲隊列:
- 訂單在十分鐘未支付則自動取消;
- 新創建的店鋪如果十天內未上傳過商品,則自動發送消息提醒;
- 賬單在一週內未支付,則自動支付;
- 用戶發起退款,如果三天內沒有處理則通知相關人員;
- 預定會議後,需要在預定時間前10分鐘,通知參會人員。
1.6、什麼是TTL
TTL是MQ中一個消息或者隊列的屬性,表明一條消息或者隊列中所有消息或者隊列的最大存活時間,單位是毫秒。如果一條消息設置了TTL屬性,或者進入了設置TTL的隊列,如果這條消息在TTL內的時間未被消費則該條消息則變成死信,如果配置了消息的TTL和隊列的TTL則較小的那個值會被使用。
如何設置TTL(2種方式):
(1)一種是創建隊列的時候設置隊列的“x-message-ttl”屬性,如:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, args);
(2)另一種是針對每條消息設置TTL:
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, mandatory, properties, "msg body".getBytes());
兩種方式的區別:
如果設置了隊列的TTL,如果消息過期則被隊列丟棄;而第二種即使消息過期也不會馬上被丟棄, 因爲消息是否過期是在即將投遞到消費者之前被判定的。此外,如果不設置TTL則表示消息永遠不會過期,消息過期則變成死信。
二、實戰
.....待更新