Spring Boot 之 RabbitMQ 消息隊列中間件的三種模式

開門見山(文末附有消息隊列的幾個基本概念)負載均衡

一、直接模式( Direct)模式 測試

直白的說就是一對一,生產者對應惟一的消費者(固然同一個消費者能夠開啓多個服務)。spa

雖然使用了自帶的交換器(Exchange),但使用的是默認的「」空字符串交換器,code

也至關於直接跨過交換器到達消息隊列,也是稱爲直接模式的緣由(猜的)server

生產者代碼:對象

  @Autowired private RabbitTemplate rabbitTemplate; /* 普通模式: */ @Test public void SendMag(){ rabbitTemplate.convertAndSend("Not_Copy1","直接模式測試"); }

RabbitMQ管理器:blog

 

消費者代碼:隊列

服務一
@Component @RabbitListener(queues
= "Not_Copy1") public class Customer1 { @RabbitHandler public void getMsg(String msg){ System.out.println("11111Not_Copy1:"+msg); } }
 
 
服務二
@Component @RabbitListener(queues = "Not_Copy1") public class Customer1 { @RabbitHandler public void getMsg(String msg){ System.out.println("22222Not_Copy1:"+msg); } }
服務三
@Component @RabbitListener(queues
= "Not_Copy1") public class Customer1 { @RabbitHandler public void getMsg(String msg){ System.out.println("33333Not_Copy1:"+msg); } }

消息連發三次路由

結果:字符串

服務一:11111Not_Copy1:直接模式測試

服務二:22222Not_Copy1:直接模式測試

服務三:33333Not_Copy1:直接模式測試

證實存在着默認的負載均衡。

 

二、分裂模式(Fanout)模式

直白的說就是一對多,一個生產者對應多個消費者(固然同一個消費者能夠開啓多個服務)。

使用了自定義的交換器(Exchange),由交換器分發給與當前交換器相 關聯的消息隊列,

就像發牌員發牌同樣。

生產者代碼:

  @Autowired private RabbitTemplate rabbitTemplate;    /** * 分裂模式 交換器 Distributor */ @Test public void SendMag1(){ rabbitTemplate.convertAndSend("Distributor","","分裂模式測試"); }

RabbitMQ管理器:

交換器 Distributor 分配了三個消息隊列,由於是分裂模式是以Type選  fanout

消費者代碼:

消費者一

@Component @RabbitListener(queues = "Not_Copy1") public class Customer1 { @RabbitHandler public void getMsg(String msg){ System.out.println("Not_Copy1:"+msg); } }
消費者二
@Component @RabbitListener(queues = "Not_Copy2") public class Customer2 { @RabbitHandler public void getMsg(String msg){ System.out.println("Not_Copy2:"+msg); } }

 消費者三

@Component @RabbitListener(queues = "Not_Copy3") public class Customer3 { @RabbitHandler public void getMsg(String msg){ System.out.println("Not_Copy3:"+msg); } }

消息發送一遍

結果:

消費者一:Not_Copy1:分裂模式測試

消費者二:Not_Copy2:分裂模式測試

消費者三:Not_Copy3:分裂模式測試

注意:每一個消費者是一個類(Customer1,Customer2,Customer3),而不是三個消費者寫在一個個類中。

 

三、主題模式(Topic)

直白的說主題模式也是一對多,只不過在分裂模式模式的基礎上添加了規則或者說主題,

交換器按照規則或者說按照主題下發,符合規則或者說主題的才下發

生產者代碼:

  @Autowired private RabbitTemplate rabbitTemplate;/* 主題模式 */ @Test public void SendMag1(){ rabbitTemplate.convertAndSend("Distributor2","good.abc","主題模式測試"); }   @Test public void SendMag2(){ rabbitTemplate.convertAndSend("Distributor2","good.abc.log","主題模式測試"); }   @Test public void SendMag3(){ rabbitTemplate.convertAndSend("Distributor2","good.log","主題模式測試"); }

 

 RabbitMQ管理器:

交換器Distributor2 分配了三個消息隊列,併爲各其配置了主題  由於是分裂模式是以Type選  topic

結果:

生產者:SendMag1(),主題:good.abc ,

對應消費者:Not_Copy1:主題模式測試

 

生產者:  SendMag2() ,主題:good.abc.log ,

對應消費者:Not_Copy1:主題模式測試

      Not_Copy2:主題模式測試

 

生產者:  SendMag3() ,主題:good.log ,     

對應消費者:Not_Copy1:主題模式測試

      Not_Copy2:主題模式測試

      Not_Copy3:主題模式測試

 

經過這三個主題你們應該已經熟悉了主題模式的應用。

基本概念:

RabbitMQ Server: 也叫broker server,它是一種傳輸服務。 他的角色就是維護一條 從Producer到Consumer的路線,保證數據可以按照指定的方式進行傳輸。


Producer: 消息生產者,如圖A、B、C,數據的發送方。消息生產者鏈接RabbitMQ服 務器而後將消息投遞到Exchange。


Consumer:消息消費者,如圖一、二、3,數據的接收方。消息消費者訂閱隊列, RabbitMQ將Queue中的消息發送到消息消費者。

Exchange:生產者將消息發送到Exchange(交換器),由Exchange將消息路由到一個 或多個Queue中(或者丟棄)。Exchange並不存儲消息。RabbitMQ中的Exchange有 direct、fanout、topic、headers四種類型,每種類型對應不一樣的路由規則。


Queue:(隊列)是RabbitMQ的內部對象,用於存儲消息。消息消費者就是經過訂閱 隊列來獲取消息的,RabbitMQ中的消息都只能存儲在Queue中,生產者生產消息並終 投遞到Queue中,消費者能夠從Queue中獲取消息並消費。多個消費者能夠訂閱同一個 Queue,這時Queue中的消息會被平均分攤給多個消費者進行處理,而不是每一個消費者 都收到全部的消息並處理。


RoutingKey:生產者在將消息發送給Exchange的時候,通常會指定一個routing key, 來指定這個消息的路由規則,而這個routing key須要與Exchange Type及binding key聯 合使用才能終生效。在Exchange Type與binding key固定的狀況下(在正常使用時一 般這些內容都是固定配置好的),咱們的生產者就能夠在發送消息給Exchange時,經過 指定routing key來決定消息流向哪裏。RabbitMQ爲routing key設定的長度限制爲255 bytes。

Connection: (鏈接):Producer和Consumer都是經過TCP鏈接到RabbitMQ Server 的。之後咱們能夠看到,程序的起始處就是創建這個TCP鏈接。


Channels: (信道):它創建在上述的TCP鏈接中。數據流動都是在Channel中進行 的。也就是說,通常狀況是程序起始創建TCP鏈接,第二步就是創建這個Channel。

VirtualHost:權限控制的基本單位,一個VirtualHost裏面有若干Exchange和 MessageQueue,以及指定被哪些user使用

相關文章
相關標籤/搜索