精品国产高清不卡毛片,亚洲综合色一区二区三区小说,日日夜夜天天久久,久久受www免费人成_看片中文,色噜噜狠狠一区二区

envelope怎么讀(halt怎么讀)

前言

本文講述的只是主要是RabbitMQ的入門(mén)知識,學(xué)習本文主要可以掌握以下知識點(diǎn):

MQ 的發(fā)展史AMQP 協(xié)議Rabbit MQ 的安裝Rabbit MQ 在 Java API 中的使用RabbitMQ 與 SpringBoot 的集成

MQ 的誕生歷史

大部分技術(shù)的剛產(chǎn)生時(shí)適用范圍都是特定的。比如互聯(lián)網(wǎng)的產(chǎn)生,剛開(kāi)始出現的通信協(xié)議各個(gè)產(chǎn)商之間是無(wú)法兼容的,隨著(zhù)歷史的發(fā)展,產(chǎn)生了業(yè)內的通信標準tcp/ip協(xié)議,而MQ也是一樣,第一款MQ類(lèi)軟件是由一個(gè)在美國印度人Vivek Ranadive創(chuàng )辦的一家公司Teknekron,并實(shí)現了世界上第一個(gè)消息中間件The Information Bus(TIB)。

隨著(zhù)第一款MQ類(lèi)軟件TIB的誕生,各大廠(chǎng)商立刻跟進(jìn),百花爭鳴,涌現了一批MQ類(lèi)軟件,比如IBM開(kāi)發(fā)的IBM Wesphere,微軟開(kāi)發(fā)的MSMQ等等,但是正因為標準不統一,這就給我們使用者帶來(lái)了很大的不便,每次切換MQ時(shí)都需要重復去實(shí)現不同的協(xié)議和不同API的調用。

2001年,Java語(yǔ)言的老東家Sun公司發(fā)布了一個(gè)JMS規范,其在各大產(chǎn)商的MQ上進(jìn)行了統一封裝,使用者如果需要使用不同的MQ只需要選擇不同的驅動(dòng)就可以了(和我們使用數據庫驅動(dòng)一個(gè)道理)。JMS規范雖然統一了標準,但是JMS規范卻有一個(gè)很大的缺陷就是它是和Java語(yǔ)言進(jìn)行綁定的,所以依然沒(méi)有從根本上解決問(wèn)題。

2004年,AMQP規范出現了,真正做到了跨語(yǔ)言和跨平臺,自此MQ迎來(lái)了發(fā)展的黃金時(shí)代。

2007年,Rabbit公司基于A(yíng)MQP規范開(kāi)發(fā)出了一款消息隊列RabbmitMQ。很快的,RabbitMQ就得到了大家的喜愛(ài),被用戶(hù)廣泛使用。

什么是 MQ

MQ即:Message Queue,稱(chēng)之為消息隊列或者消息中間件。MQ的本質(zhì)是:使用高效可靠的消息傳遞機制來(lái)進(jìn)行與平臺無(wú)關(guān)的數據傳遞,并基于數據通信來(lái)進(jìn)行分布式系統的集成。也就是說(shuō)MQ主要是用來(lái)解決消息的通信問(wèn)題,其主要有以下三個(gè)特點(diǎn):

1、MQ是一個(gè)獨立運行的服務(wù)。通過(guò)生產(chǎn)者來(lái)發(fā)送消息,使用消費者來(lái)接收消費。2、內部采用了隊列來(lái)進(jìn)行消息存儲,一般采用的均是先進(jìn)先出(FIFO)隊列。3、具有發(fā)布訂閱的模型,消費者可以根據需要來(lái)獲取自己想要的消息。

為什么需要 MQ

以Java語(yǔ)言為例,JDK本身就提供了許多不同類(lèi)型的隊列,那么為什么還需要用MQ呢?這是因為:

1、跨語(yǔ)言。各大編程語(yǔ)言?xún)炔繉?shí)現的隊列是和語(yǔ)言綁定的,而且是單機的,在分布式環(huán)境下無(wú)法很好的工作,所以我們需要可以單獨部署不依賴(lài)于語(yǔ)言的MQ。2、異步解耦。消息隊列可以實(shí)現異步通信,這樣發(fā)送消息方只需要關(guān)心消息是否發(fā)送成功,而接受消息方只需要關(guān)心怎么處理隊列中的消息,實(shí)現了消費和生產(chǎn)者的解耦。3、流量削峰。因為消息隊列是先進(jìn)先出,所以如果把需要消費的消息放進(jìn)隊列,那么消費者就可以避免被瞬間大流量擊垮,而是可以從容的根據自己的能力從隊列中取出消息進(jìn)行消費。

