1. 程式人生 > >如何一步步設計一款微服務的補償方案

如何一步步設計一款微服務的補償方案

背景

隨著微服務化的系統越來越多,系統間的互動也呈現幾何倍增的趨勢,系統間面臨一致性問題越來越突出。為了保障服務提供方與服務消費方的一致性,特別是面臨最大努力通知型或補償性的技術需求,服務化前做法是服務提供方需手寫重試策略及各種配置->持久化訊息->定時去處理訊息等。它帶來的以下問題是:
1.客戶端(新微服務)要做的重複性工作越來越多?需每個開發者熟悉它,去實現它;
2.這個為什麼這樣個性化?標準不統一,出錯率上升;
3.說好的快速響應呢?我要做的狠簡單,最好一行程式碼就可以實現它;
4.維護成本上升;

接入須知

執行環境

  • spring3.2.12(內部大多系統使用);
  • springcloud Brixton系列(新系統);

客戶端與服務端遵循規約

  • 接入系統(服務消費方)retry的程式碼塊的顆粒度要求,但凡發起的remote呼叫,可獨立為一個方法,方法內不允許有前置或後置處理,確保粒度控制在遠端呼叫領域;
  • 服務呼叫方的介面需滿足冪等性設計;
  • 接入系統(服務消費方),為了避免理解有歧義,使用範圍更規範,retry的作用於僅限於RetryCallable規約介面的實現方

功能特性

retry-client

  1. 全域性開關,可配置自動掃描並注入;

  2. 重試配置級別定義,支援類級和方法級(存在優先順序);

  3. 重試配置項支援:

    • include:支援的異常,型別:Class<? extends Throwable>[]
    • execPolicy:執行策略,默認同步
    • maxAttempts:重試次數,預設為3
    • delay:延遲執行毫秒數,預設為0
    • multiplier:重試執行間隔,預設為0
    • recoverMethod:回退的方法,重試失敗後執行的方法,預設為null
    • callbackUrl:回撥的url(相對url),預設為null,不支援回撥
    • isSendQueue:是否傳送佇列,預設true
    • ..
  4. 同步策略,支援阻塞一直到成功或失敗(最大次數);

  5. 非同步策略,首次失敗後,直接返回客戶端(需處理中間狀態),後續一直重試,成功則回撥;

  6. 回撥支援,主要是針對非同步策略,客戶端需提供回撥介面;

  7. 回退支援,可自定義通常達到最大次數後執行;

  8. 重試失敗訊息落地,支援傳送MQ

retry-server

  1. 消費訊息並落地;
  2. 定時處理庫存中的請求,直到成功;
  3. 可根據errorcode進行配置終止重試;
  4. 成功時支援回撥;
  5. 失敗時傳送簡訊和郵件給系統責任人
  6. 實現報表統計功能,可以展示top10介面呼叫失敗後重試的情況

尚未實現

  1. retry-server 在執行重試或回撥時,目標服務需提供無狀態介面(不攜帶cookie),對身份授權有依賴需關注;
  2. retry-server 執行重試間隔暫時不按照retry-client宣告的定義,它統一集中化配置在專案中;
  3. retry-client 目前僅限於發起的esb,feign(springcloud)呼叫,至於要支援各種業務程式碼方法的重試(遠端方面需慎重考慮)

設計要求

  • 無侵入:不改動當前的業務邏輯,對於需要重試的地方,可以很簡單的實現;
  • 通用性:可自定義包括重試次數,重試的間隔時間,是否使用非同步方式等配置;
  • 拓展性:關鍵實現的可替換(SPI),同時API設計滿足開放閉合原則;
  • 健壯性:可監聽所以關鍵的實現,便於排查問題,支援各種異常情況的處理,支援當前springcloud及spring3.x版本系列的接入;

具體實現

元件設計

元件

互動時序

時序

資料模型

模型

核心實現

