RabbitMQ學習筆記(2、RabbitMQ結構)

目錄:

  • RabbitMQ幾大組件
  • 交換器類型
  • RabbitMQ運行流程

RabbitMQ幾大組件:(與RabbitMQ第一節中AMQP同樣,不細說)

一、生產者、消費者、消息函數

二、Broker:簡單的來講broker就是一個RabbitMQ的一個服務節點ui

三、隊列spa

四、交換器、路由鍵、綁定鍵code

交換器類型:

一、fanout(分列):把全部發送到該交換器上的消息,路由到與該交換器綁定的隊列中。blog

 1 public class Product {  2 
 3     private static final String EXCHANGE_NAME = "exchange";  4     private static final String QUEUE_NAME = "exchange_queue1";  5     private static final String QUEUE_NAME2 = "exchange_queue2";  6     private static final String ROUTING_KEY = "exchange_routingKey";  7     private static final String ROUTING_KEY2 = "exchange_routingKey2";  8 
 9     public static void main(String[] args) throws IOException, TimeoutException { 10         Connection connection = getConnection(); 11         Channel channel = connection.createChannel(); 12  channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT); 13 
14         // 定義隊列一、隊列2
15         channel.queueDeclare(QUEUE_NAME, false, false, false, null); 16         channel.queueDeclare(QUEUE_NAME2, false, false, false, null); 17         // 將隊列一、隊列2綁定到同一個fanout交換器上,但路由鍵不同
18  channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY); 19  channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, ROUTING_KEY2); 20 
21         // 僅發送路由鍵1的消息,但因綁定鍵是fanout類型,因此隊列1和隊列2都會受到消息
22  channel.basicPublish(EXCHANGE_NAME, 23  ROUTING_KEY, 24  MessageProperties.PERSISTENT_TEXT_PLAIN, 25                 "Hello world".getBytes()); 26 
27  close(connection, channel); 28  } 29 }

二、direct(直接):須要bindingKey和routingKey徹底匹配才能成功發送消息。隊列

就fanout例子的第12行代碼修改成channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);(注意:修改代碼運行前,須要先將原先綁定的交換器刪掉,由於以前那個交換器已是fantou類型了;或者是定義一個新的交換器)路由

便只有exchange_queue1才能接受到消息,便爲2。get

三、topic(主題):與direct相似,但支持通配符匹配(相似於廣播)。回調函數

  • #:匹配多個或零個單詞
  • *:匹配一個單詞

四、header:不是根據路由鍵的匹配規則,而是經過發送消息中的header來匹配。it

RabbitMQ運行流程:

一、生產者:

  • 生產者與Broker創建鏈接並開啓信道
  • 生產者聲明交換器(交換器類型、是否持久化、是否自動刪除)、隊列(是否持久化、是否排他、是否自動刪除)
  • 生產者經過路由鍵將交換器和隊列綁定
  • 生產者發送消息到Broker(攜帶路由鍵等)
  • 交換器再根據接收到的路由鍵以及交換器類型查找相匹配的隊列,若是匹配上了將消息存入隊列中,若未匹配上,則根據生產者的配置決定丟棄或是退回給生產者
  • 關閉信道和鏈接

二、消費者:

  • 消費者與Broker創建鏈接並開啓信道
  • 消費者向Broker請求消費相對應的隊列,此中能夠設置回調函數
  • 接受並處理消息
  • 消費者能夠確認消息(ack)
  • RabbitMQ從隊列中刪除已被確認的消息
  • 關閉信道和鏈接
相關文章
相關標籤/搜索