RabbitMQ

RabbitMQ中的Rabbit是兔子的意思,就是形容跑的和兔子一樣快。其是一款輕量級的,支持多種消息傳遞協(xié)議的高可用的消息隊列。RabbitMQ是由Erlang語(yǔ)言編寫(xiě)的,而Erlang語(yǔ)言就是一款天生適合高并發(fā)的語(yǔ)言。

RabbitMQ 的優(yōu)勢和特性

RabbitMQ作為一款非常流行的消息中間件,其有著(zhù)非常豐富的特性和優(yōu)勢:

高可靠性:RabbitMQ提供了持久化、發(fā)送應答、發(fā)布確認等功能來(lái)保證其可靠性。靈活的路由:通過(guò)不同的交換機(Exchange)來(lái)實(shí)現了消息的靈活路由。集群與擴展性:多個(gè)節點(diǎn)可以組成一個(gè)邏輯上的服務(wù)器,支持負載。高可用性:通過(guò)鏡像隊列實(shí)現了隊列中數據的復制,保證了在極端情況下部分節點(diǎn)出現crash整個(gè)集群仍然可用。支持多種協(xié)議:RabbitMQ最初是為了支持AMQP協(xié)議而開(kāi)發(fā)的,所以AMQP是其核心協(xié)議,但是其也支持其他如:STOMP,MOTT,HTTP等協(xié)議。支持多客戶(hù)端:RabbitMQ幾乎支持所有常用語(yǔ)言客戶(hù)端,如:Java,Python,Ruby,Go等。豐富的插件系統:支持各種豐富的插件擴展,同時(shí)也支持自定義插件。比如最常用的RabbitMQ后臺管理系統就是以插件的形式實(shí)現的。

AMQP 模型

AMQP 全稱(chēng)是:Advanced Message Queuing Protocol。RabitMQ最核心的協(xié)議就是基于A(yíng)MQP模型的AMQP協(xié)議,AMQP模型目前最新的版本是1.0版本,但是目前官方推薦使用者的最佳版本仍是基于0.9.1版本的AMQP模型,0.9.1版本在RabbitMQ官網(wǎng)中也將其稱(chēng)之為AMQP 0-9-1模型。

AMQP 0-9-1(高級消息隊列協(xié)議)是一種消息傳遞協(xié)議,它允許符合標準的客戶(hù)端應用程序與符合標準的消息傳遞中間件代理進(jìn)行通信。消息傳遞代理(Broker)從發(fā)布者(Publisher,即發(fā)布消息的應用程序,也稱(chēng)為生產(chǎn)者:Producter)接收消息,并將其路由到使用者(消費者:Consumer,即處理消息的應用程序)。

AMQP 0-9-1模型的核心思想為:消息被發(fā)布到交換處,通常被比作郵局或郵箱。然后,交換機使用稱(chēng)為綁定的規則將消息副本分發(fā)到隊列。然后,代理將消息傳遞給訂閱了隊列的使用者,或者使用者根據需要從隊列中獲取/提取消息。

下圖就是一個(gè)AMQP模型簡(jiǎn)圖,理解了這幅圖,那么就基本理解了RabbitMQ的工作模式。

Producer 和 Consumer

Producer即生產(chǎn)者,一般指的是應用程序客戶(hù)端,生產(chǎn)者會(huì )產(chǎn)生消息發(fā)送給RabbitMQ,等待消費者進(jìn)行處理。

Consumer即消費者,消費者會(huì )從特定的隊列中取出消息,進(jìn)行消費。當消息傳遞給消費者時(shí),消費者會(huì )自動(dòng)通知Broker,Broker只有在收到關(guān)于該消息的通知時(shí)才會(huì )從隊列中完全刪除該消息。

Connection:我是一個(gè) TCP 長(cháng)連接

生產(chǎn)者發(fā)送消息和消費者接收消息之前都必須要和Broker建立一個(gè)tcp長(cháng)連接,才能進(jìn)行通信。

Channel:我是被虛構出來(lái)的

