真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

RabbitMQ如何高效部署分布式消息隊(duì)列

這篇文章將為大家詳細(xì)講解有關(guān)RabbitMQ如何高效部署分布式消息隊(duì)列,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、通城ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的通城網(wǎng)站制作公司

一、天降奇兵

1.消息隊(duì)列使用消息將應(yīng)用程序連接起來(lái)。這些消息通過(guò)像RabbitMQ這樣的消息代理服務(wù)器在應(yīng)用程序之間路由

2.RabbitMQ優(yōu)勢(shì):

  • 除Qpid外,唯一實(shí)現(xiàn)了AMQP標(biāo)準(zhǔn)的代理服務(wù)器

  • 由于Erlang,RabbitMQ集群不可思議的簡(jiǎn)單

  • 比其他更可靠,更能防止崩潰

3.檢查服務(wù)器狀態(tài):rabbitmqctl status

二、理解消息通信

A.消費(fèi)者和生產(chǎn)者

1.RabbitMQ不是快餐車(chē)而是消息投遞服務(wù),在應(yīng)用程序和服務(wù)器之間扮演著路由器的角色

2.生產(chǎn)者(producer)創(chuàng)建消息,然后發(fā)布(發(fā)送)到代理服務(wù)器(RabbitMQ)。消息包含有效載荷(payload)和標(biāo)簽(label)

  • 有效載荷就是你要傳輸?shù)臄?shù)據(jù),可以是任何內(nèi)容

  • 標(biāo)簽描述了有效載荷,并用它來(lái)決定誰(shuí)將獲得消息的拷貝

3.消息者,連接到代理服務(wù)器上,并訂閱到隊(duì)列(queue)上,當(dāng)消費(fèi)者接收到消息時(shí),它只得到消息的一部分:有效載荷

4.生產(chǎn)者創(chuàng)建消息,消費(fèi)者接收這些消息。應(yīng)用程序可以作為生產(chǎn)者,向其他應(yīng)用程序發(fā)送消息。或者作為一個(gè)消費(fèi)者,接收消息。也可以在兩者之間進(jìn)行切換。不過(guò)必須先建立一條信道(channel)

5.在應(yīng)用程序和Rabbit代理服務(wù)器之間創(chuàng)建一條TCP連接。一旦TCP連接找開(kāi)(通過(guò)了認(rèn)證),應(yīng)用程序就可以創(chuàng)建一條AMQP信道。信道是建立在“真實(shí)的”TCP連接內(nèi)的虛擬連接,每條信道都會(huì)被指派一個(gè)唯一ID

B.從底部開(kāi)始構(gòu)造:隊(duì)列

1.AMQP消息路由必須有三部分:交換器、隊(duì)列和綁定

  • 生產(chǎn)者把消息發(fā)布到交換器上;消息最終到達(dá)隊(duì)列,并被消費(fèi)者接收;綁定決定了消息如何從路由器路由到特定的隊(duì)列

2.隊(duì)列就如同具名郵箱,消息最終達(dá)到隊(duì)列中并等待消費(fèi),消費(fèi)者通過(guò)以下兩種方式從特定隊(duì)列中接收消息:

  • 通過(guò)AMQP的basic.consume命令訂閱:如果消費(fèi)者處理隊(duì)列消息,并且/或者需要在消息一到達(dá)隊(duì)列時(shí)就自動(dòng)接收的話(huà),應(yīng)該使用這個(gè)命令

  • basic.get命令:會(huì)訂閱消息,獲得單條消息,然后取消訂閱,不要放在一個(gè)循環(huán)中來(lái)代替basic.consume,會(huì)影響性能

3.當(dāng)Rabbit隊(duì)列擁有多個(gè)消費(fèi)者時(shí),隊(duì)列收到的消息將以循環(huán)(round-robin)的方式發(fā)送給消費(fèi)者,每條消息只會(huì)發(fā)送給一個(gè)訂閱的消費(fèi)者

4.消費(fèi)者必須通過(guò)AMQP的basic.ack顯示地向RabbitMQ發(fā)送一個(gè)確認(rèn),或者在訂閱到隊(duì)列的時(shí)候就將auto_ack參數(shù)設(shè)置為true。消費(fèi)者對(duì)消息的確認(rèn)和告訴生產(chǎn)者消息已經(jīng)被接收了這兩件事毫不相關(guān)。消費(fèi)者通過(guò)確認(rèn)命令告訴RabbitMQ它已經(jīng)正確地接收了消息,同時(shí)RabbitMQ才能安全地把消息從隊(duì)列中刪除

