開門見山(文末附有消息隊列的幾個基本概念)負載均衡
一、直接模式( 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使用