自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

以Rabbit MQ為例講透消息隊(duì)列

譯文
開發(fā) 前端
本文向您簡(jiǎn)單介紹了消息隊(duì)列模型Rabbit MQ的基本特點(diǎn),并討論了不同類型的交換,可作為消息隊(duì)列的初學(xué)者指南。

【51CTO.com快譯】在早年的單體架構(gòu)時(shí)代,由于應(yīng)用程序的內(nèi)部組件存在著緊密的耦合關(guān)系,因此它們之間存在著千絲萬縷的直接關(guān)聯(lián)。例如,在一個(gè)簡(jiǎn)單的電子商務(wù)應(yīng)用中,其結(jié)帳服務(wù)需要與支付網(wǎng)關(guān)服務(wù)保持通信。這就得依靠TCP的直接連接來完成。由此,我們很容易碰到如下限制場(chǎng)景:

  • 一旦結(jié)帳消息被發(fā)出后,應(yīng)用需要能夠及時(shí)偵聽到,并予以答復(fù),方可繼續(xù)執(zhí)行下一個(gè)任務(wù)。
  • 如果庫(kù)存服務(wù)出現(xiàn)了故障,應(yīng)用將進(jìn)行反復(fù)嘗試,直至連接被成功建立為止。
  • 如果同時(shí)有大量的支付請(qǐng)求產(chǎn)生,庫(kù)存服務(wù)將由于供不應(yīng)求,而導(dǎo)致整個(gè)系統(tǒng)陷入癱瘓。

可以說,這些都是創(chuàng)建消息隊(duì)列和代理(message queues/brokers)的“剛需”。

什么是消息隊(duì)列

如下圖所示,消息隊(duì)列往往處于需要彼此通信的兩個(gè)服務(wù)之間:

通信服務(wù)的流程圖

如上圖所示,系統(tǒng)1通常作為生產(chǎn)者(producer)會(huì)將消息添加到隊(duì)列中,以便立即執(zhí)行下一個(gè)任務(wù)。

在準(zhǔn)備就緒后,系統(tǒng)2作為使用者(consumer)會(huì)從隊(duì)列中獲取消息,予以處理,并在完成后立即轉(zhuǎn)向下一條消息。據(jù)此,兩個(gè)應(yīng)用系統(tǒng)實(shí)現(xiàn)了邏輯上的解耦關(guān)系。

同時(shí),消息代理也有助于提高系統(tǒng)的可擴(kuò)展性。當(dāng)系統(tǒng)中有大量并發(fā)的“獲取”操作時(shí),隊(duì)列會(huì)出現(xiàn)擁堵,這就意味著我們需要提供更多的取出服務(wù)。那么在上述例子的系統(tǒng)2中,如果有多個(gè)使用者要從隊(duì)列中讀取內(nèi)容,以滿足由大量用戶的支付請(qǐng)求所產(chǎn)生的負(fù)載時(shí),應(yīng)用系統(tǒng)需要具一定的可擴(kuò)展能力。

此外,消息隊(duì)列的另一個(gè)好處是:隊(duì)列本身可以被構(gòu)建在計(jì)算機(jī)或服務(wù)器的內(nèi)部,以分擔(dān)Web應(yīng)用程序的某些工作,進(jìn)而提高系統(tǒng)的整體性能。

生產(chǎn)者和使用者的流程圖

不知您是否聽說過RabbitMQ?它是高級(jí)消息隊(duì)列協(xié)議(Advanced Message Queuing Protocol,AMQP)模型的實(shí)現(xiàn)。

在此類消息模型中,生產(chǎn)者會(huì)去獲取那些由服務(wù)產(chǎn)生的消息。就效率而言,與其我們直接產(chǎn)生一個(gè)消息隊(duì)列,不如產(chǎn)生消息的交換節(jié)點(diǎn)。而交換節(jié)點(diǎn)恰好可以像中轉(zhuǎn)郵局一樣,去接收所有的消息,然后根據(jù)它們的處理方式予以分發(fā)。

如上圖所示,一個(gè)交換節(jié)點(diǎn)可以連接多個(gè)隊(duì)列。在上面的例子中,使用者1、2、3在系統(tǒng)中扮演等待隊(duì)列連接的使用者。它們需要用到(consume)結(jié)帳服務(wù)。也就是說,在該流程中,結(jié)帳操作將發(fā)送一條消息給交換節(jié)點(diǎn)。而此類交換是通過各種綁定(bindings)被連接到不同的隊(duì)列上。當(dāng)然,我們可以通過綁定鍵(binding key),來引用這些綁定,以方便它們進(jìn)入應(yīng)用程序中使用者服務(wù)的子隊(duì)列。

生產(chǎn)者和交換的流程圖

我們之所以要采用消息這種方式,主要是利用其能夠在系統(tǒng)中按需移動(dòng)的靈活性。而這種靈活性在很大程度上,取決于可用于交換的不同類型。下面,讓我們來討論幾種常見的交換類型:

扇出交換(Fanout Exchange)

扇出交換是將消息路由到與其綁定的所有隊(duì)列,同時(shí)忽略其路由鍵。如果我們將N個(gè)隊(duì)列綁定至扇出交換,那么在有新的消息被發(fā)布到該交換處時(shí),此消息的副本將會(huì)被傳遞到所有N個(gè)隊(duì)列中。

簡(jiǎn)而言之,生產(chǎn)者產(chǎn)生待交換的消息,而交換會(huì)在收到該消息后予以復(fù)制,并將其發(fā)送到自己知曉的每個(gè)隊(duì)列處。可見,扇出交換是對(duì)消息進(jìn)行廣播路由的理想選擇。

扇出交換

直接交換(Direct Exchange)

作為消息單播路由的理想選擇,直接交換會(huì)基于消息路由密鑰(message routing key),將消息傳遞到隊(duì)列處。

簡(jiǎn)而言之,生產(chǎn)者產(chǎn)生待交換的消息。該消息帶有對(duì)應(yīng)的路由密鑰信息。交換會(huì)將路由密鑰與已綁定密鑰進(jìn)行比較,如果完全匹配的話,消息則會(huì)被轉(zhuǎn)移至相應(yīng)地系統(tǒng)中。 


直接交換

主題交換(Topic Exchange)

我們事先會(huì)將隊(duì)列綁定到交換主題的模式上,然后將其與消息路由鍵進(jìn)行匹配,進(jìn)而將不同的消息分別路由到一個(gè)或多個(gè)隊(duì)列處。

簡(jiǎn)而言之,通過主題交換,我們可以在路由鍵和綁定鍵之間進(jìn)行部分匹配。因此,該交換通常被用于消息的多播路由。

主題交流

頭部交換(Header Exchange)

頭部交換并不關(guān)注路由鍵的屬性,而是根據(jù)不同的消息頭部值,將各種消息路由到相應(yīng)的隊(duì)列中。

簡(jiǎn)而言之,路由密鑰會(huì)被完全忽略,而消息會(huì)根據(jù)其頭部值在系統(tǒng)中移動(dòng)。

標(biāo)頭交換

默認(rèn)交換(Default Exchange)

默認(rèn)交換是一種由代理(broker)預(yù)先聲明的不帶名稱(即:空字符串)的直接交換方式。簡(jiǎn)而言之,消息的路由鍵與隊(duì)列的名稱是聯(lián)系在一起的。

由于每個(gè)被創(chuàng)建的隊(duì)列都會(huì)使用與隊(duì)列名稱相同的路由鍵,來自動(dòng)綁定到正確的隊(duì)列上,因此它對(duì)于簡(jiǎn)單的應(yīng)用而言,非常實(shí)用。

默認(rèn)交換

除了上述五種靈活的交換類型,Rabbit MQ的優(yōu)點(diǎn)還包括:云計(jì)算友好、容錯(cuò)能力、跨語(yǔ)言能力、通信安全性、消息確認(rèn)能力、以及開源等特點(diǎn)。

原文標(biāo)題:Message Queue (Rabbit MQ): A Beginners IntroductionMessage Queue (Rabbit MQ): A Beginners Introduction,作者: Vijay Thakare

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2019-08-23 12:12:49

MQ消息隊(duì)列

2020-07-30 08:03:36

MQ死信隊(duì)列

2021-08-02 09:50:47

Vetur源碼SMART

2009-08-06 16:21:09

點(diǎn)對(duì)點(diǎn)消息隊(duì)列

2019-10-22 08:12:49

消息隊(duì)列分布式系統(tǒng)

2016-12-20 12:34:46

存儲(chǔ)MySQL流程

2018-08-22 16:40:51

前端JavascriptVue

2017-10-11 15:08:28

消息隊(duì)列常見

2011-07-08 09:55:02

數(shù)據(jù)中心防震

2024-07-16 18:05:19

延遲隊(duì)列MQRabbitMQ

2021-04-20 08:32:51

消息MQ隊(duì)列

2020-03-26 09:18:54

高薪本質(zhì)因素

2022-02-14 14:28:57

驅(qū)動(dòng)開發(fā)鴻蒙系統(tǒng)

2021-04-16 08:20:00

Flink CEP直播監(jiān)控

2020-03-12 09:02:34

數(shù)據(jù)思維統(tǒng)計(jì)學(xué)大數(shù)據(jù)

2022-01-10 12:23:00

TypeScript ESLint前端

2009-03-02 16:57:34

LinuxUbuntu配置完全方案

2021-01-14 09:00:00

開發(fā)FedoraUbuntu

2009-06-14 17:18:55

ibmdwWebSphereMQ

2023-06-29 10:10:06

Rocket MQ消息中間件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)