⑴ 中間件是什麼幹嘛用的
中間件是一種獨立的系統軟體或服務程序,是連接兩個獨立應用程序或獨立系統的軟體,即使它們具有不同的介面,但通過中間件相互之間仍能交換信息。
中間件在操作系統、網路和資料庫之上,應用軟體的下層,總的作用是為處於自己上層的應用軟體提供運行與開發的環境,幫助用戶靈活、高效地開發和集成復雜的應用軟體。
隨著計算機技術的快速發展,更多的應用軟體被要求在許多不同的網路協議、不同的硬體生產廠商以及不一樣的網路平台和環境上運營。這導致了軟體開發者需要需要開發多種應用程序來達到運營的目的。所以,中間件技術的產生,在極大程度上減輕了開發者的負擔,使得網路的運行更有效率。
(1)常見消息隊列中間件與緩存中間件擴展閱讀
中間件技術
1、遠程過程調用
一個應用程序使用RPC來「遠程」執行一個位於不同地址空間里的過程,並且從效果上看和執行本地調用相同。事實上,一個RPC應用分為兩個部分:server和client。server提供一個或多個遠程過程;client向server發出遠程調用。
在RPC模型中,client和server只要具備了相應的RPC介面,並且具有RPC運行支持,就可以完成相應的互操作,而不必限制於特定的server。
2、面向消息的中間件
MOM指的是利用高效可靠的消息傳遞機制進行平台無關的數據交流,並基於數據通信來進行分布式系統的集成。消息放入適當的隊列時,目標程序甚至根本不需要正在運行;即使目標程序在運行,也不意味著要立即處理該消息。
對應用程序的結構沒有約束:在復雜的應用場合中,通訊程序之間不僅可以是一對一的關系,還可以進行一對多和多對一方式,甚至是上述多種方式的組合。多種通訊方式的構造並沒有增加應用程序的復雜性。
3、對象請求代理
可向上提供不同形式的通訊服務,包括同步、排隊、訂閱發布、廣播等等,在這些基本的通訊平台之上,可構築各種框架,為應用程序提供不同領域內的服務,如事務處理監控器、分布數據訪問、對象事務管理器OTM等。
4、事務處理監控
事務處理監控最早出現在大型機上,為其提供支持大規模事務處理的可靠運行環境。隨著分布計算技術的發展,分布應用系統對大規模的事務處理提出了需求,比如商業活動中大量的關鍵事務處理。
⑵ 消息隊列原理及選型
消息隊列(Message Queue)是一種進程間通信或同一進程的不同線程間的通信方式。
Broker(消息伺服器)
Broker的概念來自與Apache ActiveMQ,通俗的講就是MQ的伺服器。
Procer(生產者)
業務的發起方,負責生產消息傳輸給broker
Consumer(消費者)
業務的處理方,負責從broker獲取消息並進行業務邏輯處理
Topic(主題)
發布訂閱模式下的消息統一匯集地,不同生產者向topic發送消息,由MQ伺服器分發到不同的訂閱 者,實現消息的廣播
Queue(隊列)
PTP模式下,特定生產者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收。
Message(消息體)
根據不同通信協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸
點對點模型用於消息生產者和消息消費者之間點到點的通信。
點對點模式包含三個角色:
每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留著消息,可以放在內存 中也可以持久化,直到他們被消費或超時。
特點:
發布訂閱模型包含三個角色:
多個發布者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
特點:
AMQP即Advanced Message Queuing Protocol,是應用層協議的一個開放標准,為面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。AMQP 的主要特徵是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
優點:可靠、通用
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平台,幾乎可以把所有聯網物品和外部連接起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通信協議。
優點:格式簡潔、佔用帶寬小、移動端通信、PUSH、嵌入式系統
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進行交互。
優點:命令模式(非topicqueue模式)
XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於伺服器之間的准即時操作。核心是基於XML流傳輸,這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
優點:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
RabbitMQ 是實現 AMQP(高級消息隊列協議)的消息中間件的一種,最初起源於金融系統,用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。 RabbitMQ 主要是為了實現系統之間的雙向解耦而實現的。當生產者大量產生數據時,消費者無法快速消費,那麼需要一個中間層。保存這個數據。
RabbitMQ 是一個開源的 AMQP 實現,伺服器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
Channel(通道)
道是兩個管理器之間的一種單向點對點的的通信連接,如果需要雙向交流,可以建立一對通道。
Exchange(消息交換機)
Exchange類似於數據通信網路中的交換機,提供消息路由策略。
RabbitMq中,procer不是通過信道直接將消息發送給queue,而是先發送給Exchange。一個Exchange可以和多個Queue進行綁定,procer在傳遞消息的時候,會傳遞一個ROUTING_KEY,Exchange會根據這個ROUTING_KEY按照特定的路由演算法,將消息路由給指定的queue。和Queue一樣,Exchange也可設置為持久化,臨時或者自動刪除。
Exchange有4種類型:direct(默認),fanout, topic, 和headers。
不同類型的Exchange轉發消息的策略有所區別:
Binding(綁定)
所謂綁定就是將一個特定的 Exchange 和一個特定的 Queue 綁定起來。Exchange 和Queue的綁定可以是多對多的關系。
Routing Key(路由關鍵字)
exchange根據這個關鍵字進行消息投遞。
vhost(虛擬主機)
在RabbitMq server上可以創建多個虛擬的message broker,又叫做virtual hosts (vhosts)。每一個vhost本質上是一個mini-rabbitmq server,分別管理各自的exchange,和bindings。vhost相當於物理的server,可以為不同app提供邊界隔離,使得應用安全的運行在不同的vhost實例上,相互之間不會干擾。procer和consumer連接rabbit server需要指定一個vhost。
假設P1和C1注冊了相同的Broker,Exchange和Queue。P1發送的消息最終會被C1消費。
基本的通信流程大概如下所示:
Consumer收到消息時需要顯式的向rabbit broker發送basic。ack消息或者consumer訂閱消息時設置auto_ack參數為true。
在通信過程中,隊列對ACK的處理有以下幾種情況:
即消息的Ackownledge確認機制,為了保證消息不丟失,消息隊列提供了消息Acknowledge機制,即ACK機制,當Consumer確認消息已經被消費處理,發送一個ACK給消息隊列,此時消息隊列便可以刪除這個消息了。如果Consumer宕機/關閉,沒有發送ACK,消息隊列將認為這個消息沒有被處理,會將這個消息重新發送給其他的Consumer重新消費處理。
消息的收發處理支持事務,例如:在任務中心場景中,一次處理可能涉及多個消息的接收、處理,這應該處於同一個事務范圍內,如果一個消息處理失敗,事務回滾,消息重新回到隊列中。
消息的持久化,對於一些關鍵的核心業務來說是非常重要的,啟用消息持久化後,消息隊列宕機重啟後,消息可以從持久化存儲恢復,消息不丟失,可以繼續消費處理。
fanout 模式
模式特點:
direct 模式
任何發送到Direct Exchange的消息都會被轉發到routing_key中指定的Queue。
如果一個exchange 聲明為direct,並且bind中指定了routing_key,那麼發送消息時需要同時指明該exchange和routing_key。
簡而言之就是:生產者生成消息發送給Exchange, Exchange根據Exchange類型和basic_publish中的routing_key進行消息發送 消費者:訂閱Exchange並根據Exchange類型和binding key(bindings 中的routing key) ,如果生產者和訂閱者的routing_key相同,Exchange就會路由到那個隊列。
topic 模式
前面講到direct類型的Exchange路由規則是完全匹配binding key與routing key,但這種嚴格的匹配方式在很多情況下不能滿足實際業務需求。
topic類型的Exchange在匹配規則上進行了擴展,它與direct類型的Exchage相似,也是將消息路由到binding key與routing key相匹配的Queue中,但這里的匹配規則有些不同。
它約定:
以上圖中的配置為例,routingKey=」quick.orange.rabbit」的消息會同時路由到Q1與Q2,routingKey=」lazy.orange.fox」的消息會路由到Q1,routingKey=」lazy.brown.fox」的消息會路由到Q2,routingKey=」lazy.pink.rabbit」的消息會路由到Q2(只會投遞給Q2一次,雖然這個routingKey與Q2的兩個bindingKey都匹配);routingKey=」quick.brown.fox」、routingKey=」orange」、routingKey=」quick.orange.male.rabbit」的消息將會被丟棄,因為它們沒有匹配任何bindingKey。
RabbitMQ,部署分三種模式:單機模式,普通集群模式,鏡像集群模式。
普通集群模式
多台機器部署,每個機器放一個rabbitmq實例,但是創建的queue只會放在一個rabbitmq實例上,每個實例同步queue的元數據。
如果消費時連的是其他實例,那個實例會從queue所在實例拉取數據。這就會導致拉取數據的開銷,如果那個放queue的實例宕機了,那麼其他實例就無法從那個實例拉取,即便開啟了消息持久化,讓rabbitmq落地存儲消息的話,消息不一定會丟,但得等這個實例恢復了,然後才可以繼續從這個queue拉取數據, 這就沒什麼高可用可言,主要是提供吞吐量 ,讓集群中多個節點來服務某個queue的讀寫操作。
鏡像集群模式
queue的元數據和消息都會存放在多個實例,每次寫消息就自動同步到多個queue實例里。這樣任何一個機器宕機,其他機器都可以頂上,但是性能開銷太大,消息同步導致網路帶寬壓力和消耗很重,另外,沒有擴展性可言,如果queue負載很重,加機器,新增的機器也包含了這個queue的所有數據,並沒有辦法線性擴展你的queue。此時,需要開啟鏡像集群模式,在rabbitmq管理控制台新增一個策略,將數據同步到指定數量的節點,然後你再次創建queue的時候,應用這個策略,就會自動將數據同步到其他的節點上去了。
Kafka 是 Apache 的子項目,是一個高性能跨語言的分布式發布/訂閱消息隊列系統(沒有嚴格實現 JMS 規范的點對點模型,但可以實現其效果),在企業開發中有廣泛的應用。高性能是其最大優勢,劣勢是消息的可靠性(丟失或重復),這個劣勢是為了換取高性能,開發者可以以稍降低性能,來換取消息的可靠性。
一個Topic可以認為是一類消息,每個topic將被分成多個partition(區),每個partition在存儲層面是append log文件。任何發布到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置稱為offset(偏移量),offset為一個long型數字,它是唯一標記一條消息。它唯一的標記一條消息。kafka並沒有提供其他額外的索引機制來存儲offset,因為在kafka中幾乎不允許對消息進行「隨機讀寫」。
Kafka和JMS(Java Message Service)實現(activeMQ)不同的是:即使消息被消費,消息仍然不會被立即刪除。日誌文件將會根據broker中的配置要求,保留一定的時間之後刪除;比如log文件保留2天,那麼兩天後,文件會被清除,無論其中的消息是否被消費。kafka通過這種簡單的手段,來釋放磁碟空間,以及減少消息消費之後對文件內容改動的磁碟IO開支。
對於consumer而言,它需要保存消費消息的offset,對於offset的保存和使用,有consumer來控制;當consumer正常消費消息時,offset將會"線性"的向前驅動,即消息將依次順序被消費。事實上consumer可以使用任意順序消費消息,它只需要將offset重置為任意值。(offset將會保存在zookeeper中,參見下文)
kafka集群幾乎不需要維護任何consumer和procer狀態信息,這些信息有zookeeper保存;因此procer和consumer的客戶端實現非常輕量級,它們可以隨意離開,而不會對集群造成額外的影響。
partitions的設計目的有多個。最根本原因是kafka基於文件存儲。通過分區,可以將日誌內容分散到多個server上,來避免文件尺寸達到單機磁碟的上限,每個partiton都會被當前server(kafka實例)保存;可以將一個topic切分多任意多個partitions,來消息保存/消費的效率。此外越多的partitions意味著可以容納更多的consumer,有效提升並發消費的能力。(具體原理參見下文)。
一個Topic的多個partitions,被分布在kafka集群中的多個server上;每個server(kafka實例)負責partitions中消息的讀寫操作;此外kafka還可以配置partitions需要備份的個數(replicas),每個partition將會被備份到多台機器上,以提高可用性。
基於replicated方案,那麼就意味著需要對多個備份進行調度;每個partition都有一個server為"leader";leader負責所有的讀寫操作,如果leader失效,那麼將會有其他follower來接管(成為新的leader);follower只是單調的和leader跟進,同步消息即可。由此可見作為leader的server承載了全部的請求壓力,因此從集群的整體考慮,有多少個partitions就意味著有多少個"leader",kafka會將"leader"均衡的分散在每個實例上,來確保整體的性能穩定。
Procers
Procer將消息發布到指定的Topic中,同時Procer也能決定將此消息歸屬於哪個partition;比如基於"round-robin"方式或者通過其他的一些演算法等。
Consumers
本質上kafka只支持Topic。每個consumer屬於一個consumer group;反過來說,每個group中可以有多個consumer。發送到Topic的消息,只會被訂閱此Topic的每個group中的一個consumer消費。
如果所有的consumer都具有相同的group,這種情況和queue模式很像;消息將會在consumers之間負載均衡。
如果所有的consumer都具有不同的group,那這就是"發布-訂閱";消息將會廣播給所有的消費者。
在kafka中,一個partition中的消息只會被group中的一個consumer消費;每個group中consumer消息消費互相獨立;我們可以認為一個group是一個"訂閱"者,一個Topic中的每個partions,只會被一個"訂閱者"中的一個consumer消費,不過一個consumer可以消費多個partitions中的消息。kafka只能保證一個partition中的消息被某個consumer消費時,消息是順序的。事實上,從Topic角度來說,消息仍不是有序的。
Kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到消息。
Guarantees
Kafka就比較適合高吞吐量並且允許少量數據丟失的場景,如果非要保證「消息可靠傳輸」,可以使用JMS。
Kafka Procer 消息發送有兩種方式(配置參數 procer.type):
對於同步方式(procer.type=sync)?Kafka Procer 消息發送有三種確認方式(配置參數 acks):
kafka的設計初衷是希望作為一個統一的信息收集平台,能夠實時的收集反饋信息,並需要能夠支撐較大的數據量,且具備良好的容錯能力。
持久性
kafka使用文件存儲消息,這就直接決定kafka在性能上嚴重依賴文件系統的本身特性。且無論任何OS下,對文件系統本身的優化幾乎沒有可能。文件緩存/直接內存映射等是常用的手段。因為kafka是對日誌文件進行append操作,因此磁碟檢索的開支是較小的;同時為了減少磁碟寫入的次數,broker會將消息暫時buffer起來,當消息的個數(或尺寸)達到一定閥值時,再flush到磁碟,這樣減少了磁碟IO調用的次數。
性能
需要考慮的影響性能點很多,除磁碟IO之外,我們還需要考慮網路IO,這直接關繫到kafka的吞吐量問題。kafka並沒有提供太多高超的技巧;對於procer端,可以將消息buffer起來,當消息的條數達到一定閥值時,批量發送給broker;對於consumer端也是一樣,批量fetch多條消息。不過消息量的大小可以通過配置文件來指定。對於kafka broker端,似乎有個sendfile系統調用可以潛在的提升網路IO的性能:將文件的數據映射到系統內存中,socket直接讀取相應的內存區域即可,而無需進程再次和交換。 其實對於procer/consumer/broker三者而言,CPU的開支應該都不大,因此啟用消息壓縮機制是一個良好的策略;壓縮需要消耗少量的CPU資源,不過對於kafka而言,網路IO更應該需要考慮。可以將任何在網路上傳輸的消息都經過壓縮。kafka支持gzip/snappy等多種壓縮方式。
生產者
負載均衡: procer將會和Topic下所有partition leader保持socket連接;消息由procer直接通過socket發送到broker,中間不會經過任何「路由層「。事實上,消息被路由到哪個partition上,有procer客戶端決定。比如可以採用「random「「key-hash「「輪詢「等,如果一個topic中有多個partitions,那麼在procer端實現「消息均衡分發「是必要的。
其中partition leader的位置(host:port)注冊在zookeeper中,procer作為zookeeper client,已經注冊了watch用來監聽partition leader的變更事件。
非同步發送:將多條消息暫且在客戶端buffer起來,並將他們批量的發送到broker,小數據IO太多,會拖慢整體的網路延遲,批量延遲發送事實上提升了網路效率。不過這也有一定的隱患,比如說當procer失效時,那些尚未發送的消息將會丟失。
消費者
consumer端向broker發送「fetch」請求,並告知其獲取消息的offset;此後consumer將會獲得一定條數的消息;consumer端也可以重置offset來重新消費消息。
在JMS實現中,Topic模型基於push方式,即broker將消息推送給consumer端。不過在kafka中,採用了pull方式,即consumer在和broker建立連接之後,主動去pull(或者說fetch)消息;這中模式有些優點,首先consumer端可以根據自己的消費能力適時的去fetch消息並處理,且可以控制消息消費的進度(offset);此外,消費者可以良好的控制消息消費的數量,batch fetch。
其他JMS實現,消息消費的位置是有prodiver保留,以便避免重復發送消息或者將沒有消費成功的消息重發等,同時還要控制消息的狀態。這就要求JMS broker需要太多額外的工作。在kafka中,partition中的消息只有一個consumer在消費,且不存在消息狀態的控制,也沒有復雜的消息確認機制,可見kafka broker端是相當輕量級的。當消息被consumer接收之後,consumer可以在本地保存最後消息的offset,並間歇性的向zookeeper注冊offset。由此可見,consumer客戶端也很輕量級。
對於JMS實現,消息傳輸擔保非常直接:有且只有一次(exactly once)。
在kafka中稍有不同:
at most once: 消費者fetch消息,然後保存offset,然後處理消息;當client保存offset之後,但是在消息處理過程中出現了異常,導致部分消息未能繼續處理。那麼此後"未處理"的消息將不能被fetch到,這就是"at most once"。
at least once: 消費者fetch消息,然後處理消息,然後保存offset。如果消息處理成功之後,但是在保存offset階段zookeeper異常導致保存操作未能執行成功,這就導致接下來再次fetch時可能獲得上次已經處理過的消息,這就是"at least once",原因offset沒有及時的提交給zookeeper,zookeeper恢復正常還是之前offset狀態。
exactly once: kafka中並沒有嚴格的去實現(基於2階段提交,事務),我們認為這種策略在kafka中是沒有必要的。
通常情況下「at-least-once」是我們首選。(相比at most once而言,重復接收數據總比丟失數據要好)。
kafka高可用由多個broker組成,每個broker是一個節點;
創建一個topic,這個topic會劃分為多個partition,每個partition存在於不同的broker上,每個partition就放一部分數據。
kafka是一個分布式消息隊列,就是說一個topic的數據,是分散放在不同的機器上,每個機器就放一部分數據。
在0.8版本以前,是沒有HA機制的,就是任何一個broker宕機了,那個broker上的partition就廢了,沒法寫也沒法讀,沒有什麼高可用性可言。
0.8版本以後,才提供了HA機制,也就是就是replica副本機制。每個partition的數據都會同步到其他的機器上,形成自己的多個replica副本。然後所有replica會選舉一個leader出來,那麼生產和消費都跟這個leader打交道,然後其他replica就是follower。
寫的時候,leader會負責把數據同步到所有follower上去,讀的時候就直接讀leader上數據即可。
kafka會均勻的將一個partition的所有replica分布在不同的機器上,從而提高容錯性。
如果某個broker宕機了也沒事,它上面的partition在其他機器上都有副本的,如果這上面有某個partition的leader,那麼此時會重新選舉一個新的leader出來,大家繼續讀寫那個新的leader即可。這就有所謂的高可用性了。
寫數據的時候,生產者就寫leader,然後leader將數據落地寫本地磁碟,接著其他follower自己主動從leader來pull數據。一旦所有follower同步好數據了,就會發送ack給leader,leader收到所有follower的ack之後,就會返回寫成功的消息給生產者。
消息丟失會出現在三個環節,分別是生產者、mq中間件、消費者:
RabbitMQ
Kafka
大體和RabbitMQ相同。
Rabbitmq
需要保證順序的消息投遞到同一個queue中,這個queue只能有一個consumer,如果需要提升性能,可以用內存隊列做排隊,然後分發給底層不同的worker來處理。
Kafka
寫入一個partition中的數據一定是有序的。生產者在寫的時候 ,可以指定一個key,比如指定訂單id作為key,這個訂單相關數據一定會被分發到一個partition中去。消費者從partition中取出數據的時候也一定是有序的,把每個數據放入對應的一個內存隊列,一個partition中有幾條相關數據就用幾個內存隊列,消費者開啟多個線程,每個線程處理一個內存隊列。
⑶ 什麼是中間件
中間件(MiddleWare)從字面上解釋就是「處於中間的軟體」,盡管程序員之外的讀者會感覺陌生,但其實早在1990年,中間件就作為網路應用的基礎設施出現了。誕生於貝爾實驗室的Tuxedo系統就是最早用於交易系統的中間件。中間件的出現解決了異構分布網路環境下軟體系統的通信、互操作、協同、事務、安全等共性問題。因為其在系統中的重要性,中間件與操作系統、資料庫被稱為系統軟體的三駕馬車。
阿里的中間件主要有包含這么幾個:
分布式關系型資料庫DRDS_水平拆分 做資料庫擴展性的
消息隊列MQ 是做消息的中間件
企業級分布式應用服務EDAS 做分布式服務的
還有一些其他的中間件,比如配置服務 緩存 等等,也都會放在中間件里
⑷ 分布式、中間件和消息隊列到底是怎麼的一種工作模式
分布式就是不部署在一個進程中,比如多台機器,甚至同台機器的不同進程中。
中間件除了自己寫的代碼和一些工具類庫都可以叫中間件,比如資料庫,開發框架,緩存,隊列等
消息隊列就是一個中間件,有生產的有消費的還有個消息暫存的,比如超市貨架,超市往貨架放東西,顧客取東西,貨架就是暫存貨物。
⑸ 消息中間件(一)MQ詳解及四大MQ比較
一、消息中間件相關知識
1、概述
消息隊列已經逐漸成為企業IT系統內部通信的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步RPC的主要手段之一。當今市面上有很多主流的消息中間件,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開發RocketMQ等。
2、消息中間件的組成
2.1 Broker
消息伺服器,作為server提供消息核心服務
2.2 Procer
消息生產者,業務的發起方,負責生產消息傳輸給broker,
2.3 Consumer
消息消費者,業務的處理方,負責從broker獲取消息並進行業務邏輯處理
2.4 Topic
2.5 Queue
2.6 Message
消息體,根據不同通信協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸
3 消息中間件模式分類
3.1 點對點
PTP點對點:使用queue作為通信載體
說明:
消息生產者生產消息發送到queue中,然後消息消費者從queue中取出並且消費消息。
消息被消費以後,queue中不再存儲,所以消息消費者不可能消費到已經被消費的消息。 Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。
說明:
queue實現了負載均衡,將procer生產的消息發送到消息隊列中,由多個消費者消費。但一個消息只能被一個消費者接受,當沒有消費者可用時,這個消息會被保存直到有一個可用的消費者。
4 消息中間件的優勢
4.1 系統解耦
交互系統之間沒有直接的調用關系,只是通過消息傳輸,故系統侵入性不強,耦合度低。
4.2 提高系統響應時間
例如原來的一套邏輯,完成支付可能涉及先修改訂單狀態、計算會員積分、通知物流配送幾個邏輯才能完成;通過MQ架構設計,就可將緊急重要(需要立刻響應)的業務放到該調用方法中,響應要求不高的使用消息隊列,放到MQ隊列中,供消費者處理。
4.3 為大數據處理架構提供服務
通過消息作為整合,大數據的背景下,消息隊列還與實時處理架構整合,為數據處理提供性能支持。
4.4 Java消息服務——JMS
Java消息服務(Java Message Service,JMS)應用程序介面是一個Java平台中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分布式系統中發送消息,進行非同步通信。
5 消息中間件應用場景
5.1 非同步通信
有些業務不想也不需要立即處理消息。消息隊列提供了非同步處理機制,允許用戶把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然後在需要的時候再去處理它們。
5.2 解耦
降低工程間的強依賴程度,針對異構系統進行適配。在項目啟動之初來預測將來項目會碰到什麼需求,是極其困難的。通過消息系統在處理過程中間插入了一個隱含的、基於數據的介面層,兩邊的處理過程都要實現這一介面,當應用發生變化時,可以獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。
5.3 冗餘
有些情況下,處理數據的過程會失敗。除非數據被持久化,否則將造成丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。許多消息隊列所採用的」插入-獲取-刪除」範式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。
5.4 擴展性
因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。便於分布式擴容。
5.5 過載保護
在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量無法提取預知;如果以為了能處理這類瞬間峰值訪問為標准來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。
5.6 可恢復性
系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復後被處理。
5.7 順序保證
在大多使用場景下,數據處理的順序都很重要。大部分消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。
5.8 緩沖
在任何重要的系統中,都會有需要不同的處理時間的元素。消息隊列通過一個緩沖層來幫助任務最高效率的執行,該緩沖有助於控制和優化數據流經過系統的速度。以調節系統響應時間。
5.9 數據流處理
分布式系統產生的海量數據流,如:業務日誌、監控數據、用戶行為等,針對這些數據流進行實時或批量採集匯總,然後進行大數據分析是當前互聯網的必備技術,通過消息隊列完成此類數據收集是最好的選擇。
6 消息中間件常用協議
6.1 AMQP協議
AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標准高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品,不同開發語言等條件的限制。
優點:可靠、通用
6.2 MQTT協議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平台,幾乎可以把所有聯網物品和外部連接起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通信協議。
優點:格式簡潔、佔用帶寬小、移動端通信、PUSH、嵌入式系統
6.3 STOMP協議
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進行交互。
優點:命令模式(非topicqueue模式)
6.4 XMPP協議
XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於伺服器之間的准即時操作。核心是基於XML流傳輸,這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
優點:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
6.5 其他基於TCP/IP自定義的協議
有些特殊框架(如:redis、kafka、zeroMq等)根據自身需要未嚴格遵循MQ規范,而是基於TCPIP自行封裝了一套協議,通過網路socket介面進行傳輸,實現了MQ的功能。
7 常見消息中間件MQ介紹
7.1 RocketMQ
阿里系下開源的一款分布式、隊列模型的消息中間件,原名Metaq,3.0版本名稱改為RocketMQ,是阿里參照kafka設計思想使用java實現的一套mq。同時將阿里系內部多款mq產品(Notify、metaq)進行整合,只維護核心功能,去除了所有其他運行時依賴,保證核心功能最簡化,在此基礎上配合阿里上述其他開源產品實現不同場景下mq的架構,目前主要多用於訂單交易系統。
具有以下特點:
官方提供了一些不同於kafka的對比差異:
https://rocketmq.apache.org/docs/motivation/
7.2 RabbitMQ
使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。同時實現了Broker架構,核心思想是生產者不會將消息直接發送給隊列,消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)、數據持久化都有很好的支持。多用於進行企業級的ESB整合。
7.3 ActiveMQ
Apache下的一個子項目。使用Java完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,少量代碼就可以高效地實現高級應用場景。可插拔的傳輸協議支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等。
7.4 Redis
使用C語言開發的一個Key-Value的NoSQL資料庫,開發維護很活躍,雖然它是一個Key-Value資料庫存儲系統,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試數據分為128Bytes、512Bytes、1K和10K四個不同大小的數據。實驗表明:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而如果數據大小超過了10K,Redis則慢的無法忍受;出隊時,無論數據大小,Redis都表現出非常好的性能,而RabbitMQ的出隊性能則遠低於Redis。
7.5 Kafka
Apache下的一個子項目,使用scala實現的一個高性能分布式Publish/Subscribe消息隊列系統,具有以下特性:
7.6 ZeroMQ
號稱最快的消息隊列系統,專門為高吞吐量/低延遲的場景開發,在金融界的應用中經常使用,偏重於實時數據通信場景。ZMQ能夠實現RabbitMQ不擅長的高級/復雜的隊列,但是開發人員需要自己組合多種技術框架,開發成本高。因此ZeroMQ具有一個獨特的非中間件的模式,更像一個socket library,你不需要安裝和運行一個消息伺服器或中間件,因為你的應用程序本身就是使用ZeroMQ API完成邏輯服務的角色。但是ZeroMQ僅提供非持久性的隊列,如果down機,數據將會丟失。如:Twitter的Storm中使用ZeroMQ作為數據流的傳輸。
ZeroMQ套接字是與傳輸層無關的:ZeroMQ套接字對所有傳輸層協議定義了統一的API介面。默認支持 進程內(inproc) ,進程間(IPC) ,多播,TCP協議,在不同的協議之間切換只要簡單的改變連接字元串的前綴。可以在任何時候以最小的代價從進程間的本地通信切換到分布式下的TCP通信。ZeroMQ在背後處理連接建立,斷開和重連邏輯。
特性:
二、主要消息中間件的比較
⑹ 現在最常用的Java消息隊列中間件是哪個
ActiveMQ,是Apache出品,最流行的,能力強勁的開源消息匯流排。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
MetaQ,是一款完全的隊列模型消息中間件,伺服器使用Java語言編寫,可在多種軟硬體平台上部署。客戶端支持Java、C++編程語言。單台伺服器可支持1萬以上個消息隊列,通過擴容伺服器,隊列數幾乎可任意橫向擴展。每個隊列都是持久化、長度無限(取決於磁碟空間大小)、並且可從隊列任意位置開始消費
⑺ 什麼是中間件
這其實是一個比較虛的概念。廣義的中間件范圍很廣。起溝通作用的都可以認為是中間件。甚至ODBC這樣的東西你也可以認為是中間件。
現在用的比較多的中間件應該是BEA公司的tuxedo和IBM公司的weblogic?(好象是這個東西),我接觸過一點tuxedo。oracle、sun和ms好象也有類似產品,不過用的人很少。tuxedo是這個領域的領導者,不過IBM正在追趕並有可能超過,畢竟,IBM就是IBM。
tuxedo這東西我們用來做資料庫和前台應用之間的中間件。
使用了中間件之後,以前直接連接的前台應用程序和資料庫之前就多了個tuxedo,現在前台程序把請求發給tuxedo,tuxedo再把請求發給資料庫,資料庫處理結束之後把結果返回tuxedo,tuxedo再把結果送回給前台。這樣一搞,表面看復雜了很多。不過帶來一些好處,比如:
安全。tuxedo的服務是定製的,這就有點象是存貯過程,因為應用程序無法直接接到資料庫而只能通過tuxedo,所以應用程序無法做tuxedo服務之外的事情。你把你的應用邏輯寫在tuxedo中,你就可以保證你的數據是安全的。
性能。有些資料庫性能不好,比如oracle一個連接就是好多M,連接數一多,機器內存就沒了,有了tuxedo之後,tuxedo負責連接資料庫,連接數比較少,tuxedo可以用排隊的方式來處理這些資料庫請求,這樣提高了性能。中間件的高級應用好象還可以把資料庫分布在不同的機器上,由tuxedo動態分配前、後台的請求和處理,把它們搞在不同的機器上,所以你用了中間件之後如果後台資料庫處理來不及,可以加一台機器,前台請求太多(比如網站)可以加多前台機器。你可以靈活的調整性能。
方便移植。業務邏輯做到了中間件里之後,你更換後台資料庫、改變前台的開發工具什麼的移植工作較小,因為中間件的工作改動不大。
應用伺服器做的人好象就更多了。而且應用伺服器這東西和中間件類似(邏輯上)我覺得它應用也是中間件的一種,不過大家一般說中間件都是指的狹義的中間件,就是tuxedo這些。
中間件應用領域很廣的。簡直大一點的應用都可以用到中間件。國內也有一些開發商自己寫中間件,不過好象是自己用,沒形成市場。
⑻ 消息隊列和緩存的區別
redis 消息推送(基於分布式 pub/sub)多用於實時性較高的消息推送,並不保證可靠。
其他的mq和kafka保證可靠但有一些延遲(非實時系統沒有保證延遲)。
redis-pub/sub斷電就清空,而使用redis-list作為消息推送雖然有持久化,但是又太弱智,也並非完全可靠不會丟。
⑼ 什麼是消息中間件
問題一:消息中間件是什麼? 目前對消息中間件(MOM)的定義還未形成統一的行業標准,我國也正加快對消息中間件技術的標准化研究工作。一般認為,消息中間件是一種由消息傳送機制或消息隊列模式組成的中間件技術,利用高效可靠的消息傳遞機制進行平台無關的數據交流,並基於數據通信來進行分布式系統的集成。與其它中間件技術不同(例如ORB 和RPC),一般來說,消息中間件並不要求系統具備一個可靠的底部傳輸層,而是通過以消息的形式收發應用程序數據來連接運行於不同系統上的應用程序。信息可以同步傳送,也支持非同步傳送。在非同步方式下,應用程序並不需要消息即時即刻傳送到對方,只是由MOM 確保把信息以鼎息的方式傳送到適當的目的地,並且只傳一次。
消息中間件屬於中間件的一種,擁有中間件的主要特點,但是自身的工作機制又具有特殊性,主要特點包括以下6 個方面:(1)非同步傳送;(2)防禦通信;(3)並發執行;(4)日誌通信;(5)多種通信方式;(6)應用程序與網路復雜性相隔離。
問題二:消息中間件用在什麼地方? 10分 消息中間件為應用系統提供高效、靈活的消息同步和非同步傳輸處理、存儲轉發、可靠傳輸。在大規模分布式環境下確保消息安全、可靠、高效送達。
特點:
1.分布式環境下,可靠、高效的消息傳輸
產品容錯能力強,系統崩潰時不會導致消息丟失,確保關鍵業務數據的可靠傳輸;支持斷點續傳和消息流量控制,使消息引擎能夠最大效率地利用網路傳輸能力。
2.多種集群方式,穩定高效
InforSuite MQ的若干節點可以組建為多種方式的群組,對外提供消息接收和處理功能。當單個節點無法滿足大負載的消息處理要求,可以使用集群功能將負載分配到多個節點上,提高系統的處理能力和可擴展性。
3.全方位的安全機制保障
產品提供多層次的安全管理功能,包括連接建立時的網路認證,消息傳輸時的安全性保證,有效保證了連接的合法性和私有數據的保密性。
一般都是銀行類大系統,軍工或者研究所的大項目,存在很多數據傳輸的時候需要,可以咨詢國內的一些基礎中間件公司,就那麼幾家,中創中間件、東方通中間件、金蝶等,可以多了解
問題三:java 消息中間件 在什麼情況下使用 消息中間件一般兩個功能,解耦和非同步處理,參考:blog.sina/s/blog_7085382f0102uy79
問題四:消息中間件有哪些 可與OA、ERP集成的免費消息中間件Active Messenger(簡稱AM)是一款非常實用的企業即時通訊軟體。系統提供免費的消息中間件(以組件的方式提供),開放給第三方程序使用。
目前比較典型的消息中間件包括IBM WebSphere MQSeries、Tibco
TIB/Rendezvous和Microsoft MSMQ等。
問題五:java消息中間件有哪些 ActiveMQ,是Apache出品,最流行的,能力強勁的開源消息匯流排。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
MetaQ,是一款完全的隊列模型消息中間件,伺服器使用Java語言編寫,可在多種軟硬體平台上部署。客戶端支持Java、C++編程語言。單台伺服器可支持1萬以上個消息隊列,通過擴容伺服器,隊列數幾乎可任意橫向擴展。每個隊列都是持久化、長度無限(取決於磁碟空間大小)、並且可從隊列任意位置開始消費
問題六:消息中間件有哪些 可與OA、ERP集成的免費消息中間件Active Messenger(簡稱AM)是一款非常實用的企業即時通訊軟體。系統提供免費的消息中間件(以組件的方式提供),開放給第三方程序使用。
目前比較典型的消息中間件包括IBM WebSphere MQSeries、Tibco
TIB/Rendezvous和Microsoft MSMQ等。
問題七:怎麼選擇合適的開源消息中間件 能選擇的有三種:
1. ActiveMQ/ApolloMQ
優點:老牌的消息隊列,使用Java語言編寫。對JMS支持最好,採用多線程並發,資源消耗比較大。如果你的主語言是Java,可以重點考慮。
缺點:由於歷史悠久,歷史包袱較多,版本更新很緩慢。集群模式需要依賴Zookeeper實現。最新架構的產品被命名為Apollo,號稱下一代ActiveMQ,目前案例較少。
2. RocketMQ/Kafka
優點:專為海量消息傳遞打造,主張使用拉模式,天然的集群、HA、負載均衡支持。話說還是那句話,適合不適合看你有沒有那麼大的量。
缺點:所謂魚和熊掌不可兼得,放棄了一些消息中間件的靈活性,使用的場景較窄,需關注你的業務模式是否契合,否則山寨變相使用很別扭。除此之外,RocketMQ沒有.NET下的客戶端可用。RocketMQ身出名門,但使用者不多,生態較小,畢竟消息量能達到這種體量的公司不多,你也可以直接去購買阿里雲的消息服務。Kafka生態完善,其代碼是用Scala語言寫成,可靠性比RocketMQ低一些。
3. RabbitMQ
優點:生態豐富,使用者眾,有很多人在前面踩坑。AMQP協議的領導實現,支持多種場景。淘寶的MySQL集群內部有使用它進行通訊,OpenStack開源雲平台的通信組件,最先在金融行業得到運用。
缺點:Erlang代碼你Hold得住不? 雖然Erlang是天然集群化的,但RabbitMQ在高可用方面做起來還不是特別得心應手,別相信廣告。
問題八:什麼是消息中間件,比如tonglink主要起什麼作用 TongLINK/Q(簡稱TLQ)的主要功能是在應用程序之間海供可靠的消息傳送,這些消息可以在不同的網路協議、不同的計算機系統和不同的應用軟體之間傳遞。TongLINK/Q提供一個簡單易用、高效可靠的分布式應用開發和運行平台,面向要求可靠消息(信息)傳輸的客戶,即包括金融、電信、交通、能源、電子政務等高端客戶,也包括大量中小企業客戶。
中國中間件第一品牌東方通中間件
⑽ c#開源 消息隊列處理中間件有哪些
能選擇的有三種:
1. ActiveMQ/ApolloMQ
優點:老牌的消息隊列,使用Java語言編寫。對JMS支持最好,採用多線程並發,資源消耗比較大。如果你的主語言是Java,可以重點考慮。
缺點:由於歷史悠久,歷史包袱較多,版本更新很緩慢。集群模式需要依賴Zookeeper實現。最新架構的產品被命名為Apollo,號稱下一代ActiveMQ,目前案例較少。
2. RocketMQ/Kafka
優點:專為海量消息傳遞打造,主張使用拉模式,天然的集群、HA、負載均衡支持。話說還是那句話,適合不適合看你有沒有那麼大的量。
缺點:所謂魚和熊掌不可兼得,放棄了一些消息中間件的靈活性,使用的場景較窄,需關注你的業務模式是否契合,否則山寨變相使用很別扭。除此之外,RocketMQ沒有.NET下的客戶端可用。RocketMQ身出名門,但使用者不多,生態較小,畢竟消息量能達到這種體量的公司不多,你也可以直接去購買阿里雲的消息服務。Kafka生態完善,其代碼是用Scala語言寫成,可靠性比RocketMQ低一些。
3. RabbitMQ
優點:生態豐富,使用者眾,有很多人在前面踩坑。AMQP協議的領導實現,支持多種場景。淘寶的MySQL集群內部有使用它進行通訊,OpenStack開源雲平台的通信組件,最先在金融行業得到運用。
缺點:Erlang代碼你Hold得住不? 雖然Erlang是天然集群化的,但RabbitMQ在高可用方面做起來還不是特別得心應手。