分布式系统中关于转账案例的剖析
2017-04-28 16:22
225 查看
1. 转账案例分析:
以案例1-转账为例,我们把用户A给用户B转账分成四个阶段,第一个阶段用户A准备转账,第二个阶段从用户A账户扣减余额,第三个阶段对用户B增加余额,第四个阶段完成转账。
系统需要记录操作过程中每一步骤的状态,一旦系统出现故障,系统能够自动发现没有完成的任务,然后,根据任务所处的状态,继续执行任务,最终完成任务,达到一致的最终状态。
2. 实际情况分析:
在实际应用中,上面这个过程通常是通过持久化执行任务的状态和环境信息,一旦出现问题,定时任务会捞取未执行完的任务,继续未执行完的任务,直到执行完成为止,或者取消已经完成的部分操作回到原始状态。
3 这种做法的弊端:
这种方法在任务完成每个阶段的时候,都要更新数据库中任务的状态,这在大规模高并发系统中不会有太好的性能,一个更好的办法是用 Write-Ahead Log(写前日志),这和数据库的 Bin Log(操作日志)相似,在做每一个操作步骤,都先写入日志,如果操作遇到问题而停止的时候,可以读取日志按照步骤进行恢复,并且继续执行未完成的工作,最后达到一致。
4. 写前日志的优势:
写前日志可以利用机械硬盘的追加写而达到较好性能,因此,这是一种专业化的实现方式,多数业务系系统还是使用数据库记录的字段来记录任务的执行状态,也就是记录中间的“软状态”,一个任务的状态流转一般可以通过数据库的行级锁来实现,这比使用 Write-Ahead Log 实现更简单、更快速。
以案例1-转账为例,我们把用户A给用户B转账分成四个阶段,第一个阶段用户A准备转账,第二个阶段从用户A账户扣减余额,第三个阶段对用户B增加余额,第四个阶段完成转账。
系统需要记录操作过程中每一步骤的状态,一旦系统出现故障,系统能够自动发现没有完成的任务,然后,根据任务所处的状态,继续执行任务,最终完成任务,达到一致的最终状态。
2. 实际情况分析:
在实际应用中,上面这个过程通常是通过持久化执行任务的状态和环境信息,一旦出现问题,定时任务会捞取未执行完的任务,继续未执行完的任务,直到执行完成为止,或者取消已经完成的部分操作回到原始状态。
3 这种做法的弊端:
这种方法在任务完成每个阶段的时候,都要更新数据库中任务的状态,这在大规模高并发系统中不会有太好的性能,一个更好的办法是用 Write-Ahead Log(写前日志),这和数据库的 Bin Log(操作日志)相似,在做每一个操作步骤,都先写入日志,如果操作遇到问题而停止的时候,可以读取日志按照步骤进行恢复,并且继续执行未完成的工作,最后达到一致。
4. 写前日志的优势:
写前日志可以利用机械硬盘的追加写而达到较好性能,因此,这是一种专业化的实现方式,多数业务系系统还是使用数据库记录的字段来记录任务的执行状态,也就是记录中间的“软状态”,一个任务的状态流转一般可以通过数据库的行级锁来实现,这比使用 Write-Ahead Log 实现更简单、更快速。
相关文章推荐
- 关于ERP系统库存误差的原因剖析
- 推荐系统的应用案例剖析
- 大型JavaWeb分布式系统中关于maven多模块构建以及代码依赖管理
- 关于分布式文件存储系统问题的自我思考
- 关于分布式系统的研究
- 分布式系统选举算法剖析
- Kafka剖析(一):高扩展、高吞吐的分布式消息系统初探
- 【分布式】关于分布式系统的思考
- 支付系统转账过程中并发交易引起的分布式死锁问题
- 关于公交系统中运用NFC-TSM技术进行移动支付的解决案例浅析
- Android 关于系统Context.getSystemService(String arg0)获取系统服务的详细剖析-getSystemService
- [整理]关于分布式系统的简介
- Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!
- 分布式系统迁移Docker云案例分享
- 书籍-分布式系统常用技术及案例分析
- 分布式系统选举算法剖析
- 架构设计分享一:关于分布式系统的数据一致性问题(一)
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 高性能的分布式内存缓存服务器系统——memcached核心原理详细剖析
- 关于hadoop2.4.1伪分布式系统的搭建