实例介绍
Saga模式是解决分布式(业务)事务问题的一种模式,它通过将整体事务分解为多个步骤或活动来避免使用不适用于分布式系统的两阶段提交。每个步骤内部可以进行原子事务操作,而整体的一致性由Saga负责保证。在出现错误时,Saga会通过以相反顺序调用补偿步骤或活动的方式,确保业务回滚,从而使系统处于已知的终止状态。
在旅行预订的例子中,酒店、汽车和航班的预订可能由不同的远程服务完成。这里不存在技术层面的事务,而是业务事务。如果航班预订未能成功执行,您需要取消酒店和汽车的预订。
通过Camunda,您可以通过使用Camunda Modeler创建的BPMN XML文件(或Java DSL,但目前C#不可用)来实现Saga。
var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
camunda.RepositoryService.Deploy("trip-booking", new List<object> {
FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
});
// 注册工作器
registerWorker("reserve-car", externalTask => {
Console.WriteLine("正在预订汽车...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
// 注册更多工作器...
StartPolling();
string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary<string, object>()
{
{"someBookingData", "..." }
});
}
这个过程展示了如何通过回调实现真正的逻辑,工作流引擎将负责状态处理、补偿以及可能的超时和升级处理。
【实例截图】
【核心代码】
文件清单
└── flowing-trip-booking-saga-c-sharp-0da9eaaab4a50330d4c4fcb18f4bffb8e9e67f4c
├── adapter
│ ├── BookCarAdapter.cs
│ ├── BookFlightAdapter.cs
│ ├── BookHotelAdapter.cs
│ ├── CancelCarAdapter.cs
│ ├── CancelFlightAdapter.cs
│ └── CancelHotelAdapter.cs
├── App.config
├── docs
│ ├── example-bpmn.png
│ ├── example-use-case.png
│ └── screenshot.png
├── FlowingTripBookingSaga.csproj
├── FlowingTripBookingSaga.sln
├── LICENSE
├── Models
│ └── FlowingTripBookingSaga.bpmn
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
└── README.md
5 directories, 17 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论