消息隊列的作用之一就是用來(lái)做削峰,所以消息隊列在高并發(fā)場(chǎng)景可能會(huì )有大量的生產(chǎn)者和消費者,那么假如每一個(gè)生產(chǎn)者在發(fā)送消息時(shí)或者每一個(gè)消費者在消費消息時(shí)都需要不斷的創(chuàng )建和銷(xiāo)毀tcp連接,那么這對Broker會(huì )是一個(gè)很大的消耗,為了降低這個(gè)tcp連接的創(chuàng )建頻率,AMQP模型引入了Channel(通道或者信道)。

Channel是一個(gè)虛擬的的連接,可以被認為是輕量級的連接,其共享同一個(gè)tcp連接。在同一個(gè)tcp長(cháng)連接里面可以通過(guò)創(chuàng )建和銷(xiāo)毀不同的Channel來(lái)減少了創(chuàng )建和銷(xiāo)毀tcp連接的頻率,從而大大減少了資源的消耗。

客戶(hù)端(生產(chǎn)者/消費者)執行的每個(gè)協(xié)議操作都發(fā)生在通道上。特定Channel上的通信完全獨立于另一個(gè)Channel上的通信,因此每個(gè)協(xié)議方法還攜帶一個(gè)Channel ID(又稱(chēng)通道號)。

Channel只存在于連接的上下文中,不會(huì )獨立存在,所以當一個(gè)tcp連接被關(guān)閉時(shí),其中所有Channel也都會(huì )被關(guān)閉。

Channel是線(xiàn)程不安全的,所以對于使用多個(gè)線(xiàn)程/進(jìn)程進(jìn)行處理的應用程序,需要為每個(gè)線(xiàn)程/進(jìn)程創(chuàng )建一個(gè)Channel,而不是共享同一個(gè)Channel。

Broker:我只是一個(gè)普通的代理商

Broker直接翻譯成中文就是:中介/代理,所以如果我們使用的是RabbitMQ,那么這個(gè)Broker就是指的RabbitMQ服務(wù)端。

Exchange:我只是做一個(gè)消息的映射

Echange即交換機,因為要實(shí)現生產(chǎn)者和消費者的多對多關(guān)系,所以只有一個(gè)隊列是無(wú)法滿(mǎn)足要求的,那么如果有多個(gè)隊列,每次我們發(fā)送的消息應該存儲到哪里呢?交換機就是起到了中間角色的作用,我們發(fā)送消息到交換機上,然后通過(guò)交換機發(fā)送到對應的隊列,交換機和隊列之間需要提前綁定好對應關(guān)系,這樣消息就到了各自指定的隊列內,然后消費者就可以直接從各自負責的隊列內取出消息進(jìn)行消費。

Queue:我才是真正存儲消息的地方

消息發(fā)送到Broker之后,通過(guò)交換機的映射,存儲到指定的Queue里面。

VHost:我只是一個(gè)命名空間而已

VHost類(lèi)似于命名空間,主要作用就是用來(lái)隔離數據的,比如我們由很多個(gè)業(yè)務(wù)系統都需要用到RabbitMQ,如果是一臺服務(wù)器完全可以滿(mǎn)足要求,那就沒(méi)必要安裝多個(gè)RabbitMQ了,這時(shí)候就可以定義不同的VHost,不同的VHost就可以實(shí)現各個(gè)業(yè)務(wù)系統間的數據隔離。

RabbitMQ 的安裝

RabbitMQ是用Erlang語(yǔ)言開(kāi)發(fā)的,所以在安裝RabbitMQ之前,需要先安裝Erlang,RabbitMQ和Erlang之間有版本對應關(guān)系,這個(gè)需要注意,本文以Erlang 21.3和RabbitMQ3.8.4為例進(jìn)行安裝 。

安裝Erlang:yum -y install gcc glibc-develmakencurses-devel openssl-devel xmlto perl wget//提前安裝一些依賴(lài),個(gè)人電腦依賴(lài)不同,可根據實(shí)際情況選擇未安裝的依賴(lài)進(jìn)行安裝wget http://erlang.org/download/otp_src_21.3.tar.gz 下載(也可以下載好傳到服務(wù)器)tar -xvf otp_src_21.3.tar.gz//解壓mkdir erlang//在指定目錄,如/usr/local下創(chuàng )建erlang目錄cd otp_src_21.3//切換到解壓后的目錄./configure --prefix=/usr/local/erlang//編譯(路徑根據實(shí)際情況選擇)make

上一篇:

下一篇:

? 推薦閱讀

分享
精品国产高清不卡毛片,亚洲综合色一区二区三区小说,日日夜夜天天久久,久久受www免费人成_看片中文,色噜噜狠狠一区二区