5.如果消費(fèi)者收到一條消息,然后確認(rèn)之前從Rabbit斷開(kāi)連接(或者從隊(duì)列上取消訂閱),RabbitMQ會(huì)認(rèn)為這條消息沒(méi)有分發(fā),然后重新分發(fā)給下一個(gè)訂閱的消費(fèi)者

6.拒絕消息:

  • 把消費(fèi)者從RabbitMQ服務(wù)器斷開(kāi)連接:會(huì)導(dǎo)致RabbitMQ自動(dòng)重新把消息入隊(duì)并發(fā)送給另一個(gè)消費(fèi)者,缺點(diǎn)是連接/斷開(kāi)連接的方式會(huì)額外增加RabbitMQ的負(fù)擔(dān)

  • RabbitMQ2.0.0以上版本可以使用AMQP的basic.reject命令

7.消費(fèi)者和生產(chǎn)者都能使用AMQP的queue.declare命令來(lái)創(chuàng)建隊(duì)列

  • 如果消費(fèi)者在同一條信道上訂閱了一另一個(gè)隊(duì)列的話(huà),就無(wú)法再聲明隊(duì)列了,必須先取消訂閱并將信道置為“傳輸”模式

  • 消費(fèi)者訂閱隊(duì)列時(shí)需要隊(duì)列名稱(chēng),并在創(chuàng)建綁定時(shí)也需要指定隊(duì)列名稱(chēng)

  • exclusive:如果設(shè)置為true,隊(duì)列變成私有的,只有自己的應(yīng)用程序才能消費(fèi)隊(duì)列

  • auto-delete:當(dāng)最后一個(gè)消費(fèi)者取消訂閱的時(shí)候,隊(duì)列就會(huì)自動(dòng)移除

  • passive:設(shè)置為true后,如果隊(duì)列存在,queue.declare就會(huì)成功返回;如果不存在,會(huì)返回錯(cuò)誤

8.如果不能承擔(dān)得起消息進(jìn)入“黑洞”而丟失的話(huà),生產(chǎn)者和消費(fèi)者都應(yīng)該嘗試去創(chuàng)建隊(duì)列;否則可以只讓消費(fèi)者來(lái)聲明隊(duì)列

C.聯(lián)合起來(lái):交換器和綁定

1.當(dāng)你把消息發(fā)送到代理服務(wù)器時(shí),消息將擁有一個(gè)路由鍵——即使是空的——RabbitMQ也會(huì)將其和綁定使用的路由鍵進(jìn)行匹配。如果相匹配的話(huà),那么消息將會(huì)投遞到該隊(duì)列。如果不匹配任何綁定模式的話(huà),消息將進(jìn)入“黑洞”

2.交換器和綁定可以完成不同的使用場(chǎng)景;對(duì)于發(fā)送消息給服務(wù)器的發(fā)布者,不需要關(guān)心服務(wù)器另一端(整個(gè)消息處理環(huán)節(jié)中的隊(duì)列和消費(fèi)者)的邏輯

3.處理投遞到多個(gè)隊(duì)列的協(xié)議:

  • direct交換器:如果路由鍵匹配的話(huà),消息就投遞到對(duì)應(yīng)的隊(duì)列。服務(wù)器必須實(shí)現(xiàn)direct類(lèi)型交換器,包含一個(gè)空白字符串名稱(chēng)的默認(rèn)交換器。當(dāng)聲明一個(gè)隊(duì)列時(shí),它會(huì)自動(dòng) 綁定到默認(rèn)交換器,并以聊表名稱(chēng)作為路由鍵 $channel->basic_publish(消息內(nèi)容,默認(rèn)交換器,路由鍵)

  • fanout交換器:會(huì)將收到的消息廣播到綁定的隊(duì)列上,當(dāng)發(fā)送一條消息到fanout交換器時(shí),會(huì)把消息投遞給所有附加在此交換器上的隊(duì)列

  • topic交換器:使得來(lái)自不同源頭的消息能夠到達(dá)同一個(gè)隊(duì)列

D.多租戶(hù)模式:虛擬主機(jī)和隔離

1.每一個(gè)RabbitMQ服務(wù)器都能創(chuàng)建虛擬消息服務(wù)器,稱(chēng)為虛擬機(jī)(vhost),每一個(gè)vhost本質(zhì)上是一個(gè)mini版的RabbitMQ服務(wù)器,擁有自己的隊(duì)列、交換器和綁定,以及權(quán)限機(jī)制

