springboot(集成篇):RabbitMQ集成詳解

轉(zhuǎn)載?2017年11月01日 09:54:03

2595

RabbitMQ 即一個(gè)消息隊(duì)列潜的,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦骚揍,同時(shí)也能起到消息緩沖,消息分發(fā)的作用啰挪。

消息中間件在互聯(lián)網(wǎng)公司的使用中越來(lái)越多信不,剛才還看到新聞阿里將RocketMQ捐獻(xiàn)給了apache,當(dāng)然了今天的主角還是講RabbitMQ亡呵。消息中間件最主要的作用是解耦抽活,中間件最標(biāo)準(zhǔn)的用法是生產(chǎn)者生產(chǎn)消息傳送到隊(duì)列,消費(fèi)者從隊(duì)列中拿取消息并處理政己,生產(chǎn)者不用關(guān)心是誰(shuí)來(lái)消費(fèi)酌壕,消費(fèi)者不用關(guān)心誰(shuí)在生產(chǎn)消息掏愁,從而達(dá)到解耦的目的。在分布式的系統(tǒng)中卵牍,消息隊(duì)列也會(huì)被用在很多其它的方面果港,比如:分布式事務(wù)的支持,RPC的調(diào)用等等糊昙。

以前一直使用的是ActiveMQ辛掠,在實(shí)際的生產(chǎn)使用中也出現(xiàn)了一些小問(wèn)題,在網(wǎng)絡(luò)查閱了很多的資料后释牺,決定嘗試使用RabbitMQ來(lái)替換ActiveMQ萝衩,RabbitMQ的高可用性、高性能没咙、靈活性等一些特點(diǎn)吸引了我們猩谊,查閱了一些資料整理出此文。

RabbitMQ介紹

RabbitMQ是實(shí)現(xiàn)AMQP(高級(jí)消息隊(duì)列協(xié)議)的消息中間件的一種祭刚,最初起源于金融系統(tǒng)牌捷,用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性涡驮、擴(kuò)展性暗甥、高可用性等方面表現(xiàn)不俗。RabbitMQ主要是為了實(shí)現(xiàn)系統(tǒng)之間的雙向解耦而實(shí)現(xiàn)的捉捅。當(dāng)生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時(shí)撤防,消費(fèi)者無(wú)法快速消費(fèi),那么需要一個(gè)中間層棒口。保存這個(gè)數(shù)據(jù)寄月。

AMQP,即Advanced Message Queuing Protocol陌凳,高級(jí)消息隊(duì)列協(xié)議剥懒,是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)合敦。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無(wú)需知道消息使用者的存在验游,反之亦然充岛。AMQP的主要特征是面向消息、隊(duì)列耕蝉、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布/訂閱)崔梗、可靠性、安全垒在。

RabbitMQ是一個(gè)開源的AMQP實(shí)現(xiàn)蒜魄,服務(wù)器端用Erlang語(yǔ)言編寫,支持多種客戶端,如:Python谈为、Ruby旅挤、.NET、Java伞鲫、JMS粘茄、C、PHP秕脓、ActionScript柒瓣、XMPP、STOMP等吠架,支持AJAX芙贫。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性傍药、擴(kuò)展性屹培、高可用性等方面表現(xiàn)不俗。

相關(guān)概念

通常我們談到隊(duì)列服務(wù), 會(huì)有三個(gè)概念: 發(fā)消息者怔檩、隊(duì)列褪秀、收消息者,RabbitMQ 在這個(gè)基本概念之上, 多做了一層抽象, 在發(fā)消息者和 隊(duì)列之間, 加入了交換器 (Exchange). 這樣發(fā)消息者和隊(duì)列就沒(méi)有直接聯(lián)系, 轉(zhuǎn)而變成發(fā)消息者把消息給交換器, 交換器根據(jù)調(diào)度策略再把消息再給隊(duì)列薛训。

左側(cè) P 代表 生產(chǎn)者媒吗,也就是往 RabbitMQ 發(fā)消息的程序。

中間即是 RabbitMQ乙埃,其中包括了 交換機(jī) 和 隊(duì)列闸英。

右側(cè) C 代表 消費(fèi)者,也就是往 RabbitMQ 拿消息的程序介袜。

那么甫何,其中比較重要的概念有 4 個(gè),分別為:虛擬主機(jī)遇伞,交換機(jī)辙喂,隊(duì)列,和綁定鸠珠。

