Spring Cloud Stream應用與自定義RocketMQ原理解析

概述

Spring Cloud Stream 簡介

Spring Cloud Stream 是一個用來為微服務應用構建消息驅動能力的框架。它可以基於Spring Boot 來創建獨立的,可用於生產的Spring 應用程序。他通過使用Spring Integration來連接消息代理中間件以實現消息事件驅動。Spring Cloud Stream 為一些供應商的消息中間件產品提供了個性化的自動化配置實現,引用了發佈-訂閱、消費組、分區的三個核心概念。Spring Cloud Stream目前僅支持RabbitMQ、Kafka。

消息隊列簡介

消息隊列中間件是分佈式系統中最為重要的組件之一,主要解決應用耦合,異步消息,流量削鋒等問題,是大型分佈式系統不可缺少的中間件。消息隊列技術是分佈式應用間交換信息的一種技術,消息可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀走。通過消息隊列,應用程序可以相對獨立地執行,它們不需要知道彼此的位置,只需要處理從消息隊列發送來的消息和向消息隊列發送消息。

消息隊列的主要特點是異步處理和解耦。其主要的使用場景就是將比較耗時而且不需要同步返回結果的操作作為消息放入消息隊列。同時由於使用了消息隊列,只要保證消息格式不變,消息的發送方和接受者並不需要彼此聯繫,也不需要受對方的影響,即解耦。

消息隊列的使用場景有:

  • 跨系統的異步通信,需要異步交互的場景都可以使用消息隊列。
  • 消息驅動的架構(EDA),系統分解為消息隊列,消息隊列製造者和消息隊列消費者,一個是處理流程可以根據需求拆分成多個階段,每個階段之間通過隊列連接起來。
  • 流量削鋒,它是消息隊列中的常用場景之一,一般在秒殺或團搶活動中使用廣泛。秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉,為解決這個問題,一般需要在應用前端加入消息隊列,來緩和流量的暴增。

在軟件的正常功能開發過程中,開發人員並不需要去刻意的尋找消息隊列的使用場景,而是當出現性能瓶頸時,去查看業務邏輯是否存在可以異步處理的耗時操作,如果存在的話便可以引入消息隊列來解決。否則盲目的使用消息隊列可能會增加維護和開發的成本卻無法得到可觀的性能提升,那就得不償失了。

常見的消息隊列

目前業界有四款常用的消息隊列,它們分別是RabbitMQ、RocketMQ、ActiveMQ和Kafka。我們這裡主要介紹前兩種。

RabbitMQ

RabbitMQ在2007年發佈,是一個在AMQP(高級消息隊列協議)基礎上完成的,可複用的企業消息系統,是當前最流行的消息中間件之一。 RabbitMQ的主要特性有:

  • 可靠性: RabbitMQ提供了多種技術可以讓你在性能和可靠性之間進行權衡。這些技術包括持久性機制、投遞確認、發佈者證實和高可用性機制;
  • 靈活的路由:消息在到達隊列前是通過交換機進行路由的。RabbitMQ為典型的路由邏輯提供了多種內置交換機類型。如果你有更復雜的路由需求,可以將這些交換機組合起來使用,你甚至可以實現自己的交換機類型,並且當做RabbitMQ的插件來使用;
  • 消息集群:在相同局域網中的多個RabbitMQ服務器可以聚合在一起,作為一個獨立的邏輯代理來使用;
  • 隊列高可用:隊列可以在集群中的機器上進行鏡像,以確保在硬件問題下還保證消息安全;
  • 多種協議的支持:RabbitMQ支持多種消息隊列協議;
  • 多語言支持:RabbitMQ的服務器端用Erlang語言編寫,其客戶端支持基本所有編程語言;
  • 管理界面: RabbitMQ有一個易用的用戶界面,使得用戶可以監控和管理消息Broker的許多方面;
  • 跟蹤機制:如果消息異常,RabbitMQ提供消息跟蹤機制,使用者可以跟蹤發現異常;
  • 插件機制:提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件;
Spring Cloud Stream應用與自定義RocketMQ原理解析

RabbitMQ的優點有:

  • 由於erlang語言的特性,mq 性能較好,高併發;
  • 健壯、穩定、易用、跨平臺、支持多種語言、文檔齊全;
  • 有消息確認機制和持久化機制,可靠性高;
  • 高度可定製的路由;
  • 管理界面較豐富,在互聯網公司也有較大規模的應用;
  • 社區活躍度高;

RabbitMQ的缺點有:

  • 儘管結合erlang語言本身的併發優勢,性能較好,但是不利於做二次開發和維護;
  • 實現了代理架構,意味著消息在發送到客戶端之前可以在中央節點上排隊。此特性使得RabbitMQ易於使用和部署,但是使得其運行速度較慢,因為中央節點增加了延遲,消息封裝後也比較大;
  • 需要學習比較複雜的接口和協議,學習和維護成本較高;

RocketMQ

RocketMQ出自阿里公司的開源產品,用 Java 語言實現,在設計時參考了 Kafka,並做出了自己的一些改進,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日誌流式處理,binglog分發等場景。

RocketMQ的主要特性有:

  • 是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分佈式特點;
  • Producer、Consumer、隊列都可以分佈式;
  • Producer向一些隊列輪流發送消息,隊列集合稱為Topic,Consumer如果做廣播消費,則一個consumer實例消費這個Topic對應的所有隊列,如果做集群消費,則多個Consumer實例平均消費這個topic對應的隊列集合;
  • 能夠保證嚴格的消息順序;
  • 提供豐富的消息拉取模式;
  • 高效的訂閱者水平擴展能力;
  • 實時的消息訂閱機制;
  • 億級消息堆積能力;
  • 較少的依賴;
Spring Cloud Stream應用與自定義RocketMQ原理解析

  • RocketMQ的優點有:單機支持 1 萬以上持久化隊列;
  • RocketMQ 的所有消息都是持久化的,先寫入系統 PAGECACHE,然後刷盤,可以保證內存與磁盤都有一份數據;
  • 模型簡單,接口易用(JMS 的接口很多場合並不太實用);
  • 性能非常好,可以大量堆積消息在broker中;
  • 支持多種消費,包括集群消費、廣播消費等。
  • 各個環節分佈式擴展設計,主從HA;

RocketMQ的缺點有:

  • 支持的客戶端語言不多,目前是java及c++,其中c++不成熟;
  • RocketMQ社區關注度及成熟度也不及前兩者;
  • 沒有web管理界面,提供了一個CLI(命令行界面)管理工具帶來查詢、管理和診斷各種問題;
  • 沒有在消息隊列的核心部分實現JMS等接口;

原理簡介

Spring Cloud Stream應用與自定義RocketMQ原理解析

如圖是Stream源碼的流程圖。Stream首先會動態註冊相關BeanDefinition,並且處理@StreamListener註解;然後在Bean實例初始化之後,會調用BindingService進行服務綁定;BindingService在綁定服務時會首先獲取特定的Binder綁定器,然後綁定Producer和Consumer;最後Stream的相關實例就會進行發送和接受消息的處理。


分享到:


相關文章: