GitHub - berndruecker/trip-booking-saga-java:使用輕量級開源工作流引擎(Camunda) 實現Saga模式的示例
Saga模式描述瞭如何在沒有兩階段提交2PC的情況下解決分散式(業務)事務,因為2PC不能在分散式系統中擴充套件。Saga模式基本思路是將整個交易分解為多個步驟或活動。只有內部的步驟可以在原子事務中執行,但整體的一致性由Saga處理。Saga有責任完成整個業務交易或使系統處於已知的終止狀態。因此,如果出現錯誤,則應用業務回滾過程,該過程通過以相反順序呼叫補償步驟或活動來實現。可以更詳細地瞭解Sagas :如何在沒有兩階段提交的情況下實現複雜的業務交易
在該Github示例的酒店案例中(點選標題),汽車和航班預訂可能由不同的遠端服務完成。所以沒有技術事務,而只有業務事務。如果無法成功進行航班預訂,您需要取消酒店和汽車。
使用Camunda,您可以使用圖形建模或稱為Model-API的Java DSL來實現Saga。由於Camunda非常輕量級,您可以啟動所謂的流程引擎,定義Saga並通過幾行Java程式碼執行例項(如果使用預設配置和記憶體中的H2資料庫),請參閱TripBookingSaga.java:
public class TripBookingSaga { public static void main(String args) { // Configure and startup (in memory) engine ProcessEngine camunda = new StandaloneInMemProcessEngineConfiguration() .buildProcessEngine(); // define saga as BPMN process ProcessBuilder saga = Bpmn.createExecutableProcess("trip"); // - flow of activities and compensating actions saga.startEvent() .serviceTask("car").name("Reserve car").camundaClass(ReserveCarAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("car-compensate").name("Cancel car").camundaClass(CancelCarAdapter.class).compensationDone() .serviceTask("hotel").name("Book hotel").camundaClass(BookHotelAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("hotel-compensate").name("Hotel car").camundaClass(CancelCarAdapter.class).compensationDone() .serviceTask("flight").name("Book flight").camundaClass(BookFlightAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("flight-compensate").name("Cancel flight").camundaClass(CancelCarAdapter.class).compensationDone() .endEvent(); // - trigger compensation in case of any exception (other triggers are possible) saga.eventSubProcess() .startEvent().error("java.lang.Throwable") .intermediateThrowEvent().compensateEventDefinition().compensateEventDefinitionDone() .endEvent(); // finish Saga and deploy it to Camunda camunda.getRepositoryService().createDeployment() // .addModelInstance("trip.bpmn", saga.done()) // .deploy(); // now we can start running instances of our saga - its state will be persisted camunda.getRuntimeService().startProcessInstanceByKey("trip", Variables.putValue("name", "trip1")); camunda.getRuntimeService().startProcessInstanceByKey("trip", Variables.putValue("name", "trip2")); } } |
真正業務邏輯在介面卡類,如BookHotelAdapter.
上述定義可能看起來有點冗長,因為您必須使用BPMN術語。但是你可以編寫一個瘦的SagaBuilder來提高Saga定義的可讀性:
SagaBuilder saga = SagaBuilder.newSaga("trip") .activity("Reserve car", ReserveCarAdapter.class) .compensationActivity("Cancel car", CancelCarAdapter.class) .activity("Book hotel", BookHotelAdapter.class) .compensationActivity("Cancel hotel", CancelHotelAdapter.class) .activity("Book flight", BookFlightAdapter.class) .compensationActivity("Cancel flight", CancelFlightAdapter.class) .end() .triggerCompensationOnAnyError(); camunda.getRepositoryService().createDeployment() .addModelInstance(saga.getModel()) .deploy(); |
引擎將負責狀態處理,補償,還可以處理超時和升級。
在現實場景中,您可以以不同方式配置和執行Camunda引擎,例如使用Spring或Spring Boot。在這個例子中,您還可以使用Spring Boot應用程式來啟動應用程式 - 之後甚至可以連線Camundas視覺化工具。
相關專案:
Uber優步使用上述架構的案例:cadence-java-samples
相關文章
- 輕量級工作流引擎的設計與實現
- 使用Zeebe實現微服務工作流編排 - Berndruecker微服務
- 阿里開源!輕量級深度學習端側推理引擎 MNN阿里深度學習
- Orillusion 引擎正式開源!AIGC 時代下的 WebGPU 輕量級 3D 渲染引擎!AIGCWebGPU3D
- Facebook開源Hermes:輕量JavaScript優化引擎JavaScript優化
- Spring的輕量級實現Spring
- Camunda 流程引擎的一種 Adapter 層實現APT
- Facebook開源Hermes:輕量JavaScript最佳化引擎JavaScript
- 阿里巴巴開源輕量級深度神經網路推理引擎MNN阿里神經網路
- Spring 5| 輕量級的開源JavaEE框架SpringJava框架
- Golang web filter 輕量級實現GolangWebFilter
- PhalApi(π框架) - PHP輕量級開源介面框架API框架PHP
- 一個輕量級RPC的實現RPC
- Fastflow——基於golang的輕量級工作流框架ASTGolang框架
- PHP實現一個輕量級容器PHP
- Midori:輕量級開源 Web 瀏覽器Web瀏覽器
- 58同城開源其輕量級Web框架ArgoWeb框架Go
- 工作流引擎WorkFlow開源專案
- 輕量級工作流平臺優勢表現在哪些方面?
- 使用Conductor實現微服務架構中Saga模式微服務架構模式
- LambdaToSql(輕量級ORM) 入門篇 開源專案SQLORM
- 工作流引擎Activiti使用進階!詳細解析工作流框架中高階功能的使用示例框架
- 有人研究開源工作流引擎JBPM麼?
- 開源表單工作流引擎好用嗎?
- 輕量開源相簿 Album
- 1、Camunda工作流-介紹
- 使用 Redis 實現分散式系統輕量級協調技術Redis分散式
- zinc:替代elasticsearch的輕量級Go語言搜尋引擎ElasticsearchGo
- 死磕Synchronized底層實現–輕量級鎖synchronized
- 死磕Synchronized底層實現--輕量級鎖synchronized
- ActorLite:一個輕量級Actor模型實現(中)模型
- 開源輕量級 IM 框架 MobileIMSDK v6.1.2 釋出!框架
- 請各位推薦一個輕量級的工作流平臺
- 工作流引擎詳解!工作流開源框架ACtiviti的詳細配置以及安裝和使用框架
- Oracle釋出開源的輕量級 Java 微服務框架 HelidonOracleJava微服務框架
- 谷歌開源TFGAN:輕量級生成對抗網路工具庫谷歌
- 深度解析 Lucene 輕量級全文索引實現原理索引
- 開源輕量級 IM 框架 MobileIMSDK 的微信小程式端已釋出!框架微信小程式