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