最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

消息中間件詳解以及比較選擇

 更新時間:2021年08月12日 14:53:25   作者:jcpp9527  
這篇文章主要介紹了消息中間件詳解以及比較選擇,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、消息中間件相關(guān)知識

1、概述

消息隊列已經(jīng)逐漸成為企業(yè)IT系統(tǒng)內(nèi)部通信的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為異步RPC的主要手段之一。當(dāng)今市面上有很多主流的消息中間件,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開發(fā)RocketMQ等。

2、消息中間件的組成

2.1 Broker

消息服務(wù)器,作為server提供消息核心服務(wù)

2.2 Producer

消息生產(chǎn)者,業(yè)務(wù)的發(fā)起方,負(fù)責(zé)生產(chǎn)消息傳輸給broker,

2.3 Consumer

消息消費(fèi)者,業(yè)務(wù)的處理方,負(fù)責(zé)從broker獲取消息并進(jìn)行業(yè)務(wù)邏輯處理

2.4 Topic

主題,發(fā)布訂閱模式下的消息統(tǒng)一匯集地,不同生產(chǎn)者向topic發(fā)送消息,由MQ服務(wù)器分發(fā)到不同的訂閱者,實(shí)現(xiàn)消息的       廣播

2.5 Queue

隊列,PTP模式下,特定生產(chǎn)者向特定queue發(fā)送消息,消費(fèi)者訂閱特定的queue完成指定消息的接收

2.6 Message

消息體,根據(jù)不同通信協(xié)議定義的固定格式進(jìn)行編碼的數(shù)據(jù)包,來封裝業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)消息的傳輸

3 消息中間件模式分類

3.1 點(diǎn)對點(diǎn)

PTP點(diǎn)對點(diǎn):使用queue作為通信載體 

說明: 
消息生產(chǎn)者生產(chǎn)消息發(fā)送到queue中,然后消息消費(fèi)者從queue中取出并且消費(fèi)消息。 
消息被消費(fèi)以后,queue中不再存儲,所以消息消費(fèi)者不可能消費(fèi)到已經(jīng)被消費(fèi)的消息。 Queue支持存在多個消費(fèi)者,但是對一個消息而言,只會有一個消費(fèi)者可以消費(fèi)。

3.2 發(fā)布/訂閱

Pub/Sub發(fā)布訂閱(廣播):使用topic作為通信載體 

說明: 
消息生產(chǎn)者(發(fā)布)將消息發(fā)布到topic中,同時有多個消息消費(fèi)者(訂閱)消費(fèi)該消息。和點(diǎn)對點(diǎn)方式不同,發(fā)布到topic的消息會被所有訂閱者消費(fèi)。

queue實(shí)現(xiàn)了負(fù)載均衡,將producer生產(chǎn)的消息發(fā)送到消息隊列中,由多個消費(fèi)者消費(fèi)。但一個消息只能被一個消費(fèi)者接受,當(dāng)沒有消費(fèi)者可用時,這個消息會被保存直到有一個可用的消費(fèi)者。 
topic實(shí)現(xiàn)了發(fā)布和訂閱,當(dāng)你發(fā)布一個消息,所有訂閱這個topic的服務(wù)都能得到這個消息,所以從1到N個訂閱者都能得到一個消息的拷貝。

4 消息中間件的優(yōu)勢

4.1 系統(tǒng)解耦

交互系統(tǒng)之間沒有直接的調(diào)用關(guān)系,只是通過消息傳輸,故系統(tǒng)侵入性不強(qiáng),耦合度低。

4.2 提高系統(tǒng)響應(yīng)時間

例如原來的一套邏輯,完成支付可能涉及先修改訂單狀態(tài)、計算會員積分、通知物流配送幾個邏輯才能完成;通過MQ架構(gòu)設(shè)計,就可將緊急重要(需要立刻響應(yīng))的業(yè)務(wù)放到該調(diào)用方法中,響應(yīng)要求不高的使用消息隊列,放到MQ隊列中,供消費(fèi)者處理。

4.3 為大數(shù)據(jù)處理架構(gòu)提供服務(wù)