2.在Rabbit里創(chuàng)建一個(gè)用戶(hù)時(shí),用戶(hù)通常會(huì)被指派給至少一個(gè)vhost,并且只能訪(fǎng)問(wèn)被指派vhost內(nèi)的隊(duì)列、交換器和綁定,在設(shè)計(jì)消息通信架構(gòu)時(shí),記住vhost之間是絕對(duì)隔離的,在集群上創(chuàng)建vhost時(shí),整個(gè)集群都會(huì)創(chuàng)建該vhost

3.創(chuàng)建、刪除、查看:

  • rabbitmqctl add_vhost [vhost_name]

  • rabbitmqctl delete_vhost [vhost_name]

  • rabbitmqctl list_vhosts

E.持久化和策略

1.隊(duì)列和交換器的durable屬性設(shè)為true,決定RabbitMQ在崩潰或重啟之后重新創(chuàng)建隊(duì)列(或交換器)

2.消息想要從Rabbit崩潰中恢復(fù),必須:

  • 把它的投遞模式(delivery mode)選項(xiàng)設(shè)置為2(持久)

  • 發(fā)送到持久化的交換器

  • 到達(dá)持久化的隊(duì)列

3.確保持久性消息能恢復(fù)的方式是,將它們寫(xiě)入磁盤(pán)上的一個(gè)持久化日志文件,當(dāng)發(fā)布一條持久性消息到持久交換器上時(shí),Rabbit會(huì)在消息提交到日志文件后才發(fā)送響應(yīng),之后這條消息如果路由到了非持久隊(duì)列的話(huà),它會(huì)自動(dòng)從持久性日志中移除

4.持久性的劣勢(shì):性能變慢,內(nèi)建集群中工作得不好

5.對(duì)于關(guān)鍵消息使用持久化機(jī)制

6.AMQP事務(wù)會(huì)大大降低Rabbit的性能,Rabbit團(tuán)隊(duì)使用發(fā)送方確認(rèn)模式,將信道設(shè)置成confirm模式,是異步的

https://github.com/zhangyue0503/rabbitmq/tree/master/2

三、運(yùn)行和管理Rabbit

A.服務(wù)器管理

1.節(jié)點(diǎn):描述的是一個(gè)Erlang節(jié)點(diǎn)運(yùn)行著一個(gè)Erlang應(yīng)用程序,多個(gè)應(yīng)用程序可以運(yùn)行在同一個(gè)節(jié)點(diǎn)之上,RabbitMQ節(jié)點(diǎn)指的是RabbitMQ應(yīng)用程序和其所在的Erlang節(jié)點(diǎn)

2.rabbitmq-server 啟動(dòng);rabbitmqctl stop 關(guān)閉;

3.配置文件rabbitmq-config,vm_memory_high_watermark指定可消耗的內(nèi)存,十進(jìn)制數(shù)字,0.4表示為40%

B.請(qǐng)求許可

1.用戶(hù)相關(guān)命令:

  • rabbitmqctl add_user 用戶(hù)名 密碼

  • rabbitmqctl delete_user 用戶(hù)名

  • rabbitmqctl list_users

  • rabbitmqctl change_password 用戶(hù)名 新密碼

2.訪(fǎng)問(wèn)控制條目組成:被授予訪(fǎng)問(wèn)權(quán)限的用戶(hù)、權(quán)限控制應(yīng)用的vhost、需要授予的讀/寫(xiě)/配置權(quán)限的組合、權(quán)限范圍

3.訪(fǎng)問(wèn)控制條目是無(wú)法跨越vhost的

4.訪(fǎng)問(wèn)權(quán)限命令:

  • rabbitmqctl set_permissions -p [vhost] [user] "配置" "寫(xiě)" "讀",".*"匹配任何隊(duì)列和交換器,"check-.*"匹配以check-開(kāi)頭的隊(duì)列和交換器,""不匹配隊(duì)列和交換器

  • rabbitmqctl list_permissions -p [vhost] 驗(yàn)證權(quán)限是否正確

  • rabbitmqctl clear_permissions -p [vhost] [user]移除用戶(hù)在vhost上的權(quán)限

  • rabbitmqctl list_user_permissions [user]查看用戶(hù)在所有vhost上的權(quán)限

C.檢查

1.相關(guān)命令:

  • rabbitmqctl list_queues -p [vhost] [name名稱(chēng) messages消息數(shù)目 consumers消費(fèi)者數(shù)目 memory內(nèi)存使用等……]列出所有隊(duì)列及隊(duì)列里的消息數(shù)目

  • rabbitmqctl list_exchanges 查看交換器信息

  • rabbitmqctl list_bindings 查看綁定信息

