簡單介紹
什麼是MQ?
MQ 是Message Queue的縮寫,也就是消息隊列的意思。
MQ(Message Queue)消息隊列,是基礎數據結構中“先進先出”的一種數據結構。一般用來解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。
它最主要的三個特點:
- 消峯
- 解耦
- 異步
消息隊列是典型的:生產者、消費者模型。生產者不斷向消息隊列中生產消息,消費者不斷的從隊列中獲取消息。因爲消息的生產和消費都是異步的,而且只關心消息的發送和接收,沒有業務邏輯的侵入,這樣就實現了生產者和消費者的解耦。
AMQP 與 JMS
MQ主流的實現方式有兩種:AMQP 和 JMS
AMQP 是一個提供統一消息服務的應用層標準高級消息隊列協議
JMS 是 java 中一個api,它爲java提供了統一的消息操作,它jdbc比較類似
它倆之間的聯繫與卻別:
- JMS是定義了統一的接口,來對消息操作進行統一;AMQP是通過規定協議來統一數據交互的格式
- JMS限定了必須使用Java語言;AMQP只是協議,不規定實現方式,因此是跨語言的
- JMS規定了兩種消息模型;而AMQP的消息模型更加豐富
常見的消息隊列:
- ActiveMQ:基於JMS
- RabbitMQ:基於AMQP協議,erlang語言開發,穩定性好
- RocketMQ:基於JMS,阿里巴巴產品,目前交由Apache基金會
- Kafka:分佈式消息系統,高吞吐量
圖解關係
一張圖送給大家:
之前的寫過 RabbitMQ以及它Web端圖形化界面的安裝 ,大家可以根據圖像化界面去了解一下RabbitMQ中Virtual Host 、 Exchange 、 Queue 、 Channel 之間的關係。
引入基本依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件
使用yml類型的配置文件
spring:
rabbitmq:
host: 39.97.12.34 ## ip
username: eric
password: eric
virtual-host: rabbitmq # 指定虛擬機
template:
exchange: lk.item.exchange # 指定默認交換機
publisher-confirms: true # 如果消息發送失敗,會有ack,觸發重試機制
消息提供者
// springboot用於測試的兩個註解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MQApplication.class)
public class SpringSenderTest {
// 自動注入 AmqpTemplate
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void testSend() throws InterruptedException {
String msg = "hello, Spring boot amqp";
// 第一個參數: 指定發送的交換機
// 第二個參數: 指定RoutingKey
// 第三個參數: 指定發送的消息
this.amqpTemplate.convertAndSend("spring.test.exchange","a.b", msg);
// 等待10秒後再結束
Thread.sleep(10000);
}
}
在圖形化界面中的交換機
消息的監聽者
@Component
public class Listener {
@RabbitListener(bindings = @QueueBinding(
// 設置選擇隊列名稱
value = @Queue(value = "spring.test.queue",durable = "true"),
exchange = @Exchange(
value = "spring.test.exchange", // 選擇交換機的名稱
ignoreDeclarationExceptions = "true", // 消息持久化
type = ExchangeTypes.TOPIC // 選擇可用topic的交換機
),
// 指定 routingKey,使用通配符,直接匹配上邊的 a.b
key = {"#.#"}))
// 參數類型,應與消息發送者發送消息類型保持一致
public void recv(String msg){
System.out.println(msg);
}
簡做總結,如有不足,歡迎指出!