分布式消息(事件)驅動
1、簡介
事件驅動架構(Event-driven 架構,簡稱 EDA)是軟件設計領域內的一套程序設計模型。
這套模型的意義是所有的操作通過事件的發送/接收來完成。
傳統軟件設計
舉個例子,比如一個訂單的創建在傳統軟件設計中服務端通過接口暴露創建訂單的動作,然后客戶端訪問創建訂單。
事件驅動設計
在事件驅動設計里,訂單的創建通過接收訂單事件來完成,這個過程中有事件發送者和事件接受者這兩個模塊,事件發送者的作用是發送訂單事件,事件接受者的作用的接收訂單事件。
2、Spring 消息編程模型
不同的消息中間件發送消息的代碼:
可以看出,每個消息中間件都有自己的消息模型編程。
統一模型
Spring 生態里有兩個消息相關的模塊和項目,分別是 spring-messaging 模塊和 Spring Integration 項目,它們對消息的編程模型進行了統一,不論是 Apache RocketMQ 的 Message,或者是 Apache Kafka 的 ProducerRecord,都被統一稱為 org.springframework.messaging.Message
接口。
Message 接口有兩個方法,分別是 getPayload
以及 getHeaders
用于獲取消息體以及消息頭。這也意味著一個消息 Message 由 Header 和 Payload 組成。
Payload 是一個泛型,意味是消息體可以放任意數據類型。Header 是一個 MessageHeaders 類型的消息頭。
有了消息之后,這個消息被發送到哪里呢?
Spring 提供了消息通道 MessageChannel 的概念。消息可以被發送到消息通道里,然后再通過消息處理器 MessageHandler 去處理消息通道里的消息。
如果消息通道里只有 1 個消息,但是消息處理器有 N 個,這個時候要被哪個消息處理器處理呢?
這里又涉及一個消息分發器的問題。
- UnicastingDispatcher 表示單播的處理方式,消息會通過負載均衡被分發到某一個消息處理器上(默認)
- BroadcastingDispatcher 表示廣播的方式,消息會被所有的消息處理器處理。
3、Spring Cloud Stream
Spring Cloud Stream 是一套基于消息的事件驅動開發框架,它提供了一套全新的消息編程模型,此模型屏蔽了底層具體消息中間件的使用方式。開發者們使用這套模型可以完成基于消息的事件驅動應用開發。
Spring Cloud Stream 在上面說到的 spring-messaging 和 Spring Integration 項目的基礎上再進行了一些封裝,提出一些新的概念,讓開發者能夠更簡單地使用這套消息編程模型。
最佳實踐
參考筆者另一篇文章:https://cmty256.github.io/pages/d67430/#%E4%BB%80%E4%B9%88%E6%98%AF-spring-cloud-stream
參考書籍
重磅下載 | Java 開發者必備手冊《Spring Cloud Alibaba 從入門到實戰》,阿里雙11同款!-阿里云開發者社區 (aliyun.com)