更新時間:2021-12-14 09:53:50 來源:動力節(jié)點 瀏覽1509次
消息隊列的實際定義是一個用于進(jìn)程間通信的組件,它將控制、內(nèi)容或消息傳遞給另一個組件。
以另一種方式說明消息隊列,將其視為在您最喜歡的餐廳訂購。一線工作人員會為您點單,準(zhǔn)備您最喜歡的餐點。然后,前線工作人員向廚房請求您的食物。廚房接受訂單并制作食物。在這種情況下,收到指令并執(zhí)行觸發(fā)事件的操作 - 執(zhí)行 訂單、觸發(fā)請求、執(zhí)行操作。
在廚房為您制作食物時,一線工作人員不會等到食物出現(xiàn),他們會繼續(xù)接受其他顧客的訂單。廚房繼續(xù)通過訂單運作和處理。每個點都有自己的職責(zé),不會等待對方完成他們正在做的事情,也不受時間的限制。
現(xiàn)在您可能會想,“消息隊列到底適合我的架構(gòu)哪里”?簡單快捷的答案是:
由于同時請求過多,您會遇到“超時錯誤”。
您需要一種解耦方式在應(yīng)用程序之間或應(yīng)用程序內(nèi)進(jìn)行通信。
您輪詢數(shù)據(jù)存儲過于頻繁,并且您希望該數(shù)據(jù)存儲可用于回答符合條件的查詢
您需要在高峰時段擴大和縮小規(guī)模
換句話說,任何時候任務(wù)不是基本用戶事務(wù)的一部分,和/或結(jié)果不影響用戶響應(yīng),這對于消息隊列來說都是一項完美的工作。
消息隊列也可用于更高級的場景。例如,可以將基于 AMQP 的消息隊列(如 RabbitMQ)配置為根據(jù)規(guī)則和替代流程路由和分發(fā)消息。處理系統(tǒng)可能會花時間處理消息。當(dāng)業(yè)務(wù)和工作負(fù)載增長并且需要擴展系統(tǒng)的需求很明顯時,添加更多的消費者來處理隊列既快速又容易。
我們現(xiàn)在將解釋消息隊列可以帶來好處的情況。簡單地說,兩個明顯的例子可以作為消息隊列真正閃耀的例子:
對于長時間運行的進(jìn)程和后臺作業(yè)
作為微服務(wù)之間的中間人
當(dāng)請求花費大量時間時,合并消息隊列是完美的方案。
想象一個每秒處理多個請求并且在任何情況下都不會丟失一個請求的 Web 服務(wù)。此外,請求是通過耗時的過程處理的,但系統(tǒng)不能陷入困境。一些現(xiàn)實生活中的例子可能包括:
圖像縮放
發(fā)送大量/大量電子郵件
搜索引擎索引
文件掃描
視頻編碼
傳遞通知
PDF處理
計算
對于應(yīng)用程序內(nèi)部和應(yīng)用程序之間的通信和集成,即作為微服務(wù)之間的中間人,消息隊列也很有用。想象一個系統(tǒng),它需要通知系統(tǒng)的另一部分開始處理一項任務(wù),或者當(dāng)有大量請求同時進(jìn)入時,如下面的場景:
訂單處理(下訂單、更新訂單狀態(tài)、發(fā)送訂單、付款等)
送餐服務(wù)(下單、準(zhǔn)備訂單、送餐)
任何需要處理多個請求的 Web 服務(wù)
讓我們從公司需要縮放圖像的用例開始。
在房地產(chǎn)領(lǐng)域,經(jīng)紀(jì)人需要大量照片才能有效地推銷房產(chǎn)并吸引買家的眼球。通過該平臺,一旦經(jīng)紀(jì)人添加了該財產(chǎn)的新圖像,將其縮放到用戶友好大小的任務(wù)就交給了 RabbitMQ。消息隊列一直執(zhí)行圖像縮放任務(wù),直到消費者抓取它、縮放它,然后以新的有效尺寸將圖像發(fā)布到網(wǎng)站。
但是為什么要在這種情況下使用消息隊列呢?僅僅是因為可能同時添加了許多圖像,這可能會導(dǎo)致系統(tǒng)縮放部分出現(xiàn)超時錯誤。
Hemnet 是一個房產(chǎn)上市平臺,在不到一年的時間內(nèi)從完全內(nèi)部部署的解決方案轉(zhuǎn)變?yōu)橐粋€新的基于云的解決方案。
作為增長最快的數(shù)字停車服務(wù)之一,Parkster 已將其單體架構(gòu)分解為更快、解耦的微服務(wù)。與 Netflix 一樣,Parkster 最初也是作為一個整體來證明其商業(yè)模式的。他們很快意識到這種類型的系統(tǒng)——將整個應(yīng)用程序構(gòu)建到一個單元中,具有一個代碼庫和一個系統(tǒng)——效率不高。
公司成立幾年后,Parkster 開始將整體拆分為多個通過消息隊列進(jìn)行通信的小型微服務(wù)。
Softonic 是軟件和應(yīng)用程序發(fā)現(xiàn)門戶,每月?lián)碛谐^ 1 億用戶,每天下載量超過 200 萬次。該門戶在其提供的服務(wù)之間具有恒定的事件和命令流,而 RabbitMQ 是首選的消息隊列,有助于 Softonic 以快速、有效的架構(gòu)而聞名。
用戶將文件上傳到 Softonic 平臺,在那里進(jìn)行病毒掃描,并在分發(fā)給其他用戶之前收集有關(guān)文件的信息。上傳成功后立即通知用戶。文件信息以新的二進(jìn)制數(shù)據(jù)的形式存在于一個專用服務(wù)上,并向消息隊列發(fā)送通知,告知其他服務(wù)有數(shù)據(jù)準(zhǔn)備就緒。其他服務(wù)處理這些數(shù)據(jù),這些數(shù)據(jù)是持久的,并在過程結(jié)束時添加到網(wǎng)站。
以Softonic平臺為例,RabbitMQ的微服務(wù)架構(gòu)使得Web服務(wù)器能夠快速響應(yīng)請求,而不是被迫在現(xiàn)場執(zhí)行資源繁重的流程,這對用戶體驗來說是不利的。
Web 應(yīng)用程序允許用戶將信息上傳到網(wǎng)站。該站點將處理此信息并生成 PDF 并將其通過電子郵件發(fā)送給用戶。在本例中,處理信息、生成 PDF 和發(fā)送電子郵件將花費幾秒鐘,這也是使用消息隊列的原因之一。
FarmBot 是一種開源機器人硬件套件,能夠以高效、有趣的方式與農(nóng)業(yè)項目進(jìn)行交互。FarmBot 采用物理傳感器和執(zhí)行器,需要物理花園和軟件之間的通信方法。
遠(yuǎn)程過程調(diào)用或 HTTP 請求/響應(yīng)模式并不總是適用于 FarmBot,在這種情況下,設(shè)備可能被迫執(zhí)行長輪詢活動,并不斷向 API 發(fā)出任何新遠(yuǎn)程過程調(diào)用的請求。這將導(dǎo)致 Web 應(yīng)用程序出現(xiàn)巨大的可擴展性問題,并導(dǎo)致用戶的實時體驗低于標(biāo)準(zhǔn)。
例如,當(dāng) FarmBot 收到緊急停止消息時,應(yīng)在創(chuàng)建后立即收到,而不是要求系統(tǒng)不斷檢查 API。其他示例包括遠(yuǎn)程過程調(diào)用和實時數(shù)據(jù)同步。
消息隊列現(xiàn)在是 FarmBot Web API 的一個重要組件,用于處理各種任務(wù),包括:
在用戶和設(shè)備之間傳遞推送通知
在服務(wù)器后臺工作人員之間傳遞后臺消息
通過一組自定義授權(quán)插件防止未經(jīng)授權(quán)的使用
使用的消息隊列是RabbitMQ,一個實時消息代理,所以不需要檢查新消息。諸如用戶單擊界面上的“移動”按鈕之類的消息在客戶端、設(shè)備和服務(wù)器之間來回發(fā)送,不需要請求。
將消息代理視為機器對機器的聊天應(yīng)用程序。任何具有正確授權(quán)的軟件包,包括 REST API、FarmBot OS 或第三方固件,都可以向當(dāng)前連接到消息代理的任何其他實體發(fā)送消息。
ElephantSQL(PostgreSQL 數(shù)據(jù)庫即服務(wù))在架構(gòu)中使用隊列進(jìn)行日常備份處理。每天有數(shù)千條“執(zhí)行-數(shù)據(jù)庫-備份”消息添加到隊列中,每個數(shù)據(jù)庫一個。然后另一個服務(wù)訂閱消息并創(chuàng)建備份。
也可以通過客戶 API 或 Web 界面按需創(chuàng)建備份。這個備份應(yīng)該在請求發(fā)送后立即可用 - 換句話說,這是一個優(yōu)先事項。為了解決這個問題,你的消息隊列需要能夠以某種方式對消息進(jìn)行優(yōu)先級排序,在這種情況下使用 RabbitMQ。“perform-database-backup”消息被添加到同一個隊列中,但該消息的消息優(yōu)先級高于所有其他請求。發(fā)送的消息將立即放在隊列的頭部。
CloudAMQP(RabbitMQ 即服務(wù))由許多提供各種功能的消息隊列提供支持。如果您對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下動力節(jié)點的Java在線學(xué)習(xí),里面課程內(nèi)容豐富,通俗易懂,適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助。
初級 202925
初級 203221
初級 202629
初級 203743