主要調研了2款開源元件,spring-retry和guava-retry,從實現上來看2款基本上都可以滿足當下的需求。但最後還是選擇spring-retry,為何沒選擇guava-retry呢?首先講,它不是不好,而是功能特性太單一(10分鐘就可以讀懂原始碼)、多例項的實現(每個method都要一個Retryer),改造成本不小。
spring-retry源於spring-batch,功能非常強大,還有熔斷機制,拓展性強,下面介紹它的一些元件:
  • RetryTemplate:包含execute,有沒有種很熟悉的感覺,想想JdbcTemplate....
  • RetryListener: aop切中它包含的方法,就會執行它的監聽
  • RetryConfiguration:定義了切面和通知,它包含AnnotationAwareRetryOperationsInterceptor
  • AnnotationAwareRetryOperationsInterceptor:它其實就是個MethodInterceptor①實現,它invoke主要構建RetryTemplate並執行execute,說起來簡單。但它又稍微對其進行了封裝,根據註解宣告,可以利用StatelessRetryInterceptorBuilder、StatefulRetryInterceptorBuilder、StatelessRetryInterceptorBuilder生成不同MethodInterceptor②的目標執行方法。最後再強調①的職責解析retry註解,並生成對應的②的例項,②的職責是執行真實的呼叫,並執行retry(注:②未必一定要定義為MethodInterceptor,其實可以把它看做一種規約而非AOP實現)。
  • 最後,我們的核心實現上,如果定製化高改造①,如果定製化不高可以①->③(新增個性化)->②

快速開始

配置介紹

包含註解的說明,回撥Api的設計

可拓展實現

示例程式

相關推薦

如何步步設計服務補償方案

背景 隨著微服務化的系統越來越多,系統間的互動也呈現幾何倍增的趨勢,系統間面臨一致性問題越來越突出。為了保障服務提供方與服務消費方的一致性,特別是面臨最大努力通知型或補償性的技術需求,服務化前做法是服

文帶你瞭解服務架構和設計(多圖)