通過消息作為整合,大數(shù)據(jù)的背景下,消息隊列還與實(shí)時處理架構(gòu)整合,為數(shù)據(jù)處理提供性能支持。

4.4 Java消息服務(wù)——JMS

Java消息服務(wù)(Java Message Service,JMS)應(yīng)用程序接口是一個Java平臺中關(guān)于面向消息中間件(MOM)的API,用于在兩個應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。 
JMS中的P2P和Pub/Sub消息模式:點(diǎn)對點(diǎn)(point to point, queue)與發(fā)布訂閱(publish/subscribe,topic)最初是由JMS定義的。這兩種模式主要區(qū)別或解決的問題就是發(fā)送到隊列的消息能否重復(fù)消費(fèi)(多訂閱)。

5 消息中間件應(yīng)用場景

5.1 異步通信

有些業(yè)務(wù)不想也不需要立即處理消息。消息隊列提供了異步處理機(jī)制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。

5.2 解耦

降低工程間的強(qiáng)依賴程度,針對異構(gòu)系統(tǒng)進(jìn)行適配。在項目啟動之初來預(yù)測將來項目會碰到什么需求,是極其困難的。通過消息系統(tǒng)在處理過程中間插入了一個隱含的、基于數(shù)據(jù)的接口層,兩邊的處理過程都要實(shí)現(xiàn)這一接口,當(dāng)應(yīng)用發(fā)生變化時,可以獨(dú)立的擴(kuò)展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。

5.3 冗余

有些情況下,處理數(shù)據(jù)的過程會失敗。除非數(shù)據(jù)被持久化,否則將造成丟失。消息隊列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險。許多消息隊列所采用的”插入-獲取-刪除”范式中,在把一個消息從隊列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢。

5.4 擴(kuò)展性

因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調(diào)節(jié)參數(shù)。便于分布式擴(kuò)容。

5.5 過載保護(hù)

在訪問量劇增的情況下,應(yīng)用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量無法提取預(yù)知;如果以為了能處理這類瞬間峰值訪問為標(biāo)準(zhǔn)來投入資源隨時待命無疑是巨大的浪費(fèi)。使用消息隊列能夠使關(guān)鍵組件頂住突發(fā)的訪問壓力,而不會因為突發(fā)的超負(fù)荷的請求而完全崩潰。

5.6 可恢復(fù)性

系統(tǒng)的一部分組件失效時,不會影響到整個系統(tǒng)。消息隊列降低了進(jìn)程間的耦合度,所以即使一個處理消息的進(jìn)程掛掉,加入隊列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。

5.7 順序保證

在大多使用場景下,數(shù)據(jù)處理的順序都很重要。大部分消息隊列本來就是排序的,并且能保證數(shù)據(jù)會按照特定的順序來處理。

5.8 緩沖

在任何重要的系統(tǒng)中,都會有需要不同的處理時間的元素。消息隊列通過一個緩沖層來幫助任務(wù)最高效率的執(zhí)行,該緩沖有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過系統(tǒng)的速度。以調(diào)節(jié)系統(tǒng)響應(yīng)時間。

5.9 數(shù)據(jù)流處理

分布式系統(tǒng)產(chǎn)生的海量數(shù)據(jù)流,如:業(yè)務(wù)日志、監(jiān)控數(shù)據(jù)、用戶行為等,針對這些數(shù)據(jù)流進(jìn)行實(shí)時或批量采集匯總,然后進(jìn)行大數(shù)據(jù)分析是當(dāng)前互聯(lián)網(wǎng)的必備技術(shù),通過消息隊列完成此類數(shù)據(jù)收集是最好的選擇。

6 消息中間件常用協(xié)議

6.1 AMQP協(xié)議

AMQP即Advanced Message Queuing Protocol,一個提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級消息隊列協(xié)議,是應(yīng)用層協(xié)議的一個開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計?;诖藚f(xié)議的客戶端與消息中間件可傳遞消息,并不受客戶端/中間件不同產(chǎn)品,不同開發(fā)語言等條件的限制。 
優(yōu)點(diǎn):可靠、通用