2.日志

  • *-sasl.log,SASL(系統(tǒng)應(yīng)用程序支持庫(kù))是庫(kù)的集合,幫助開(kāi)發(fā)Erlang應(yīng)用時(shí),提供一系列標(biāo)準(zhǔn)

  • 輪換日志:rabbitmqctl rotate_logs shuffix,shuffix通常是數(shù)字,添加到被輪換日志文件的末尾

D.修復(fù)Rabbit:疑難解答

1.RabbitMQ使用Mnesia數(shù)據(jù)庫(kù)存儲(chǔ)隊(duì)列、交換器、綁定等信息

https://github.com/zhangyue0503/rabbitmq/tree/master/3

四、解決Rabbit相關(guān)問(wèn)題:編碼與模式

A.解耦

1.異步狀態(tài)思維(分離請(qǐng)求和動(dòng)作):接收請(qǐng)求->RabbitMQ->處理請(qǐng)求(入庫(kù))

2.自動(dòng)輪詢(xún)(round-robin)可代替負(fù)載均衡

3.零成本API:語(yǔ)言不應(yīng)成為枷鎖

4.如何將應(yīng)用切分?應(yīng)用程序的哪部分是訂單接收者,哪部分是訂單處理者?

B.發(fā)后即忘模型

1.創(chuàng)建了任務(wù),放置到交換器上,并讓你的應(yīng)用程序返回繼續(xù)工作

2.匹配該模式的兩種一般類(lèi)型的任務(wù):

批處理(batch processing):針對(duì)大型數(shù)據(jù)集合的工作或者轉(zhuǎn)換

通知(notifications):以發(fā)生事件的描述

3.RabbitMQ使用“.”作為標(biāo)記中不同部分的分隔符;no_ack=false告訴RabbitMQ要顯示確認(rèn)收到的消息,這將暫停從隊(duì)列發(fā)送新的消息過(guò)來(lái),直到收到的最后一條消息處理完成并發(fā)送確認(rèn)消息為止;

C.用RabbitMQ實(shí)現(xiàn)RPC并等待響應(yīng)

1.使用reply_to作為發(fā)布應(yīng)答消息的目的地,同時(shí)發(fā)布的時(shí)候無(wú)須指定交換器

2.exclusive=true,確保只有自己才能讀取隊(duì)列上的數(shù)據(jù);auto_delete,接收完消息后斷開(kāi)隊(duì)列的連接時(shí),Rabbit會(huì)自動(dòng)將隊(duì)列刪除

https://github.com/zhangyue0503/rabbitmq/tree/master/4

五、集群并處理失敗

A.集群架構(gòu)

1.集群只會(huì)在單個(gè)節(jié)點(diǎn)上而不是所有節(jié)點(diǎn)上創(chuàng)建完整的隊(duì)列信息(元數(shù)據(jù)、狀態(tài)、內(nèi)容)

2.交換器只是一個(gè)名稱(chēng)和一個(gè)隊(duì)列的綁定列表,信道才是真正的路由器

3.使用AMQP事務(wù),在消息路由到隊(duì)列之前會(huì)一直阻塞;或者使用發(fā)送方確認(rèn)(publisher confirm)模式來(lái)記錄連接中斷時(shí)尚未被確認(rèn)的消息。這兩種解決方案可以幫助在節(jié)點(diǎn)故障并且目的隊(duì)列不復(fù)存在時(shí)檢測(cè)到消息無(wú)法路由的情況

4.單節(jié)點(diǎn)必須是磁盤(pán)類(lèi)型節(jié)點(diǎn),否則一重啟所有配置信息都會(huì)丟失;集群允許只有一個(gè)節(jié)點(diǎn)是磁盤(pán)節(jié)點(diǎn),其他可以是內(nèi)存節(jié)點(diǎn),當(dāng)磁盤(pán)節(jié)點(diǎn)崩潰后,不能對(duì)隊(duì)列進(jìn)行操作;可以設(shè)置兩個(gè)磁盤(pán)節(jié)點(diǎn);添加內(nèi)在節(jié)點(diǎn)時(shí),需要確保告知所有的磁盤(pán)節(jié)點(diǎn);

B.單機(jī)集群

1.需要修改環(huán)境變量RABBITMQ_NODE_PORT和RABBITMQ_NODENAME,如RABBITMQ_NODE_PORT=5763和RABBITMQ_NODENAME=rabbit_1,然后rabbitmq-server -detached

2.rabbitmqctl -n rabbit_1@主機(jī)名 stop_app,然后再reset

3.rabbitmqctl -n rabbit_1@主機(jī)名 join_cluster rabbit@主機(jī)名

4.rabbitmqctl -n rabbit_1@主機(jī)名 start_app

5.rabbitmqctl cluster_status

