1. 程式人生 > >Spring Cloud非同步場景分散式事務怎樣做?試試RocketMQ

Spring Cloud非同步場景分散式事務怎樣做?試試RocketMQ

一、背景

在微服務架構中,我們常常使用非同步化的手段來提升系統的 吞吐量 和 解耦 上下游,而構建非同步架構最常用的手段就是使用 訊息佇列(MQ),那非同步架構怎樣才能實現資料一致性呢?本文主要介紹如何使用RocketMQ事務訊息來解決一致性問題。

RocketMQ 是阿里巴巴開源的分散式訊息中介軟體,目前已成為 Apache 的頂級專案。歷經多次天貓雙十一海量訊息考驗,具有高效能、低延時和高可靠等特性

PS:同步場景怎樣保證一致性?請看文章《Spring Cloud同步場景分散式事務怎樣做?試試Seata》

 

二、MQ選型

可以看到在 業務處理 方面來說 RocketMQ

優於其他對手,而且原生支援 事務訊息

PS:業務系統用的是其他 MQ 產品但是又需要 事務訊息 怎麼辦?學習原理自己開發實現!

 

三、什麼是事務訊息

例如下圖的場景:生成訂單記錄 -> MQ -> 增加積分

我們是應該先 建立訂單記錄,還是先 傳送MQ訊息 呢?

  1. 先發送MQ訊息:這個明顯是不行的,因為如果訊息傳送成功,而訂單建立失敗的話是沒辦法把訊息收回來的

  2. 先建立訂單記錄:如果訂單建立成功後MQ訊息傳送失敗 丟擲異常,因為兩個操作都在本地事務中所以訂單資料是可以 回滾 的

上面的 方式二 看似沒問題,但是 網路是不可靠的!如果 MQ 的響應因為網路原因沒有收到,所以在面對不確定的結果只好進行回滾;但是 MQ

端又確實是收到了這條訊息的,只是回給客戶端的 響應丟失 了!
 
所以 事務訊息 就是用來保證 本地事務 與 MQ訊息傳送 的原子性!

 

四、RocketMQ事務訊息原理

主要的邏輯分為兩個流程:

  • 事務訊息傳送及提交:
    1. 傳送 half訊息
    2. MQ服務端 響應訊息寫入結果
    3. 根據傳送結果執行 本地事務(如果寫入失敗,此時half訊息對業務 不可見,本地邏輯不執行)
    4. 根據本地事務狀態執行 Commit 或者 Rollback(Commit操作生成訊息索引,訊息對消費者 可見)
       
  • 回查流程:
    1. 對於長時間沒有 Commit/Rollback 的事務訊息(pending
      狀態的訊息),從服務端發起一次 回查
    2. Producer 收到回查訊息,檢查回查訊息對應的 本地事務狀態
    3. 根據本地事務狀態,重新 Commit 或者 Rollback

 
邏輯時序圖

 

五、非同步架構一致性實現思路

從上面的原理可以發現 事務訊息 僅僅只是保證本地事務和MQ訊息傳送形成整體的 原子性,而投遞到MQ伺服器後,並無法保證消費者一定能消費成功!
 
如果 消費端消費失敗 後的處理方式,建議是記錄異常資訊然後 人工處理,並不建議回滾上游服務的資料(因為兩者是 解耦 的,而且 複雜度 太高)
 
我們可以利用 MQ 的兩個特性 重試死信佇列 來協助消費端處理:

  1. 消費失敗後進行一定次數的 重試
  2. 重試後也失敗的話該訊息丟進 死信佇列
  3. 另外起一個執行緒監聽消費 死信佇列 裡的訊息,記錄日誌並且預警!

因為有 重試 所以消費者需要實現 冪等性

 

六、分散式事務場景樣例

下面就用剛剛提到的場景:生成訂單記錄 -> MQ -> 增加積分;來簡單講一下 Spring Cloud 中應該怎麼做,詳細程式碼請 下載demo 檢視。
PS:怎樣安裝部署RocketMQ可以參考《Apache RocketMQ 訊息佇列部署與視覺化介面安裝》

6.1. 引入依賴

使用 spring-cloud-stream 框架來訪問 RocketMQ

Spring Cloud Stream 是一個構建訊息驅動的框架,通過抽象的定義實現應用與MQ訊息佇列之間的解耦,目前支援 RabbitMQkafkaRocketMQ

 

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
    流程如下:
    1. 訂單建立 成功
    2. 提交事務訊息 成功
    3. 消費訊息增加積分 成功
  • 訂單建立成功但提交事務訊息失敗
    http://localhost:11002/produceError
    流程如下:
    1. 訂單建立 成功
    2. 提交事務訊息 失敗
    3. 事務回查(等待1分鐘左右) 成功
    4. 提交事務訊息 成功
    5. 消費訊息增加積分 成功
  • 消費訊息失敗
    http://localhost:11002/consumeError
    流程如下:
    1. 訂單建立 成功
    2. 提交事務訊息 成功
    3. 消費訊息增加積分 失敗
    4. 重試消費訊息 失敗
    5. 進入死信佇列 成功
    6. 消費死信佇列的訊息 成功
    7. 記錄日誌併發出預警 成功

 

七、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實現