![南嶽衡陽(封面)](https://pcloud-1258173945.cos.ap-guangzhou.myqcloud.com/uPic/b670310e76c4381777a7eb437048e9d8的副本.jpg) 最近幾年微服務很火,大家都在建設微服務,如果不懂點微服務相關的技術,都不好意

Spring Boot實戰系列《》:大白話說服務架構

Spring Boot實戰系列《一》:大白話說微服務架構 本文是博主本人在面臨著即將畢業工作前,為了更深程度的早日融入社會企業文化中,而本人不太喜歡官方的一大堆專用名詞聽不太懂,一般來說,我都會學習完以後,轉為自己的白話來理解,所以難免有失偏頗之處,請看官們取其精華即可。 在學習

用普通話說服務系列() 單體應用到服務的進化

從工作體驗切入 開始部署應用                    在很久很久以前,開發與部署web應用時,一開始都是很開心地寫完‘整個

SpringCloud 初始():什麼是服務

轉載自:https://blog.csdn.net/wuxiaobingandbob/article/details/78642020?locationNum=1&fps=1 一、微服務介紹 1. 什麼是微服務       在介紹微服務時,首先得先理

跟我步步探尋打系統的建立過程

1.專案背景 初始階段 業務方訂單稽核通過後,會有離線任務不斷輪訓向支付中心發起呼叫,支付中心打款處理完成後會返回ifSuccess(是否落庫),state,code,error Message等。如果落庫且code為打款成功,訂單業務狀態會修改為打款成功。 發

服務架構學習筆記():重新認識服務

一、什麼是微服務 微服務(Microservice)是服務化思路的一種最佳實踐方向,遵循SOA的思路,各個企業在服務化治理的道路上走的時間長了,踩的坑多了,整個軟體交付鏈路上各個環節的基礎設施逐漸成熟了,微服務自然而然就誕生了。 早些年的服務實現和實施思路是將很多功能從開發到交付都打包成一個

次Spring Cloud Session服務間傳遞丟失問題定位

       在構建基於Spring Cloud微服務框架時,使用了常用的框架NGINX+ZUUL+Eureka+業務服務,Session使用Spring boot的Redis整合,所有微服務間共享Session。    所有業務的微服務Rest介面前臺呼叫介面通過ZUUL進

Docker實戰 | 第二篇:IDEA整合Docker外掛實現鍵自動打包部署服務專案,一勞永逸的技術手段值得

## 一. 前言 大家在自己玩微服務專案的時候,動輒十幾個服務,每次修改逐一部署繁瑣不說也會浪費越來越多時間,所以本篇整理通過一次性配置實現一鍵部署微服務,實現真正所謂的一勞永逸。 ## 二. 配置伺服器 ### 1. Docker安裝 伺服器需要安裝Docker,如未安裝參考這篇文章安裝即可 [

想要設計自己的服務?看這篇文章就對了

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文通過使用Spring Boot,Spring Cloud和Docker構建的概念驗證應用程式的示例,為了解常見的微服務架構模式提供了一個起點。 該程式碼在Github上可用,並且可以在Doc

Spring Cloud下服務許可權方案

背景從傳統的單體應用轉型Spring Cloud的朋友都在問我,Spring Cloud下的微服務許可權怎麼管?怎麼設計比較合理?從大層面講叫服務許可權,往小處拆分,分別為三塊:使用者認證、使用者許可權、服務校驗。 使用者認證傳統的單體應用可能習慣了session的存在,而到了Spring cloud的微服

幾種常見的服務架構方案簡述——ZeroC IceGrid、Spring Cloud、基於訊息佇列

2017-07-26 http://www.broadview.com.cn/article/348 微服務架構是當前很熱門的一個概念,它不是憑空產生的,是技術發展的必然結果。雖然微服務架構沒有公認的技術標準和規範草案,但業界已經有一些很有影響力的開源微服務架構平臺,架構師可以根據公司的技術實力並結合專案

基於開源,強於開源,輕舟服務解決方案深度解讀

img 資源利用率 難題 行業 快遞 功率 專題 分布式數據庫 blog 歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。2018年7月31日,由杭州市政府、賽迪以及網易主辦的“2018中國杭州雲創大會”於杭州國際博覽中心如期舉辦,大會以“開放·生態·賦能”為主題,匯聚行

談談華為服務解決方案與實踐(上)

華為雲微服務引擎的前世今生 華為從12年開始在很多創新專案裡應用微服務技術,在14年隨著微服務框架技術越來越成熟,工具越來越完善,公司各個產品線開始基於微服務框架做雲化產品,16年的時候公司為了更好的進行能力共享,決策把散落在公司各個產品線的一些與微服務相關的工具、平臺、框架和團隊統一整合

服務解決方案Apache ServiceComb(incubating) 釋出新版本

       近期,微服務解決方案Apache ServiceComb(incubating) 捷報頻傳,除了LC3大會ServiceComb Workshop成功舉辦之外,Java-Chassis 1.0.0-m2、Service-Center 1.0.0-

.net core——打造自己的 dotnet new 服務解決方案模板

目錄 1. 建立新的微服務 2.準備環境 3.以現有的微服務專案為模板 4.分發模板 5.nuget pack打包 6.本地安裝 7.使用新模板 8.完整程式碼參看github 引用連結 1. 建立新的微

Spring Cloud服務解決方案④:Feign的使用

Feign是一個宣告web服務客戶端,這便得編寫web服務客戶端更容易,使用Feign 建立一個介面並對它進行註解,它具有可插拔的註解支援包括Feign註解與JAX-RS註解,Feign還支援可插拔的編碼器與解碼器,Spring Cloud 增加了對 Spring MVC的註解,Spring W

Spring Cloud服務解決方案③:Ribbon的使用

  先來一段介紹: Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務呼叫。Spring C

Spring Cloud服務解決方案 ②:註冊服務到Eureka上

首先你的把上一篇文章中的Eureka服務啟動起來,原始碼地址:https://download.csdn.net/download/qq_22075041/10851487 本文對應microservice-consumer-movie和microservice-provider-user子

Spring Cloud服務解決方案①:Eureka服務端的構建

Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,以實現SpringCloud的服務發現功能。包含兩個元件:Eureka Server和Eureka Client。 Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中