虛擬主機(jī):一個(gè)虛擬主機(jī)持有一組交換機(jī)巍耗、隊(duì)列和綁定。為什么需要多個(gè)虛擬主機(jī)呢渐排?很簡(jiǎn)單炬太,RabbitMQ當(dāng)中,用戶只能在虛擬主機(jī)的粒度進(jìn)行權(quán)限控制驯耻。?因此亲族,如果需要禁止A組訪問(wèn)B組的交換機(jī)/隊(duì)列/綁定炒考,必須為A和B分別創(chuàng)建一個(gè)虛擬主機(jī)。每一個(gè)RabbitMQ服務(wù)器都有一個(gè)默認(rèn)的虛擬主機(jī)“/”霎迫。

交換機(jī):Exchange 用于轉(zhuǎn)發(fā)消息斋枢,但是它不會(huì)做存儲(chǔ)?,如果沒(méi)有 Queue bind 到 Exchange 的話女气,它會(huì)直接丟棄掉 Producer 發(fā)送過(guò)來(lái)的消息杏慰。

這里有一個(gè)比較重要的概念:路由鍵?炼鞠。消息到交換機(jī)的時(shí)候,交互機(jī)會(huì)轉(zhuǎn)發(fā)到對(duì)應(yīng)的隊(duì)列中谒主,那么究竟轉(zhuǎn)發(fā)到哪個(gè)隊(duì)列,就要根據(jù)該路由鍵霎肯。

綁定:也就是交換機(jī)需要和隊(duì)列相綁定,這其中如上圖所示观游,是多對(duì)多的關(guān)系。

交換機(jī)(Exchange)

交換機(jī)的功能主要是接收消息并且轉(zhuǎn)發(fā)到綁定的隊(duì)列懂缕,交換機(jī)不存儲(chǔ)消息,在啟用ack模式后搪柑,交換機(jī)找不到隊(duì)列會(huì)返回錯(cuò)誤聋丝。交換機(jī)有四種類型:Direct, topic, Headers and Fanout

Direct:direct 類型的行為是"先匹配, 再投送". 即在綁定時(shí)設(shè)定一個(gè)?routing_key, 消息的routing_key匹配時(shí), 才會(huì)被交換器投送到綁定的隊(duì)列中去.

Topic:按規(guī)則轉(zhuǎn)發(fā)消息(最靈活)

Headers:設(shè)置header attribute參數(shù)類型的交換機(jī)

Fanout:轉(zhuǎn)發(fā)消息到所有綁定隊(duì)列

Direct Exchange

Direct Exchange是RabbitMQ默認(rèn)的交換機(jī)模式,也是最簡(jiǎn)單的模式工碾,根據(jù)key全文匹配去尋找隊(duì)列弱睦。

第一個(gè) X - Q1 就有一個(gè) binding key,名字為 orange渊额; X - Q2 就有 2 個(gè) binding key况木,名字為 black 和 green。當(dāng)消息中的 路由鍵 和 這個(gè) binding key 對(duì)應(yīng)上的時(shí)候端圈,那么就知道了該消息去到哪一個(gè)隊(duì)列中焦读。

Ps:為什么 X 到 Q2 要有 black,green舱权,2個(gè) binding key呢,一個(gè)不就行了嗎仑嗅? - 這個(gè)主要是因?yàn)榭赡苡钟?Q3宴倍,而Q3只接受 black 的信息张症,而Q2不僅接受black 的信息,還接受 green 的信息鸵贬。

Topic Exchange

Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符俗他。?在這種交換機(jī)下,隊(duì)列和交換機(jī)的綁定會(huì)定義一種路由模式阔逼,那么兆衅,通配符就要在這種路由模式和路由鍵之間匹配后交換機(jī)才能轉(zhuǎn)發(fā)消息。

在這種交換機(jī)模式下:

路由鍵必須是一串字符嗜浮,用句號(hào)(.) 隔開羡亩,比如說(shuō) agreements.us,或者 agreements.eu.stockholm 等危融。