6.-n表示指定節(jié)點(diǎn)而非默認(rèn)節(jié)點(diǎn)上執(zhí)行命令

C.將節(jié)點(diǎn)分布到更多的機(jī)器上

1.需要復(fù)制找到.erlang.cookie,復(fù)制其中的字符串到其他節(jié)點(diǎn)上,然后再進(jìn)行join_cluster

2.刪除節(jié)點(diǎn),直接通過(guò)reset命令

D.鏡像隊(duì)列和保留消息

1.鏡像隊(duì)列的主拷貝僅存在于一個(gè)節(jié)點(diǎn)(主隊(duì)列,master),在其他的集群上擁有從隊(duì)列(slave)拷貝

2.xa-ha-policy和xa-ha-policy-params

https://github.com/zhangyue0503/rabbitmq/tree/master/5

六、從故障中恢復(fù)

A.為Rabbit做負(fù)載均衡

1.當(dāng)為Rabbit添加負(fù)載均衡器時(shí),集群節(jié)點(diǎn)就作為負(fù)載均衡器背后的服務(wù)器,而你的生產(chǎn)者和消費(fèi)者就是客戶(hù),應(yīng)用程序只需知道負(fù)載均衡器的前端IP;負(fù)載均衡器會(huì)以最小的連接負(fù)載透明地將客戶(hù)端連接到集群節(jié)點(diǎn)

B.連接丟失和故障轉(zhuǎn)移

1.應(yīng)該總是將故障轉(zhuǎn)移視為連接到了一個(gè)完全 無(wú)關(guān)的RabbitMQ服務(wù)器,而不是有著共享狀態(tài)的集群節(jié)點(diǎn),不論節(jié)點(diǎn)故障什么時(shí)候發(fā)生,在檢測(cè)到故障并進(jìn)行重邊之后的首要任務(wù)是構(gòu)造交換器、隊(duì)列和綁定

七、warren和Shovel:故障轉(zhuǎn)移和復(fù)制

A.warren:另一種集群方式

1.一個(gè)warren是指一對(duì)主/備獨(dú)立服務(wù)器,并前置一臺(tái)負(fù)載均衡器來(lái)處理故障轉(zhuǎn)移。這是真正的無(wú)共享架構(gòu),主和備之間沒(méi)有協(xié)作。

B.遠(yuǎn)距離通信和復(fù)制

1.Shovel是RabbitMQ的一個(gè)插件,能夠定義RabbitMQ上的隊(duì)列和另一個(gè)RabbitMQ上的交換器之間的關(guān)系

2.安裝插件:rabbitmq-plugins enable rabbitmq_shovel

八、從Web端管理RabbitMQ

A.超越rabbitmqctl:RabbitMQ Management插件

1.rabbitmq-plugins enable rabbitmq_management,http://localhost:15672/mgmt/

2.rabbitmqadmin腳本:wget http://localhost:15672/cli/rabbitmqadmin

九、使用REST API控制Rabbit

1.http://localhost:15672/api,如http://localhost:15672/api/users

十、監(jiān)控

1.四種整型退出代碼:0-OK,1-WARNING,2-CRITICAL,3-UNKNOWN

十一、提升性能,保障安全

1.如果可以接受丟失消息,將delivery-mode設(shè)置為1,設(shè)置為2將持久化,消息寫(xiě)寫(xiě)到磁盤(pán)上,降低速度

2.no-ack為true,服務(wù)器會(huì)在消息發(fā)送給客戶(hù)端后自動(dòng)將其出隊(duì)

3.direct交換器和fanout交換器的差別在于后者在查詢(xún)r(jià)abbit_route表時(shí)忽略了路由鍵;topic交換器相比前兩者會(huì)占用更多的內(nèi)存

4.消息中的mandatory和immediate標(biāo)記為false的話(huà),會(huì)以異步方式投遞消息

5.RabbitMQ被優(yōu)化為盡可能快地向消費(fèi)者投遞消息,應(yīng)該盡可能讓隊(duì)列保持為空

6.如果隊(duì)列聲明中durable為true的話(huà),會(huì)在表rabbit_queue和rabbit_durable_queue添加隊(duì)列記錄,否則只會(huì)在rabbit_queue中存放記錄

十二、擴(kuò)展RabbitMQ

1.http://www.rabbitmq.com/plugins.html

2.插件啟用:rabbitmq-plugins enable xxxxx;移除插件:rabbitmq-plugins disable xxx

關(guān)于“RabbitMQ如何高效部署分布式消息隊(duì)列”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


網(wǎng)頁(yè)題目:RabbitMQ如何高效部署分布式消息隊(duì)列
文章源于:http://weahome.cn/article/psdegh.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部