1. 程式人生 > 其它 >第八章 玩轉RabbitMQ 路由、主題模式實戰和總結 (2)

第八章 玩轉RabbitMQ 路由、主題模式實戰和總結 (2)

第3集 玩轉RabbitMQ的topic主題萬用字元模式和應用場景

簡介:RabbitMQ的主題模式和應用場景

  • 背景:

    • 如果業務很多路由key,怎麼維護??
    • topic交換機,支援萬用字元匹配模式,更加強大
    • 工作基本都是用這個topic模式
  • 什麼是rabbitmq的主題模式

    • 文件 https://www.rabbitmq.com/tutorials/tutorial-five-java.html

    • 交換機是 topic, 可以實現釋出訂閱模式fanout和路由模式Direct 的功能,更加靈活,支援模式匹配,萬用字元等

    • 交換機同過萬用字元進行轉發到對應的佇列,* 代表一個詞,#代表1個或多個詞,一般用#作為萬用字元居多,比如 #.order, 會匹配 info.order 、sys.error.order, 而 *.order ,只會匹配 info.order, 之間是使用. 點進行分割多個詞的; 如果是 .

      , 則info.order、error.order都會匹配

    • 注意

      • 交換機和佇列繫結時用的binding使用萬用字元的路由健
      • 生產者傳送訊息時需要使用具體的路由健
  • 測試,下面的匹配規則是怎樣的

xxxxxxxxxx
quick.orange.rabbit 只會匹配  *.orange.* 和 *.*.rabbit ,進到Q1和Q2
lazy.orange.elephant 只會匹配 *.orange.* 和 lazy.#,進到Q1和Q2
quick.orange.fox 只會匹配 *.orange.*,進入Q1
lazy.brown.fox 只會匹配azy.#,進入Q2
lazy.pink.rabbit 只會匹配 lazy.#和*.*.rabbit ,同個佇列進入Q2(訊息只會發一次)
quick.brown.fox 沒有匹配,預設會被丟棄,可以通過回撥監聽二次處理
lazy.orange.male.rabbit,只會匹配 lazy.#,進入Q2
  • 例子:日誌採集系統

    • 一個佇列收集訂單系統的全部日誌資訊,order.log.#
    • 一個佇列收集全部系統的全部日誌資訊, #.log

第4集 玩轉RabbitMQ的topic主題萬用字元模式程式碼實戰

簡介:RabbitMQ的topic主題模式程式碼實戰

  • 例子:日誌採集系統

    • 一個佇列收集訂單系統的error日誌資訊,order.log.error
    • 一個佇列收集全部系統的全部級別日誌資訊, * .log. *
  • 生產者

xxxxxxxxxx
public class Send {
   private final static String EXCHANGE_NAME = "exchange_topic";
   public static void main(String[] argv) throws Exception {
     ConnectionFactory factory = new ConnectionFactory();
     factory.setHost("10.211.55.13");
     factory.setUsername("admin");
     factory.setPassword("password");
     factory.setVirtualHost("/dev");
     factory.setPort(5672);
     /**
     * 訊息生產者不用過多操作,只需要和交換機繫結即可
     */
     try (//建立連線
       Connection connection = factory.newConnection();
       //建立通道
       Channel channel = connection.createChannel()) {
       //繫結交換機,直連交換機
       channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.TOPIC);
       String error = "我是訂單錯誤日誌";
       String info = "我是訂單info日誌";
       String debug = "我是商品debug日誌";
       channel.basicPublish(EXCHANGE_NAME, "order.log.error", null, error.getBytes(StandardCharsets.UTF_8));
       channel.basicPublish(EXCHANGE_NAME, "order.log.info", null, info.getBytes(StandardCharsets.UTF_8));
       channel.basicPublish(EXCHANGE_NAME, "product.log.debug", null, debug.getBytes(StandardCharsets.UTF_8));
       System.out.println("訊息傳送成功");
     }
   }
}
  • 消費者(兩個)
xxxxxxxxxx
public class Recv1 {
   private final static String EXCHANGE_NAME = "exchange_topic";
   public static void main(String[] argv) throws Exception {
     ConnectionFactory factory = new ConnectionFactory();
     factory.setHost("10.211.55.13");
     factory.setUsername("admin");
     factory.setPassword("password");
     factory.setVirtualHost("/dev");
     factory.setPort(5672);
     //消費者一般不增加自動關閉
     Connection connection = factory.newConnection();
     Channel channel = connection.createChannel();
     //繫結交換機
     channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.TOPIC);
     //獲取佇列
     String queueName = channel.queueDeclare().getQueue();
     //繫結佇列和交換機,第一個節點
     //channel.queueBind(queueName,EXCHANGE_NAME,"order.log.error");
      //繫結佇列和交換機,第二個節點
    //channel.queueBind(queueName,EXCHANGE_NAME,"*.log.*");
     DeliverCallback deliverCallback = (consumerTag, delivery) -> {
       String message = new String(delivery.getBody(), "UTF-8");
       System.out.println(" [x] Received '" + message + "'");
     };
     //自動確認訊息
     channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
   }
}

第5集 RabbitMQ的多種工作模式總結

簡介:RabbitMQ的多個工作模式總結

  • 對照官網回顧總結

  • 簡單模式

    • 一個生產、一個消費,不用指定交換機,使用預設交換機
  • 工作佇列模式

    • 一個生產,多個消費,可以有輪訓和公平策略,不用指定交換機,使用預設交換機
  • 釋出訂閱模式

    • fanout型別交換機,通過交換機和佇列繫結,不用指定繫結的路由健,生產者傳送訊息到交換機,fanout交換機直接進行轉發,訊息不用指定routingkey路由健
  • 路由模式

    • direct型別交換機,過交換機和佇列繫結,指定繫結的路由健,生產者傳送訊息到交換機,交換機根據訊息的路由key進行轉發到對應的佇列,訊息要指定routingkey路由健
  • 萬用字元模式

    • topic交換機,過交換機和佇列繫結,指定繫結的【萬用字元路由健】,生產者傳送訊息到交換機,交換機根據訊息的路由key進行轉發到對應的佇列,訊息要指定routingkey路由健