6.2 MQTT協(xié)議

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發(fā)的一個即時通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。該協(xié)議支持所有平臺,幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,被用來當(dāng)做傳感器和致動器(比如通過Twitter讓房屋聯(lián)網(wǎng))的通信協(xié)議。 
優(yōu)點(diǎn):格式簡潔、占用帶寬小、移動端通信、PUSH、嵌入式系統(tǒng)

6.3 STOMP協(xié)議

STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協(xié)議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設(shè)計的簡單文本協(xié)議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進(jìn)行交互。 
優(yōu)點(diǎn):命令模式(非topic\queue模式)

6.4 XMPP協(xié)議

XMPP(可擴(kuò)展消息處理現(xiàn)場協(xié)議,Extensible Messaging and Presence Protocol)是基于可擴(kuò)展標(biāo)記語言(XML)的協(xié)議,多用于即時消息(IM)以及在線現(xiàn)場探測。適用于服務(wù)器之間的準(zhǔn)即時操作。核心是基于XML流傳輸,這個協(xié)議可能最終允許因特網(wǎng)用戶向因特網(wǎng)上的其他任何人發(fā)送即時消息,即使其操作系統(tǒng)和瀏覽器不同。 
優(yōu)點(diǎn):通用公開、兼容性強(qiáng)、可擴(kuò)展、安全性高,但XML編碼格式占用帶寬大

6.5 其他基于TCP/IP自定義的協(xié)議

有些特殊框架(如:redis、kafka、zeroMq等)根據(jù)自身需要未嚴(yán)格遵循MQ規(guī)范,而是基于TCP\IP自行封裝了一套協(xié)議,通過網(wǎng)絡(luò)socket接口進(jìn)行傳輸,實(shí)現(xiàn)了MQ的功能。

7 常見消息中間件MQ介紹

7.1 RocketMQ

阿里系下開源的一款分布式、隊列模型的消息中間件,原名Metaq,3.0版本名稱改為RocketMQ,是阿里參照kafka設(shè)計思想使用java實(shí)現(xiàn)的一套mq。同時將阿里系內(nèi)部多款mq產(chǎn)品(Notify、metaq)進(jìn)行整合,只維護(hù)核心功能,去除了所有其他運(yùn)行時依賴,保證核心功能最簡化,在此基礎(chǔ)上配合阿里上述其他開源產(chǎn)品實(shí)現(xiàn)不同場景下mq的架構(gòu),目前主要多用于訂單交易系統(tǒng)。

具有以下特點(diǎn):

能夠保證嚴(yán)格的消息順序提供針對消息的過濾功能提供豐富的消息拉取模式高效的訂閱者水平擴(kuò)展能力實(shí)時的消息訂閱機(jī)制億級消息堆積能力

官方提供了一些不同于kafka的對比差異: 
https://rocketmq.apache.org/docs/motivation/

7.2 RabbitMQ

使用Erlang編寫的一個開源的消息隊列,本身支持很多的協(xié)議:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它變的非常重量級,更適合于企業(yè)級的開發(fā)。同時實(shí)現(xiàn)了Broker架構(gòu),核心思想是生產(chǎn)者不會將消息直接發(fā)送給隊列,消息在發(fā)送給客戶端時先在中心隊列排隊。對路由(Routing),負(fù)載均衡(Load balance)、數(shù)據(jù)持久化都有很好的支持。多用于進(jìn)行企業(yè)級的ESB整合。

7.3 ActiveMQ

Apache下的一個子項目。使用Java完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn),少量代碼就可以高效地實(shí)現(xiàn)高級應(yīng)用場景??刹灏蔚膫鬏攨f(xié)議支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等。

7.4 Redis

