RabbitMQ 的基本使用

簡單介紹

什麼是MQ?
MQ 是Message Queue的縮寫,也就是消息隊列的意思。

MQ(Message Queue)消息隊列,是基礎數據結構中“先進先出”的一種數據結構。一般用來解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。

它最主要的三個特點:

  1. 消峯
  2. 解耦
  3. 異步

消息隊列是典型的:生產者、消費者模型。生產者不斷向消息隊列中生產消息,消費者不斷的從隊列中獲取消息。因爲消息的生產和消費都是異步的,而且只關心消息的發送和接收,沒有業務邏輯的侵入,這樣就實現了生產者和消費者的解耦。


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);
    }

簡做總結,如有不足,歡迎指出!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章