RPC常用消息中间件
一、消息中間件
消息隊(duì)列技術(shù)是分布式應(yīng)用間交換信息的一種技術(shù)。消息隊(duì)列可駐留在內(nèi)存或磁盤上,隊(duì)列存儲(chǔ)消息直到它們被應(yīng)用程序讀走。通過消息隊(duì)列,應(yīng)用程序可獨(dú)立地執(zhí)行–它們不需要知道彼此的位置、或在繼續(xù)執(zhí)行前不需要等待接收程序接收此消息。
總體來說,消息中間件有以下作用:降低耦合、流量消峰、異步通信、可靠性傳輸
1.降低耦合:通過發(fā)布訂閱的方式松耦合
我們以注冊業(yè)務(wù)為例,注冊成功會(huì)發(fā)送短信、郵件給用戶來確認(rèn),傳統(tǒng)架構(gòu)模型是這樣:
郵件業(yè)務(wù)和短信業(yè)務(wù)的代碼是寫在用戶注冊的流程里,無論是通過接口的方式來實(shí)現(xiàn),還是遠(yuǎn)程調(diào)用的方式來實(shí)現(xiàn),耦合度都很高,現(xiàn)在,新增一個(gè)需求,用戶注冊完成以后不發(fā)送郵件了,而是給用戶“增加積分”,我們來分析這幾種情況:
第一、都在一個(gè)業(yè)務(wù)系統(tǒng)內(nèi)通過代碼堆積、接口調(diào)用的方式來實(shí)現(xiàn)注冊成功后的業(yè)務(wù)處理,我們需要改動(dòng)注冊代碼,上線時(shí)需要啟停應(yīng)用,這種方式耦合度最高。
第二、通過遠(yuǎn)程調(diào)用的方式,當(dāng)我們要新增業(yè)務(wù)處理時(shí),還是要改動(dòng)主流程代碼,避免不了啟停應(yīng)用。
如果我們引入消息中間件,如下:
通過發(fā)布訂閱的方式,用戶注冊成功后,給消息中間件發(fā)送一個(gè)消息,各個(gè)業(yè)務(wù)端訂閱同一個(gè)頻道的消息,接收到注冊成功的消息后就執(zhí)行相應(yīng)業(yè)務(wù)。新增“增加積分”,就讓積分系統(tǒng)相關(guān)處理訂閱這個(gè)消息就夠了,不用改動(dòng)用戶業(yè)務(wù)代碼,不用啟停應(yīng)用,就可以實(shí)現(xiàn)業(yè)務(wù)的平滑擴(kuò)展。
2.異步通信
還拿上面舉例,傳統(tǒng)架構(gòu)中當(dāng)用戶注冊完成,并發(fā)送完短信郵件后才返回客戶端通知用戶注冊成功。而使用消息中間件后用戶提交完注冊信息處理完成后即可提示用戶注冊成功,后續(xù)短信服務(wù)、郵件服務(wù)得到訂閱的頻道中的用戶注冊成功消息后再去發(fā)送短信和郵件,業(yè)務(wù)之間不再相互制約。
3.流量消峰、防浪涌
消息中間件可以在峰值時(shí)堆積消息,而在峰值過去后下游系統(tǒng)慢慢消費(fèi)消息解決流量洪峰的問題。
并發(fā)量達(dá)到高峰時(shí),后端系統(tǒng)壓力通常會(huì)很大,無論是應(yīng)用服務(wù)器還是數(shù)據(jù)庫服務(wù)器,這個(gè)時(shí)候可以將類似請求放到消息中間件的消息隊(duì)列中堆積起來慢慢處理,也可以設(shè)置消息隊(duì)列的大小達(dá)到控制并發(fā)量的目的,商品秒殺的業(yè)務(wù)場景比較典型。
4.可靠性傳輸
基于消息的通信是可靠的,消息不會(huì)丟失。大多數(shù)消息中間件都提供將消息持久化到磁盤的功能。開篇的第一個(gè)場景中,消息中間件可以將生產(chǎn)者生產(chǎn)的消息持久化到磁盤,后端應(yīng)用宕機(jī),但消息不會(huì)丟失,應(yīng)用重啟繼續(xù)處理。
你可能會(huì)有這樣的疑問,那消息中間件宕機(jī)了,接收不到消息怎么持久化?沒關(guān)系,消息中間件提供了多種消息復(fù)制策略、持久化策略,集群部署策略等都可以保證消息的可靠性傳輸。
二、消息中間件模式
三、常用消息中間件
RabbitMQ
??1.RabbitMQ特點(diǎn):
???RabbitMQ是一個(gè)由Erlang語言開發(fā)的基于AMQP標(biāo)準(zhǔn)的開源實(shí)現(xiàn)。RabbitMQ最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。其具體特點(diǎn)包括:
- 可靠性
- 靈活的路由
- 支持消息集群
- 高可用性
- 支持多種協(xié)議 ?(除支持AMQP協(xié)議之外,還通過插件的方式支持其他消息隊(duì)列協(xié)議,如STOMP、MQTT)
- 支持多語言客戶端
- 提供管理界面
- 提供跟蹤機(jī)制
- 提供插件機(jī)制?(RabbitMQ提供了許多插件,也可以編寫自己的插件)
???RabbitMQ最大的優(yōu)勢在于提供了比較靈活的消息路由策略、高可用性、可靠性以及豐富的插件、多種平臺(tái)支持和完善的文檔。不過,由于AMQP協(xié)議本身導(dǎo)致它的實(shí)現(xiàn)比較重量,從而使得與其他MQ (比如Kafka) 對(duì)比其吞吐量處于下風(fēng)。
ActiveMQ
??1.ActiveMQ 特點(diǎn):
???ActiveMQ是由Apache出品的一款開源消息中間件,旨在為應(yīng)用程序提供高效、可擴(kuò)展、穩(wěn)定、安全的企業(yè)級(jí)消息通信。ActiveMQ實(shí)現(xiàn)了JMS 1.1 并提供了很多附加的特性,比如JMX管理、主從管理、消息組通信、消息優(yōu)先級(jí)、延遲接收消息、虛擬接收者、消息持久化、消息隊(duì)列監(jiān)控等。主要特性如下:
-
支持Java、C、C++、C#、Ruby、Perl、Python、PHP等多種語言的客戶端和協(xié)議,如OpenWire、STOMP、AMQP、MQTT協(xié)議。
-
提供了像消息組通信、消息優(yōu)先級(jí)、延遲接收消息、虛擬接收者、消息持久化之類的高級(jí)特性。
-
完全支持JMS 1.1 和 J2EE 1.4 規(guī)范 (包括持久化、分布式事務(wù)消息、事務(wù))
-
支持Spring框架,ActiveMQ 可以通過Spring 的配置文件方式很容易嵌入Spring應(yīng)用中。
-
通過了常見的J2EE服務(wù)器測試,比如TomEE、Geronimo、JBoss、GlassFish、WebLogic。
-
連接方式多樣化,ActiveMQ 提供了多種連接方式,例如 in-VM、TCP、SSL、NIO、UDP、多播、JGroups、JXTA。
-
支持通過使用JDBC 和 Journal 實(shí)現(xiàn)消息的快速持久化。
-
為高性能集群、客戶端-服務(wù)器、點(diǎn)對(duì)點(diǎn)通信等場景而設(shè)計(jì)。
-
提供了技術(shù)和語言中立的REST API 接口。
-
支持以AJAX 方式調(diào)用 ActiveMQ。
-
ActiveMQ 可以輕松地與CXF、Axis 等 WebService 技術(shù)整合,以提供可靠的消息傳遞。
-
可以作為內(nèi)存中的JMS 提供者,非常適合 JMS 單元測試。
Kafka
1.Kafka 特點(diǎn):
???Kafka 最早是由LinkedIn 公司開發(fā)的一種分布式的基于 發(fā)布/訂閱 的消息系統(tǒng),后來成為 Apache 的頂級(jí)項(xiàng)目。其主要特點(diǎn)如下: -
同時(shí)為發(fā)布和訂閱提供高吞吐量。(Kafka 的設(shè)計(jì)目標(biāo)是以時(shí)間復(fù)雜度為 O(1) 的方式提供消息持久化能力的,即使對(duì)TB級(jí)別以上數(shù)據(jù)也能保證常數(shù)時(shí)間的訪問性能,即使在非常廉價(jià)的商用機(jī)器上也能做到單機(jī)支持每秒 100K 條消息的傳輸)
-
消息持久化。 (將消息持久化到磁盤,因此可用于批量消費(fèi),例如 ETL 以及實(shí)時(shí)應(yīng)用程序。通過將數(shù)據(jù)持久化到硬盤以及復(fù)制可以防止數(shù)據(jù)丟失。)
-
分布式。 (支持服務(wù)器間的消息分區(qū)及分布式消費(fèi),同時(shí)保證每個(gè)Partition 內(nèi)的消息順序傳輸。其內(nèi)部的Producer、Broker 和 Consumer 都是分布式架構(gòu),這更易于向外擴(kuò)展。)
-
消費(fèi)消息采用 Pull 模式。(消息被處理的狀態(tài)是在 Consumer 端維護(hù)的,而不是由服務(wù)器端維護(hù),Broker 無狀態(tài),Consumer 自己保存offet。)
-
支持Online 和 Offline 場景,同時(shí)支持離線數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)處理。
五、RocketMQ
??1.RocketMQ 特點(diǎn):
???RocketMQ是阿里巴巴于2012年開源的分布式消息中間件,后來捐贈(zèng)給 Apache軟件基金會(huì),并于2017年9月25日成為Apache的頂級(jí)項(xiàng)目。作為經(jīng)歷過多次阿里巴巴“雙11” 這種“超級(jí)工程”的洗禮并有穩(wěn)定出色表現(xiàn)的國產(chǎn)中間件,以其高性能、低延遲和高可靠等特性近年來被越來越多的國內(nèi)企業(yè)所使用。其主要特點(diǎn)如下: -
具有靈活的可擴(kuò)展性。 (RocketMQ 天然支持集群,其核心四大組件(NameServer、Broker、Producer、Consumer)的每一個(gè)都可以在沒有單點(diǎn)故障的情況下進(jìn)行水平擴(kuò)展。)
-
具有海量消息堆積能力。 (RocketMQ 采用零拷貝原理實(shí)現(xiàn)了超大量消息的堆積能力,據(jù)說單機(jī)已經(jīng)可以支持億級(jí)消息堆積,而且在堆積了這么多消息后依然保持寫入低延遲)
-
支持順序消息。 (RocketMQ 可以保證消息消費(fèi)者按照消息發(fā)送的順序?qū)ο⑦M(jìn)行消費(fèi)。順序消息分為全局有序消息和局部有序消息,一般推薦使用局部有序消息,即生產(chǎn)者通過將某一類消息按順序發(fā)送至同一個(gè)隊(duì)列中來實(shí)現(xiàn)。)
-
支持多種消息過濾方式。 (消息過濾分為在服務(wù)器端過濾和在消費(fèi)端過濾。在服務(wù)器端過濾時(shí)可以按照消息消費(fèi)者的要求進(jìn)行過濾,優(yōu)點(diǎn)是減少了不必要的消息傳輸,缺點(diǎn)是增加了消息服務(wù)器的負(fù)擔(dān),實(shí)現(xiàn)相對(duì)復(fù)雜。消費(fèi)端過濾則完全由具體應(yīng)用自定義實(shí)現(xiàn),這種方式更加靈活,缺點(diǎn)是很多無用的消息會(huì)被傳輸給消息消費(fèi)者。)
-
支持事務(wù)消息。 (RocketMQ 除支持普通消息、順序消息之外,還支持事務(wù)消息,這個(gè)特性對(duì)于分布式事務(wù)來說提供了另一種解決思路。)
-
支持回溯消費(fèi)。 (回溯消費(fèi)是指對(duì)于消費(fèi)者已經(jīng)消費(fèi)成功的消息,由于業(yè)務(wù)需求需要重新消費(fèi)。RocketMQ 支持按照時(shí)間回溯消費(fèi),時(shí)間維度精確到毫秒,可以向前回溯,也可以向后回溯。)
下一篇我們介紹一下ngnix反向代理服務(wù)器及netty框架。
總結(jié)
以上是生活随笔為你收集整理的RPC常用消息中间件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ylmf OS 3.0 正式版 发布
- 下一篇: android u盘盘符乱码,U盘里出现