使用C語言開發(fā)的一個Key-Value的NoSQL數(shù)據(jù)庫,開發(fā)維護(hù)很活躍,雖然它是一個Key-Value數(shù)據(jù)庫存儲系統(tǒng),但它本身支持MQ功能,所以完全可以當(dāng)做一個輕量級的隊列服務(wù)來使用。對于RabbitMQ和Redis的入隊和出隊操作,各執(zhí)行100萬次,每10萬次記錄一次執(zhí)行時間。測試數(shù)據(jù)分為128Bytes、512Bytes、1K和10K四個不同大小的數(shù)據(jù)。實(shí)驗表明:入隊時,當(dāng)數(shù)據(jù)比較小時Redis的性能要高于RabbitMQ,而如果數(shù)據(jù)大小超過了10K,Redis則慢的無法忍受;出隊時,無論數(shù)據(jù)大小,Redis都表現(xiàn)出非常好的性能,而RabbitMQ的出隊性能則遠(yuǎn)低于Redis。

7.5 Kafka

Apache下的一個子項目,使用scala實(shí)現(xiàn)的一個高性能分布式Publish/Subscribe消息隊列系統(tǒng),具有以下特性:

快速持久化:通過磁盤順序讀寫與零拷貝機(jī)制,可以在O(1)的系統(tǒng)開銷下進(jìn)行消息持久化;高吞吐:在一臺普通的服務(wù)器上既可以達(dá)到10W/s的吞吐速率;高堆積:支持topic下消費(fèi)者較長時間離線,消息堆積量大;完全的分布式系統(tǒng):Broker、Producer、Consumer都原生自動支持分布式,依賴zookeeper自動實(shí)現(xiàn)復(fù)雜均衡;支持Hadoop數(shù)據(jù)并行加載:對于像Hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實(shí)時處理的限制,這是一個可行的解決方案。

7.6 ZeroMQ

號稱最快的消息隊列系統(tǒng),專門為高吞吐量/低延遲的場景開發(fā),在金融界的應(yīng)用中經(jīng)常使用,偏重于實(shí)時數(shù)據(jù)通信場景。ZMQ能夠?qū)崿F(xiàn)RabbitMQ不擅長的高級/復(fù)雜的隊列,但是開發(fā)人員需要自己組合多種技術(shù)框架,開發(fā)成本高。因此ZeroMQ具有一個獨(dú)特的非中間件的模式,更像一個socket library,你不需要安裝和運(yùn)行一個消息服務(wù)器或中間件,因為你的應(yīng)用程序本身就是使用ZeroMQ API完成邏輯服務(wù)的角色。但是ZeroMQ僅提供非持久性的隊列,如果down機(jī),數(shù)據(jù)將會丟失。如:Twitter的Storm中使用ZeroMQ作為數(shù)據(jù)流的傳輸。

ZeroMQ套接字是與傳輸層無關(guān)的:ZeroMQ套接字對所有傳輸層協(xié)議定義了統(tǒng)一的API接口。默認(rèn)支持 進(jìn)程內(nèi)(inproc) ,進(jìn)程間(IPC) ,多播,TCP協(xié)議,在不同的協(xié)議之間切換只要簡單的改變連接字符串的前綴。可以在任何時候以最小的代價從進(jìn)程間的本地通信切換到分布式下的TCP通信。ZeroMQ在背后處理連接建立,斷開和重連邏輯。

特性:

無鎖的隊列模型:對于跨線程間的交互(用戶端和session)之間的數(shù)據(jù)交換通道pipe,采用無鎖的隊列算法CAS;在pipe的兩端注冊有異步事件,在讀或者寫消息到pipe的時,會自動觸發(fā)讀寫事件。批量處理的算法:對于批量的消息,進(jìn)行了適應(yīng)性的優(yōu)化,可以批量的接收和發(fā)送消息。多核下的線程綁定,無須CPU切換:區(qū)別于傳統(tǒng)的多線程并發(fā)模式,信號量或者臨界區(qū),zeroMQ充分利用多核的優(yōu)勢,每個核綁定運(yùn)行一個工作者線程,避免多線程之間的CPU切換開銷。

二、主要消息中間件的比較

綜合選擇RabbitMq 