路由模式必須包含一個(gè) 星號(hào)(*)畏铆,主要用于匹配路由鍵指定位置的一個(gè)單詞,比如說(shuō)吉殃,一個(gè)路由模式是這樣子:agreements..b.*辞居,那么就只能匹配路由鍵是這樣子的:第一個(gè)單詞是 agreements,第四個(gè)單詞是 b蛋勺。 井號(hào)(#)就表示相當(dāng)于一個(gè)或者多個(gè)單詞瓦灶,例如一個(gè)匹配模式是agreements.eu.berlin.#,那么抱完,以agreements.eu.berlin開頭的路由鍵都是可以的贼陶。

具體代碼發(fā)送的時(shí)候還是一樣,第一個(gè)參數(shù)表示交換機(jī)每界,第二個(gè)參數(shù)表示routing key家卖,第三個(gè)參數(shù)即消息。如下:

rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2"," this is? RabbitMQ!");

topic 和 direct 類似, 只是匹配上支持了"模式", 在"點(diǎn)分"的 routing_key 形式中, 可以使用兩個(gè)通配符:

*表示一個(gè)詞.

#表示零個(gè)或多個(gè)詞.

Headers Exchange

headers 也是根據(jù)規(guī)則匹配, 相較于 direct 和 topic 固定地使用 routing_key , headers 則是一個(gè)自定義匹配規(guī)則的類型.

在隊(duì)列與交換器綁定時(shí), 會(huì)設(shè)定一組鍵值對(duì)規(guī)則, 消息中也包括一組鍵值對(duì)( headers 屬性), 當(dāng)這些鍵值對(duì)有一對(duì), 或全部匹配時(shí), 消息被投送到對(duì)應(yīng)隊(duì)列.

Fanout Exchange

Fanout Exchange 消息廣播的模式趴樱,不管路由鍵或者是路由模式酪捡,會(huì)把消息發(fā)給綁定給它的全部隊(duì)列,如果配置了routing_key會(huì)被忽略捺疼。

springboot集成RabbitMQ

springboot集成RabbitMQ非常簡(jiǎn)單永罚,如果只是簡(jiǎn)單的使用配置非常少卧秘,springboot提供了spring-boot-starter-amqp項(xiàng)目對(duì)消息各種支持翅敌。

簡(jiǎn)單使用

1惕蹄、配置pom包,主要是添加spring-boot-starter-amqp的支持

org.springframework.bootspring-boot-starter-amqp

2遭顶、配置文件

配置rabbitmq的安裝地址赶促、端口以及賬戶信息

spring.application.name=spirng-boot-rabbitmqspring.rabbitmq.host=192.168.0.86spring.rabbitmq.port=5672spring.rabbitmq.username=adminspring.rabbitmq.password=123456

3鸥滨、隊(duì)列配置

@ConfigurationpublicclassRabbitConfig{@BeanpublicQueueQueue(){returnnewQueue("hello");? ? }}

3、發(fā)送者

rabbitTemplate是springboot 提供的默認(rèn)實(shí)現(xiàn)

publicclassHelloSender{@AutowiredprivateAmqpTemplate rabbitTemplate;public void send(){? ? ? ? String context ="hello "+newDate();? ? ? ? System.out.println("Sender : "+ context);this.rabbitTemplate.convertAndSend("hello", context);? ? }}

4老速、接收者

@Component@RabbitListener(queues ="hello")publicclassHelloReceiver{@RabbitHandlerpublic void process(String hello){? ? ? ? System.out.println("Receiver? : "+ hello);? ? }}

5凸主、測(cè)試

@RunWith(SpringRunner.class)@SpringBootTestpublicclassRabbitMqHelloTest{@AutowiredprivateHelloSender helloSender;@Testpublic void hello()throws Exception {? ? ? ? helloSender.send();? ? }}

注意,發(fā)送者和接收者的queue name必須一致旁舰,不然不能接收

多對(duì)多使用

一個(gè)發(fā)送者嗡官,N個(gè)接收者或者N個(gè)發(fā)送者和N個(gè)接收者會(huì)出現(xiàn)什么情況呢?

一對(duì)多發(fā)送

對(duì)上面的代碼進(jìn)行了小改造,接收端注冊(cè)了兩個(gè)Receiver,Receiver1和Receiver2磺樱,發(fā)送端加入?yún)?shù)計(jì)數(shù)婆咸,接收端打印接收到的參數(shù),下面是測(cè)試代碼块差,發(fā)送一百條消息,來(lái)觀察兩個(gè)接收端的執(zhí)行效果

@Testpublic void oneToMany()throws Exception {for(inti=0;i<100;i++){? ? ? ? neoSender.send(i);? ? }}

