Spring Cloud非同步場景分散式事務怎樣做?試試RocketMQ
一、背景
在微服務架構中,我們常常使用非同步化的手段來提升系統的 吞吐量 和 解耦 上下游,而構建非同步架構最常用的手段就是使用 訊息佇列(MQ)
,那非同步架構怎樣才能實現資料一致性呢?本文主要介紹如何使用RocketMQ
的事務訊息
來解決一致性問題。
RocketMQ 是阿里巴巴開源的分散式訊息中介軟體,目前已成為 Apache 的頂級專案。歷經多次天貓雙十一海量訊息考驗,具有高效能、低延時和高可靠等特性
PS:同步場景怎樣保證一致性?請看文章《Spring Cloud同步場景分散式事務怎樣做?試試Seata》
二、MQ選型
可以看到在 業務處理 方面來說 RocketMQ
PS:業務系統用的是其他 MQ
產品但是又需要 事務訊息 怎麼辦?學習原理自己開發實現!
三、什麼是事務訊息
例如下圖的場景:生成訂單記錄 -> MQ -> 增加積分
我們是應該先 建立訂單記錄,還是先 傳送MQ訊息 呢?
先發送MQ訊息:這個明顯是不行的,因為如果訊息傳送成功,而訂單建立失敗的話是沒辦法把訊息收回來的
先建立訂單記錄:如果訂單建立成功後MQ訊息傳送失敗 丟擲異常,因為兩個操作都在本地事務中所以訂單資料是可以 回滾 的
上面的 方式二 看似沒問題,但是 網路是不可靠的!如果 MQ
的響應因為網路原因沒有收到,所以在面對不確定的結果只好進行回滾;但是 MQ
所以
事務訊息
就是用來保證 本地事務 與 MQ訊息傳送 的原子性!
四、RocketMQ事務訊息原理
主要的邏輯分為兩個流程:
- 事務訊息傳送及提交:
- 傳送
half訊息
MQ服務端
響應訊息寫入結果- 根據傳送結果執行
本地事務
(如果寫入失敗,此時half訊息對業務 不可見,本地邏輯不執行) - 根據本地事務狀態執行
Commit
或者Rollback
(Commit操作生成訊息索引,訊息對消費者 可見)
- 傳送
- 回查流程:
- 對於長時間沒有
Commit/Rollback
的事務訊息(pending
Producer
收到回查訊息,檢查回查訊息對應的本地事務狀態
- 根據本地事務狀態,重新
Commit
或者Rollback
- 對於長時間沒有
邏輯時序圖
五、非同步架構一致性實現思路
從上面的原理可以發現 事務訊息
僅僅只是保證本地事務和MQ訊息傳送形成整體的 原子性
,而投遞到MQ伺服器後,並無法保證消費者一定能消費成功!
如果 消費端消費失敗 後的處理方式,建議是記錄異常資訊然後 人工處理,並不建議回滾上游服務的資料(因為兩者是 解耦 的,而且 複雜度 太高)
我們可以利用 MQ
的兩個特性 重試
和 死信佇列
來協助消費端處理:
- 消費失敗後進行一定次數的
重試
- 重試後也失敗的話該訊息丟進
死信佇列
裡 - 另外起一個執行緒監聽消費
死信佇列
裡的訊息,記錄日誌並且預警!
因為有 重試
所以消費者需要實現 冪等性
六、分散式事務場景樣例
下面就用剛剛提到的場景:生成訂單記錄 -> MQ -> 增加積分;來簡單講一下 Spring Cloud
中應該怎麼做,詳細程式碼請 下載demo 檢視。
PS:怎樣安裝部署RocketMQ可以參考《Apache RocketMQ 訊息佇列部署與視覺化介面安裝》
6.1. 引入依賴
使用 spring-cloud-stream
框架來訪問 RocketMQ
Spring Cloud Stream 是一個構建訊息驅動的框架,通過抽象的定義實現應用與MQ訊息佇列之間的解耦,目前支援
RabbitMQ
、kafka
和RocketMQ
6.2. 開啟事務訊息
訊息生產者需要新增 transactional: true
開啟 事務訊息
6.3. 訂單服務傳送half訊息
因為開啟了
事務訊息
所以這裡傳送的是half訊息
對於消費端是不可見
的
6.4. 訂單服務監聽half訊息
使用 @RocketMQTransactionListener
註解監聽 半訊息,並實現 RocketMQLocalTransactionListener
介面,該介面有兩個方法
- executeLocalTransaction:用於提交本地事務
- checkLocalTransaction:用於事務回查
如果提交事務訊息失敗,需等待約1分鐘左右 事務回查 方法才會被呼叫
6.5. 積分服務消費訊息
注意:因為有
重試
,這裡如果是真實的業務需要自行實現冪等性
6.6. 消費死信佇列預警
監聽並消費死信佇列中的訊息,用於記錄錯誤日誌,並且預警通知運維人員等
6.7. 測試用例
demo中提供了3個介面分別測試不同的場景:
- 事務成功
http://localhost:11002/success
流程如下:- 訂單建立 成功
- 提交事務訊息 成功
- 消費訊息增加積分 成功
- 訂單建立成功但提交事務訊息失敗
http://localhost:11002/produceError
流程如下:- 訂單建立 成功
- 提交事務訊息 失敗
- 事務回查(等待1分鐘左右) 成功
- 提交事務訊息 成功
- 消費訊息增加積分 成功
- 消費訊息失敗
http://localhost:11002/consumeError
流程如下:- 訂單建立 成功
- 提交事務訊息 成功
- 消費訊息增加積分 失敗
- 重試消費訊息 失敗
- 進入死信佇列 成功
- 消費死信佇列的訊息 成功
- 記錄日誌併發出預警 成功
七、demo下載地址
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/rocketmq-demo/rocketmq-transactional
推薦閱讀
- 日誌排查問題困難?分散式日誌鏈路跟蹤來幫你
- zuul整合Sentinel最新的閘道器流控元件
- 阿里註冊中心Nacos生產部署方案
- Spring Boot自定義配置項在IDE裡面實現自動提示
- Spring Cloud Zuul的動態路由怎樣做?整合Nacos實現很簡單
- Spring Cloud開發人員如何解決服務衝突和例項亂竄?
- Spring Cloud同步場景分散式事務怎樣做?試試Seata
掃碼關注有驚喜!
相關推薦
Spring Cloud非同步場景分散式事務怎樣做?試試RocketMQ
一、背景 在微服務架構中,我們常常使用非同步化的手段來提升系統的 吞吐量 和 解耦 上下游,而構建非同步架構最常用的手段就是使用 訊息佇列(MQ),那非同步架構怎樣才能實現資料一致性呢?本文主要介紹如何使用RocketMQ的事務訊息來解決一致性問題。 RocketMQ 是阿里巴巴開源的分散式訊息中介軟體
Spring Cloud同步場景分散式事務怎樣做?試試Seata
一、概述 在微服務架構下,雖然我們會盡量避免分散式事務,但是隻要業務複雜的情況下這是一個繞不開的問題,如何保證業務資料一致性呢?本文主要介紹同步場景下使用Seata的AT模式來解決一致性問題。 Seata是 阿里巴巴 開源的 一站式分散式事務解決方案 中介軟體,以 高效 並且對業務 0 侵入 的方式,解
Java架構-(三)spring cloud微服務分散式雲架構 - Spring Cloud整合專案簡介
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cloud C
Java架構-(二)spring cloud微服務分散式雲架構 - 整合企業架構的技術點
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring T
Java架構-(一)spring cloud微服務分散式雲架構 - Spring Cloud簡介
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring C
Spring+JTA+Atomikos+mybatis分散式事務管理
背景描述:我們平時的工作中用到的Spring事務管理是管理一個數據源的。但是如果對多個數據源進行事務管理該怎麼辦呢?我們可以用JTA和Atomikos結合Spring來實現一個分散式事務管理的功能。 事務(官方解釋):是由一組sql語句組成的“邏輯處理單元”。 事務具有
(二)spring cloud微服務分散式雲架構-整合企業架構的技術點
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring T
(一)spring cloud微服務分散式雲架構-Spring Cloud簡介
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud將目
基於spring-cloud-config的分散式git配置更新
首先我們新建一個模組server-config 需要安裝rabbitmq,用於推送配置 https://www.cnblogs.com/ericli-ericli/p/5902270.html 引入依賴: pom.xml <?xml version="1.0" en
Spring Cloud (四): 分散式環境下自動發現配置服務
前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I
Spring Cloud微服務分散式雲架構-整合專案
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cl
(一)spring cloud微服務分散式雲架構
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Sp
Spring Cloud入門:分散式配置中心(Spring Cloud Config)
文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4。 1 Spring Cloud Config Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設
spring cloud微服務分散式雲架構
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Sp
Java架構-(二)spring cloud微服務分散式雲架構
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js
Java架構-(三)spring cloud微服務分散式雲架構
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spr
(二)Spring Cloud實踐:使用Spring Cloud Config實現分散式配置管理
Spring Cloud Config為微服務應用提供了統一的分散式配置管理,將配置檔案放到git上,所有的微服務應用均從git上獲取這些配置檔案。 該種情況下,如果將配置檔案放在第三方提供的版本控制器上,需要網路可訪問,另外,也可以自己搭建gitlab私服,來存放自己的
(二)spring cloud微服務分散式雲架構
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring Tag、React、angula
(三)spring cloud微服務分散式雲架構
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cl
Spring Cloud config搭建分散式配置中心
通常情況下,我們將配置檔案放在各自的服務中,這樣有個缺點,就是每次修改,要重啟服務。如今微服務這麼流行的趨勢下,一個大專案下會有幾十甚至上百上千個微服務組成。這時候就需要一個統一配置管理了。Spring Cloud config 就很好的解決了這一問題。下圖是Config實現