到此這篇關(guān)于消息中間件詳解以及比較選擇的文章就介紹到這了,更多相關(guān)消息中間件詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)在線聊天室(層層遞進(jìn))

    Java實(shí)現(xiàn)在線聊天室(層層遞進(jìn))

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)在線聊天室,層層遞進(jìn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • spring中時間格式化的兩種方法示例講解

    spring中時間格式化的兩種方法示例講解

    這篇文章主要介紹了spring中時間格式化的兩種方法,方法一自己格式化,方法二通過配置,結(jié)合實(shí)例代碼講解的非常詳細(xì),文中補(bǔ)充介紹了Spring項目中時間格式化的方法,需要的朋友可以參考下
    2023-08-08
  • 基于SpringAI+DeepSeek實(shí)現(xiàn)流式對話功能

    基于SpringAI+DeepSeek實(shí)現(xiàn)流式對話功能

    一般來說大模型的響應(yīng)速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會使用流式輸出一點(diǎn)點(diǎn)將結(jié)果輸出給用戶,那么問題來了,想要實(shí)現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來本文給出具體的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2025-02-02
  • shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)

    shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)

    這篇文章主要為大家介紹了shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java設(shè)計模式中的觀察者模式

    Java設(shè)計模式中的觀察者模式

    觀察者模式定義對象之間的一種一對多的依賴關(guān)系,使得每當(dāng)一個對象的狀態(tài)發(fā)生變化時,其相關(guān)的依賴對象都可以得到通知并被自動更新。主要用于多個不同的對象對一個對象的某個方法會做出不同的反應(yīng)
    2023-02-02
  • 使用Cloud?Studio構(gòu)建SpringSecurity權(quán)限框架(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練營)

    使用Cloud?Studio構(gòu)建SpringSecurity權(quán)限框架(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練

    隨著云計算技術(shù)的成熟和普及,傳統(tǒng)編程能力和資源以云服務(wù)的形式開放出來,從中間件、數(shù)據(jù)庫等水平能力服務(wù)組件到人臉識別、鑒權(quán)服務(wù)等基本業(yè)務(wù)服務(wù)組件很容易的在云端獲取,本文介紹使用Cloud?Studio構(gòu)建SpringSecurity權(quán)限框架的相關(guān)知識,感興趣的朋友一起看看吧
    2023-08-08
  • Springboot中的Controller解析

    Springboot中的Controller解析

    這篇文章主要介紹了Springboot中的Controller解析,Controller是SpringBoot的基本組件,也是MVC結(jié)構(gòu)的組成部分,其作用是將用戶提交來的請求通過URL匹配,分發(fā)給不同的接收器,該接收器會對其進(jìn)行相應(yīng)處理,然后返回處理結(jié)果,需要的朋友可以參考下
    2023-09-09
  • Java使用dom4j解析xml、讀取xml文件圖文教程

    Java使用dom4j解析xml、讀取xml文件圖文教程

    這篇文章主要給大家介紹了關(guān)于Java使用dom4j解析xml、讀取xml文件的相關(guān)資料,包括創(chuàng)建SAXReader對象、讀取并解析XML文件、獲取Document對象、獲取根元素和子元素、獲取屬性和內(nèi)容等操作,還提供了配置Dom4j?jar包的步驟,需要的朋友可以參考下
    2025-02-02
  • java異步控制方法的超時時間問題

    java異步控制方法的超時時間問題

    這篇文章主要介紹了java異步控制方法的超時時間問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring?Boot在啟動時執(zhí)行一次的功能實(shí)現(xiàn)

    Spring?Boot在啟動時執(zhí)行一次的功能實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Spring?Boot在啟動時執(zhí)行一次的功能實(shí)現(xiàn),在實(shí)習(xí)過程中,有時候會遇到一些項目啟動初始化的需求,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08

最新評論

东阿县| 观塘区| 诏安县| 垦利县| 八宿县| 龙川县| 漳州市| 大埔区| 忻州市| 玛曲县| 平湖市| 赤城县| 肥东县| 安康市| 东丰县| 曲松县| 西安市| 哈巴河县| 英吉沙县| 饶平县| 榆社县| 辰溪县| 信阳市| 双辽市| 思茅市| 梅州市| 巫溪县| 定远县| 漯河市| 论坛| 榆林市| 西和县| 台北市| 留坝县| 东明县| 正定县| 玉门市| 丹棱县| 宜兴市| 博客| 祁连县|