結(jié)果如下:

Receiver 1: spirng boot neo queue ****** 11

Receiver 2: spirng boot neo queue ****** 12

Receiver 2: spirng boot neo queue ****** 14

Receiver 1: spirng boot neo queue ****** 13

Receiver 2: spirng boot neo queue ****** 15

Receiver 1: spirng boot neo queue ****** 16

Receiver 1: spirng boot neo queue ****** 18

Receiver 2: spirng boot neo queue ****** 17

Receiver 2: spirng boot neo queue ****** 19

Receiver 1: spirng boot neo queue ****** 20

根據(jù)返回結(jié)果得到以下結(jié)論

一個(gè)發(fā)送者询兴,N個(gè)接受者,經(jīng)過(guò)測(cè)試會(huì)均勻的將消息發(fā)送到N個(gè)接收者中

多對(duì)多發(fā)送

復(fù)制了一份發(fā)送者起趾,加入標(biāo)記训裆,在一百個(gè)循環(huán)中相互交替發(fā)送

@Testpublic void manyToMany()throws Exception {for(inti=0;i<100;i++){? ? ? ? ? ? neoSender.send(i);? ? ? ? ? ? neoSender2.send(i);? ? ? ? }}

結(jié)果如下:

Receiver 1: spirng boot neo queue ****** 20

Receiver 2: spirng boot neo queue ****** 20

Receiver 1: spirng boot neo queue ****** 21

Receiver 2: spirng boot neo queue ****** 21

Receiver 1: spirng boot neo queue ****** 22

Receiver 2: spirng boot neo queue ****** 22

Receiver 1: spirng boot neo queue ****** 23

Receiver 2: spirng boot neo queue ****** 23

Receiver 1: spirng boot neo queue ****** 24

Receiver 2: spirng boot neo queue ****** 24

Receiver 1: spirng boot neo queue ****** 25

Receiver 2: spirng boot neo queue ****** 25

結(jié)論:和一對(duì)多一樣边琉,接收端仍然會(huì)均勻接收到消息

高級(jí)使用

對(duì)象的支持

springboot以及完美的支持對(duì)象的發(fā)送和接收记劝,不需要格外的配置。

//發(fā)送者public void send(User user){? ? System.out.println("Sender object: "+ user.toString());this.rabbitTemplate.convertAndSend("object", user);}...//接受者@RabbitHandlerpublic void process(User user){? ? System.out.println("Receiver object : "+ user);}

結(jié)果如下:

Sender object: User{name='neo', pass='123456'}

Receiver object : User{name='neo', pass='123456'}

Topic Exchange

topic 是RabbitMQ中最靈活的一種方式定欧,可以根據(jù)routing_key自由的綁定不同的隊(duì)列

首先對(duì)topic規(guī)則配置怒竿,這里使用兩個(gè)隊(duì)列來(lái)測(cè)試

@ConfigurationpublicclassTopicRabbitConfig{finalstaticString message ="topic.message";finalstaticString messages ="topic.messages";@Beanpublic Queue queueMessage(){returnnewQueue(TopicRabbitConfig.message);? ? }@Beanpublic Queue queueMessages(){returnnewQueue(TopicRabbitConfig.messages);? ? }@BeanTopicExchange exchange(){returnnewTopicExchange("exchange");? ? }@BeanBinding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange){returnBindingBuilder.bind(queueMessage).to(exchange).with("topic.message");? ? }@BeanBinding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange){returnBindingBuilder.bind(queueMessages).to(exchange).with("topic.#");? ? }}

使用queueMessages同時(shí)匹配兩個(gè)隊(duì)列耕驰,queueMessage只匹配"topic.message"隊(duì)列

public void send1(){? ? String context ="hi, i am message 1";? ? System.out.println("Sender : "+ context);this.rabbitTemplate.convertAndSend("exchange","topic.message", context);}public void send2(){? ? String context ="hi, i am messages 2";? ? System.out.println("Sender : "+ context);this.rabbitTemplate.convertAndSend("exchange","topic.messages", context);}

發(fā)送send1會(huì)匹配到topic.#和topic.message 兩個(gè)Receiver都可以收到消息,發(fā)送send2只有topic.#可以匹配所有只有Receiver2監(jiān)聽(tīng)到消息

Fanout Exchange

