柚子快報激活碼778899分享:rabbitmq
柚子快報激活碼778899分享:rabbitmq
1.消息服務(wù)概述、rabbitmq核心概念
????????????? 消息服務(wù)概述:
???????????????????? 大多數(shù)應(yīng)用中,可通過消息服務(wù)中間件來提升系統(tǒng)異步通信,擴展解耦能力
???????????????????? 兩個重要概念:消息代理(message broker)和目的地(destination)。當(dāng)消息發(fā)送者者發(fā)出消息后,將由消息代理接管,消息代理保證將消息傳遞至目的地
???????????????????? 兩種形式的目的地:
??????????????????????????? 隊列(queue):點對點的消息通信(point-to-point)
??????????????????????????? 主題(topic):發(fā)布(publish)/訂閱(subscribe)的消息通信
???????????????????? 點對點式:消息發(fā)送者發(fā)送消息,消息代理將消息放在一個隊列中,消息接收者從隊列中獲取內(nèi)容,消息讀取后移除隊列。消息只有唯一的發(fā)送者和接收者。但接收者并未說明只能有1個。
???????????????????? 發(fā)布訂閱式:發(fā)送者發(fā)送消息到主題,多個訂閱者(接收者)監(jiān)聽(訂閱)這個主題,會在消息到達時同時收到消息
???????????????????? 兩種消息代理規(guī)范:
??????????????????????????? JMS(Java-Message-Service)Java消息服務(wù):基于JVM消息代理的規(guī)范,ActiveMQ、HornetMQ是JMS實現(xiàn)
??????????????????????????? AMQP(Advanced Message Queuing Protocol)高級消息隊列協(xié)議:消息代理規(guī)范,兼容JMS,RabbitMQ是AMQP的實現(xiàn)
???????????????????? spring支持:spring提供了對JMS的支持,spring-rabbit提供可對AMQP的支持,需要ConnectionFactory的實現(xiàn)來連接消息代理,提供JmsTemplate、RabbitTemplate來發(fā)送消息,
????????????????????????????????????????? @JmsListenet、@RabbitListener在方法上監(jiān)聽消息代理發(fā)送的消息,@EnableJms、@EnableRabbit開啟支持
????????????? 消息服務(wù)可解決問題
???????????????????? 異步處理:
??????????????????????????? 示例場景:用戶注冊,注冊成功之后給用戶郵箱及短信發(fā)送注冊成功,注冊、發(fā)送郵件、發(fā)送短信分別耗時50ms
??????????????????????????? 串行模式:注冊->發(fā)送郵件->發(fā)送短信 共計耗時150ms
??????????????????????????? 并行模式:注冊->發(fā)送郵件、發(fā)送短信 共計耗時100ms
??????????????????????????? 分析優(yōu)化思路:郵件和短信只是一個通知,并非客戶端所必須的,因此注冊成功之后即可告知客戶端注冊成功,客戶端沒必要等著收到郵件和短信后才顯示注冊成功
??????????????????????????? 消息隊列:注冊->消息隊列->發(fā)送短信/發(fā)送郵件? 共計耗時55ms.
??????????????????????????? 引入消息隊列后,用戶響應(yīng)時間即 寫入數(shù)據(jù)庫的時間+寫入消息隊列的時間(可忽略不計)。
??????????????????????????? 引入消息隊列后,用戶響應(yīng)時間是串行模式的3倍,是并行模式的2倍
???????????????????? 應(yīng)用解耦
??????????????????????????? 場景:雙11購物節(jié),用戶下單后,訂單系統(tǒng)告知庫存系統(tǒng)
??????????????????????????? 傳統(tǒng)做法:訂單系統(tǒng)調(diào)用庫存系統(tǒng)的接口,但是此方法有缺點:一旦庫存系統(tǒng)出現(xiàn)故障,訂單就會失??;訂單系統(tǒng)和庫存系統(tǒng)高耦合
??????????????????????????? 引入消息隊列:用戶下單后,訂單系統(tǒng)完成持久化處理,將消息寫入消息隊列,返回用戶下單成功;庫存系統(tǒng)監(jiān)聽消息隊列,收到消息之后,進行庫存相關(guān)操作。就算庫存系統(tǒng)出現(xiàn)故障,消息隊列也會能保證消息的可靠推送,不會導(dǎo)致消息丟失。
???????????????????? 流量削峰:秒殺活動中應(yīng)用廣泛
??????????????????????????? 場景:秒殺活動,一般流量較大,導(dǎo)致應(yīng)用過大,解決此問題可引入消息隊列
??????????????????????????? 作用:控制活動人數(shù),超過一定閾值的訂單直接丟棄;緩解短時間的高流量壓垮應(yīng)用。
??????????????????????????? 流程:用戶發(fā)起請求后,將消息寫入消息隊列,如果消息隊列長度超過最大值,則直接拋棄用戶請求或跳轉(zhuǎn)到錯誤界面。秒殺業(yè)務(wù)系統(tǒng)監(jiān)聽消息隊列中的數(shù)據(jù),根據(jù)其做后續(xù)處理
????????????? rabbitmq概述
???????????????????? MQ(Message Queue):是一種分布式應(yīng)用程序的通信方法,是消費者-生產(chǎn)者模型的典型代表,
???????????????????? 生產(chǎn)者(producer)往消息隊列中不斷寫入消息,consumer則讀取或訂閱隊列的消息,這點和隊列類似,具有FIFO(先入先出)的特點
???????????????????? 消息隊列:在消息隊列模型中,可劃分為3個角色,Producer、Queue、Consumer
??????????????????????????? Producer:生產(chǎn)者,往消息隊列中添加數(shù)據(jù)的角色
??????????????????????????? Queue:隊列,為承載消息的容器。不是棧是因為想使消息先進先出,有序。棧是先進后出
??????????????????????????? Consumer:消費者,從消息隊列中獲取數(shù)據(jù)的角色
???????????????????? 理解消息隊列:
??????????????????????????? 例如用戶下單購買商品,商家將商品訂單發(fā)給快遞公司,快遞公司根據(jù)商品中買家的信息分發(fā)對應(yīng)的買家
??????????????????????????? 在上述過程中,商品作為消息,商家作為消息的生產(chǎn)者,快讀公司作為隊列,買家作為消費者。
??????????????????????????? 快遞公司根據(jù)包裹中買家的地址和電話鎖定買家。因此消息隊列中隊列和消費者也需要一個映射規(guī)則,實現(xiàn)Message和Consumer之間的路由
???????????????????? RabbitMQ基本概念
??????????????????????????? Mseeage:消息,包含消息頭(附屬配置信息)和消息體(消息實體內(nèi)容),消息體是不透明的,
????????????????????????????????????????? ?消息體是由一些可選屬性組成,包括路由鍵(routing-key)、優(yōu)先級(priority)、持久化存儲(delivery-mode)等
??????????????????????????? Publisher:消息生產(chǎn)者,向交換機發(fā)布信息的程序
??????????????????????????? Exchange:交換機,接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的消息隊列
?????????????????????????????????? 常見3種交換器:direct、fanout、topic
????????????????????????????????????????? direct:發(fā)布與訂閱,完全匹配
????????????????????????????????????????? fanout:廣播,所有訂閱該廣播的隊列都可以收到該消息
????????????????????????????????????????? topic:主題,規(guī)則匹配
??????????????????????????? Queue:消息隊列,保存消息直到發(fā)送給消費者。消息容器,也是消息的終點,一個消息可投入一個或多個消息隊列,消息一直在隊列中,直到消費者將消息取走。
??????????????????????????? Binding:綁定,用于給Exchange和Queue建立關(guān)系,把交換機和消息隊列通過路由規(guī)則綁定起來,可以是多對多關(guān)系
??????????????????????????? Connection:網(wǎng)絡(luò)連接
??????????????????????????? Channel:信道,消息隊列和外部聯(lián)系都是通過信道。消息通過Channel塞進隊列或流出隊列。客戶端每個連接中,可有多個Channel。
????????????????????????????????????????? 因為系統(tǒng)中建立和銷毀TCP連接都是非常昂貴的開銷,因此引入信道,來復(fù)用一條TCP連接。
??????????????????????????? Consumer:消費者,從消息隊列中獲取消息的客戶端程序
??????????????????????????? Virtual Host:虛擬主機,表示一批交換器、消息隊列和相關(guān)對象。一個broker中可以有多個host,用作不同用戶的權(quán)限分離
??????????????????????????? Broker:消息隊列服務(wù)器實體,維護一條生產(chǎn)者到消費者的路線,保證數(shù)據(jù)從按照指定方式傳輸。
???????????????????? 通信過程:
??????????????????????????? 生產(chǎn)者(Producer)生產(chǎn)消息,消息通過Channel(信息)發(fā)送給Broker(服務(wù)器主體),Broker再分配給一個Exchange(交換機)
??????????????????????????? Exchange收到消息后,根據(jù)消息中的routingkey(路由鍵),將消息轉(zhuǎn)發(fā)給匹配的QUEUE(消息隊列)
??????????????????????????? QUEUE收到消息后,將消息通過Channel(信道)發(fā)送給消費者(Consumer)
??????????????????????????? Consumer收到消息后,發(fā)送ACK(確認標志)給消息隊列確認收到消息
??????????????????????????? Queue收到ACK后,刪除消息隊列中緩存的此條消息
??? 2.rabbitmq運行機制、rabbitmq支持的六種運行模式
????????????? rabbitmq運行機制
???????????????????? AMQP中消息的路由:
??????????????????????????? 過程和JMS存在一些差別,AMQP中引入了Exchange和Binging的概念
??????????????????????????? 生產(chǎn)者將消息發(fā)布道Exchange上,消息最終達到隊列并被消費者接收,Binding決定了交換器的消息應(yīng)該發(fā)送道那個隊列。
???????????????????? Exchange類型:
????????????????????????? 分發(fā)消息時,根據(jù)類型的不同分發(fā)策略有區(qū)別,目前共計4中:direct、fanout、topic、headers。headers和direct完全一致,但性能差很多,幾乎用不到。
??????????????????????????? Direct Exchange:消息中的路由鍵和Binding中的binding key一致(完全匹配),交換器就將消息發(fā)到對應(yīng)的隊列中。完全匹配,單播的模式
??????????????????????????? Fanout Exchange:每個發(fā)到Fanout Exchange上的消息都會分發(fā)到所有綁定的隊列上,不處理路由鍵,轉(zhuǎn)發(fā)消息最快
??????????????????????????? Topic Exchange:通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式匹配,此時隊列需要綁定再一個模式上。
????????????? RabbitMQ支持的消息類型
???????????????????? 直連模式:生產(chǎn)者-消息隊列-消費者
???????????????????? work queue工作模式:也成為Task Queues 任務(wù)模型。
??????????????????????????? 當(dāng)處理消息較多時,可能生產(chǎn)消息速度遠大于消費速度,消息隊列中消息會越積越多,無法及時處理,此時可使用work模型,讓多個消費者綁定道一個隊列,共同消費隊列中的主體。
??????????????????????????? 隊列中的消息一旦消費,就會消失,不會重復(fù)消費
??????????????????????????? 生產(chǎn)者-消息隊列-多個消費者
???????????????????? Publish/Subscribe 發(fā)布/訂閱模式 (廣播模式)
??????????????????????????? fanout 扇出,也稱廣播
??????????????????????????? 廣播模式中,消費發(fā)送流程是:可有多個消費者;每個消費者有自己的隊列;每個隊列都要綁定同一個交換機;
??????????????????????????? 生產(chǎn)者發(fā)送消息,只能發(fā)到交換機,交換機決定發(fā)到那個隊列,生產(chǎn)者無法決定
??????????????????????????? 交換機將消息發(fā)送給綁定的所有隊列
??????????????????????????? 隊列的消費者都能拿到消息,實現(xiàn)1個消息被多個消費者消費
??????????????????????????? 總結(jié):一個生產(chǎn)者綁定一個交換機,1個交換機綁定多個隊列,每個隊列都有對應(yīng)的消費者,有幾個消息隊列就有幾個消費者。
?????????????????????????????????? ? 從而實現(xiàn)交換機將消息發(fā)給所有消息隊列,1個消息被多個消費者接收
???????????????????? Routing 路由模式
??????????????????????????? Exchange類型為Direct,可實現(xiàn)不同消息被不同的隊列消費
??????????????????????????? 在direct 模型下,
??????????????????????????? 消息發(fā)送方向exchange發(fā)送消息時,必須指定消息的routingkey
??????????????????????????? exchange和隊列的綁定,不是任意綁定,而是指定一個routingkey(路由key),
??????????????????????????? exchange不再將消息平等地給每一個隊列,而是根據(jù)消息的routingkey進行判斷,只有隊列的routingkey和消息的routingkey完全一致,才會將消息給到指定隊列
??????????????????????????? 總結(jié):生產(chǎn)者向exchange發(fā)送消息指定routingkey,exchange收到消息后,將消息遞交給與routingkey完全匹配的隊列;每個隊列都有各自的消費者;每個消費者消費各自綁定隊列的消息
???????????????????? Topics模式
??????????????????????????? Exchange的類型為topic,可根據(jù)消息中的routingkey匹配道不同的隊列,區(qū)別在于routingkey綁定隊列時,可使用通配符進行模糊匹配。
??????????????????????????? 此模式routingkey一般由1個或多個單詞組成,單詞之間由于"."分隔。例如item.insert
??????????????????????????? 通配符:*(匹配1個詞),#(匹配1個或多個詞)
???????????????????? RPC模式
??????????????????????????? 客戶端遠程調(diào)用服務(wù)方法,使用MQ可以實現(xiàn)RPC的異步調(diào)用,基于Direct交換機實現(xiàn),流程如下:
??????????????????????????? 客戶端既是生產(chǎn)者又是消費者,向RPC請求隊列發(fā)送RPC調(diào)用消息,同時監(jiān)聽RPC響應(yīng)隊列
??????????????????????????? 服務(wù)端監(jiān)聽RPC請求隊列的消息,收到消息后執(zhí)行服務(wù)端的方法,得到方法返回的結(jié)果
??????????????????????????? 服務(wù)端將RPC方法返回的結(jié)果發(fā)送至RPC響應(yīng)隊列
??????????????????????????? 客戶端監(jiān)聽RPC響應(yīng)隊列,接收到RPC響應(yīng)結(jié)果
??? 3.springboot整合rabbitmq
????????????? 安裝rabbitmq
????????????? springboot整合rabbitmq
???????????????????? 目的(核心使用方法):使用RabbitTemplate發(fā)送和接收消息
???????????????????? 實現(xiàn)步驟r
??????????????????????????? 創(chuàng)建項目,引入spring for rabbitmq的依賴;
??????????????????????????? 創(chuàng)建RabbitAutoConfiguration 自動配置類,并配置自動連接工廠ConnectionFactory
??????????????????????????? 創(chuàng)建RabbitProperties配置類,封裝RabbitMQ的配置
??????????????????????????? RabbitTemplate給RabbitMQ發(fā)送和接收消息
??????????????????????????? 使用@RabbitListener和@EnableRabbit來監(jiān)聽消息隊列
??????????????????????????? AmqpAdmin是RabbitMQ系統(tǒng)管理功能組件(在代碼中創(chuàng)建交換機、消息隊列、綁定規(guī)則)
??? 4.rabbitmq-六種工作模式、springboot整合rabbitmq
????????????? rabbitmq入門程序
???????????????????? 發(fā)送端程序:創(chuàng)建連接,創(chuàng)建通道,聲明隊列,發(fā)送消息
???????????????????? 接收端程序:創(chuàng)建連接,創(chuàng)建通道,聲明隊列,監(jiān)聽隊列,接收消息
????????????? work queue工作模式
???????????????????? 兩個消費端共同消費同一個消息隊列中的數(shù)據(jù)
???????????????????? 應(yīng)用場景:對于任務(wù)較重或任務(wù)較多情況下,使用工作隊列可以提高任務(wù)處理速度
???????????????????? 實現(xiàn)關(guān)鍵:多個消費者監(jiān)聽同一個隊列,1條消息只會被1個消費者接收,rabbitmq采用輪詢方式將消息平均發(fā)給消費者,消費者處理完某條消息后,才會收到下條消息
????????????? Publish/Subscribe 發(fā)布訂閱模式
???????????????????? 每個消費者監(jiān)聽自己的隊列;生產(chǎn)者發(fā)送消息給broker后,由交換機將消息轉(zhuǎn)發(fā)到綁定此交換機的每個隊列,每個綁定交換機的隊列都可以接收到數(shù)據(jù)
?????? ????????????? 實現(xiàn)關(guān)鍵:交換機將消息發(fā)送給綁定交換機的所有消息隊列
????????????? Routing 路由模式
???????????????????? 每個消費者監(jiān)聽自己的隊列,并設(shè)置routingkey;生產(chǎn)者發(fā)送消息給交換機,交換機根據(jù)routingkey發(fā)送消息給指定的消息隊列,從而實現(xiàn)不同消費者消費不同的消息
???????????????????? 實現(xiàn)關(guān)鍵:交換機和隊列綁定指定路由鍵,發(fā)送消息時指定路由鍵,則發(fā)給指定的隊列。從而實現(xiàn)指定消費者消費發(fā)給指定隊列的消息
????????????? Topic模式
???????????????????? 每個消費者監(jiān)聽自己的隊列,并設(shè)置帶有通配符的routingkey;生產(chǎn)者發(fā)送消息給beoker,交換機根據(jù)routingkey發(fā)送消息給指定的消息隊列,從而實現(xiàn)不同消費者消費不同的消息
???????????????????? 實現(xiàn)關(guān)鍵:交換機給隊列綁定指定含通配符的路由鍵,發(fā)送消息時指定路由鍵,則發(fā)給指定的隊列,從而實現(xiàn)消費者消費發(fā)給指定隊列的消息
????????????? Header模式
???????????????????? 與routingkey區(qū)別在于,取消了routingkey,使用header中的key/value匹配隊列
???????????????????? 示例:根據(jù)用戶的通知設(shè)置去通知用戶,設(shè)置只接收email的用戶只接收email,只接收sms的用戶只接收sms。但是性能較低,故使用較少
????????????? RPC
???????????????????? 客戶端遠程調(diào)用方法,使用MQ可實現(xiàn)RPC的異步調(diào)用,基于Direct交換機實現(xiàn),流程如下:
???????????????????? 客戶端既是生產(chǎn)者又是消費者,向RPC請求隊列發(fā)送RPC調(diào)用消息,同時監(jiān)聽RPC響應(yīng)隊列
???????????????????? 服務(wù)端監(jiān)聽RPC請求隊列的消息,收到消息后執(zhí)行服務(wù)端的方法,得到方法返回的結(jié)果
???????????????????? 服務(wù)端將RPC方法返回的結(jié)果發(fā)送至RPC響應(yīng)隊列
???????????????????? 客戶端監(jiān)聽RPC響應(yīng)隊列,接收到RPC響應(yīng)結(jié)果
????????????? springboot整合rabbitmq
???????????????????? 創(chuàng)建rabbitmq配置類,類中定義隊列常量、交換機常量、路由鍵常量,聲明交換機、聲明隊列、綁定交換機和隊列
???????????????????? 啟動類添加注解@EnableRabbit開啟支持
???????????????????? 消息接收方法上使用@RabbitListener(queue={隊列名稱})監(jiān)聽指定隊列
柚子快報激活碼778899分享:rabbitmq
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。