Fanout 就是我們熟悉的廣播模式或者訂閱模式饭弓,給Fanout交換機(jī)發(fā)送消息媒抠,綁定了這個(gè)交換機(jī)的所有隊(duì)列都收到這個(gè)消息。

Fanout 相關(guān)配置

@ConfigurationpublicclassFanoutRabbitConfig{@Beanpublic Queue AMessage(){returnnewQueue("fanout.A");? ? }@Beanpublic Queue BMessage(){returnnewQueue("fanout.B");? ? }@Beanpublic Queue CMessage(){returnnewQueue("fanout.C");? ? }@BeanFanoutExchange fanoutExchange(){returnnewFanoutExchange("fanoutExchange");? ? }@BeanBinding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange){returnBindingBuilder.bind(AMessage).to(fanoutExchange);? ? }@BeanBinding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange){returnBindingBuilder.bind(BMessage).to(fanoutExchange);? ? }@BeanBinding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange){returnBindingBuilder.bind(CMessage).to(fanoutExchange);? ? }}

這里使用了A夫嗓、B冲秽、C三個(gè)隊(duì)列綁定到Fanout交換機(jī)上面,發(fā)送端的routing_key寫任何字符都會(huì)被忽略:

public void send(){? ? ? ? String context ="hi, fanout msg ";? ? ? ? System.out.println("Sender : "+ context);this.rabbitTemplate.convertAndSend("fanoutExchange","", context);}

結(jié)果如下:

Sender : hi, fanout msg

...

fanout Receiver B: hi, fanout msg

fanout Receiver A? : hi, fanout msg

fanout Receiver C: hi, fanout msg

結(jié)果說(shuō)明排霉,綁定到fanout交換機(jī)上面的隊(duì)列都收到了消息

上面所有的例子攻柠,代碼在這里

參考

RabbitMQ 使用參考

RabbitMQ:Spring 集成 RabbitMQ 與其概念,消息持久化瑰钮,ACK機(jī)制

作者:純潔的微笑

出處:http://www.ityouknow.com/

版權(quán)所有,歡迎保留原文鏈接進(jìn)行轉(zhuǎn)載:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末开睡,一起剝皮案震驚了整個(gè)濱河市苟耻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胁艰,老刑警劉巖智蝠,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異哮翘,居然都是意外死亡毛秘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門艰匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抹恳,“玉大人,你說(shuō)我怎么就攤上這事健霹∑柯欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵瞳别,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我祟敛,道長(zhǎng),這世上最難降的妖魔是什么跑揉? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任叼架,我火速辦了婚禮,結(jié)果婚禮上乖订,老公的妹妹穿的比我還像新娘具练。我一直安慰自己,他們只是感情好扛点,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眠饮,像睡著了一般铜邮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扔茅,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天秸苗,我揣著相機(jī)與錄音召娜,去河邊找鬼玖瘸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雅倒,可吹牛的內(nèi)容都是我干的攀芯。 我是一名探鬼主播屯断,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氧秘!你這毒婦竟也來(lái)了趴久?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灭忠,失蹤者是張志新(化名)和其女友劉穎座硕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映琳,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萨西,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谎脯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了持寄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咸产,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仲闽,到底是詐尸還是另有隱情,我是刑警寧澤屑彻,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布顶吮,位于F島的核電站,受9級(jí)特大地震影響搏恤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熟空,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掂咒。 院中可真熱鬧迈喉,春花似錦、人聲如沸孩革。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澈圈。三九已至瞬女,卻和暖如春努潘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疯坤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工压怠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜗顽。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓雨让,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親栖忠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸街,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • RabbitMQ 即一個(gè)消息隊(duì)列薛匪,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖蛋辈,消息分發(fā)的作用。 消息...
    彩虹之夢(mèng)閱讀 1,082評(píng)論 2 1
  • 來(lái)源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器冷溶。支持消息的持久化逞频、事務(wù)栋齿、擁塞控...
    jiangmo閱讀 10,344評(píng)論 2 34
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理瓦堵,服務(wù)發(fā)現(xiàn),斷路器菇用,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,869評(píng)論 2 11
  • 注:這份文檔是我和幾個(gè)朋友學(xué)習(xí)后一起完成的惋鸥。 目錄 RabbitMQ 概念 exchange交換機(jī)機(jī)制什么是交換機(jī)...
    Mooner_guo閱讀 32,918評(píng)論 8 97