一个无中心分布式事务架构的构思

2019-08-10注:此文作废,参见"Bag分布式事务:对SAGA分布式事务的改进 "一文,那个写的比较简单。

与Fescar这种比较复杂的、将分布式事务由一个单独的服务来支撑的架构不同,本文提出的架构不同点主要体现在以下两点:
1)它是无中心的,不需要架设单独的事务服务器,这在某些情况下,例如两个用户之间两两转账时,因为不需要中心服务器的支撑,性能高、实施容易,而且不会出现因为中心服务器的故障导致整个系统不可用的情况。
2)为简化起见,它只支持通过JDBC连接的Datasource,暂不考虑Dubbo等远程协议调用方式,因为通常分布式事务很多情况不是位于异地,而只是在同一个机房下的不同数据库之间。
因为分布式事务本身就比较复杂,本人的水平有限,可能这个架构中有什么逻辑错误没发现,还请指正。

先讲一下提交流程:
提交流程
简单说明:

  1. 整个流程以同时操作三个数据库为例,演示一个完整的分布式事务提交流程,红色字为用户必须提供的代码,蓝色部分即可以由用户实现,也可以由工具类实现,其余黑色字体部分则由工具来提供,用户不需要关心,以减少对业务的入侵。生成回滚SQL是一个比较繁琐的工作,如果完全交给工具实现(如Fescar),因为SQL的复杂性导致解晰和生成快照不是一件轻松的活,数据库兼容性有问题,目前Fescar还在改进中,距离可靠应用还有一段距离。如果交给用户,则工作量太大,不可行。我的一个初步设想是交给ORM工具层,由ORM工具来提供一些API,半自动、半手动地生成快照和回滚SQL,以达到最大的数据库兼容性。
  2. 这个分布式事务实现的原理是基于GTXID实现的全局事务锁,它是一个与业务相关的唯一ID,当GTXID一定时,即相当于锁定了相关的业务,其它需要用到这个业务资源的事务将不能重复获取这个全局事锁。 注意这是一个逻辑锁 ,并不能防范第三方或手工修改数据库字段打破数据一致性。以上概念与Fescar的全局事务锁是相通的。
  3. 对于分布式事务,它是一个拜占庭将军问题,是无解的,那么它是怎么保证事务的一致性的?在这里,不得不引入一个"事务正在处理中"这一中间状态,专门用来处理网络、硬件等故障造成的“事务有疑问”状态,工具类尽可能处理所有可能处理的情况,实在工具类不能处理时,则必须手工介入处理。以牺牲可用性来确保数据的最终一致性。
  4. 从逻辑上来说,它与Fescar的架构是等同的,只是将分布式事务服务器转移到了第一个DB上,更易于实施。在第一阶段,由程序员提供GTXID后,插入到第一个DB里,并删除以前的快照,重新生成一个数据库快照,以供回滚用,在第一个阶段,加锁逻辑、生成快照、业务逻辑是混合的。这里的第一个DB是与业务相关的,并不是固定的,通常由业务性质来决定谁是第一个DB。
  5. 如果第一阶段提交成功,则表示加锁成功,转入对其它数据库的提交。实际上,在第一个阶段,也可以将对其它数据库的事务打开,但不提交,如果有错误发生,直接将一阶段回滚,连锁都不用加了。
  6. 最后阶段,如果没有错误发生,进行解锁,运行delete from GCTX where gctxid='xxx' and status='空',如果删除成功,则整个分布式事务完成。

如果有错误发生,则会转入回滚流程:
回滚流程

回滚流程的原理与提交非常类似,而且除非是手工干预外,完全由工具类完成,这个部分就不多说了,看图就可以了。 
回滚流程的最后一步是将gctxid记录状态改为“回滚中”,防止它被删除,最后一步是执行delete from GCTX where gctxid='xxx' and status='回滚中',如果删除成功,则回滚成功,否则就需要人工干预了。通常需要人工干预的场合是软件逻辑错误、网络故障、硬件故障等。

转载于:https://my.oschina.net/drinkjava2/blog/3020260

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java物联网平台后端架构设计的关键是确保系统具备良好的可扩展性、高性能和稳定性,能够处理大量的设备连接、数据传输和业务逻辑。以下是一个可能的设计思路: 1. 技术选型:选择成熟稳定的Java开发框架,如Spring、Spring Boot和Spring Cloud,以及分布式消息队列Apache Kafka用于异步消息处理。使用MySQL或者NoSQL数据库存储设备和数据信息。 2. 架构设计:采用微服务架构,将系统划分为多个独立的服务单元,例如设备管理服务、数据接收服务、数据处理和分析服务、数据存储服务、用户管理服务等。每个服务拥有独立的数据存储和处理能力,可以独立扩展和部署。 3. 设备管理服务:处理设备的注册与认证,管理设备的状态和信息。为设备提供实时的状态监测和故障诊断,并支持设备的远程控制和固件升级。 4. 数据接收服务:接收来自设备的数据传输请求,提供数据接收的API接口和队列处理机制,确保数据的实时性和可靠性。 5. 数据处理和分析服务:对接收到的数据进行实时处理和分析,提取有价值的信息。可以使用流式计算框架(如Apache Storm或Spark Streaming)对数据进行实时处理,根据设定的规则进行数据过滤和判断,并将结果发送给其他服务或者存储到数据库中。 6. 数据存储服务:负责将处理后的数据存储到数据库中,可以选择关系型数据库(如MySQL)或者NoSQL数据库(如MongoDB)来存储设备和数据信息,根据实际需求设计存储方案。 7. 用户管理服务:处理用户的注册、登录和权限管理等功能。为用户提供API接口或者网页前端,管理用户信息和权限控制。 8. 安全策略:确保系统具备高安全性,包括设备认证、数据传输加密、权限控制等。采用HTTPS协议进行数据传输,使用加密算法对敏感数据进行加密。 9. 监控和日志:设置系统监控和错误日志,确保对系统进行实时监测,及时发现和处理问题。 10. 云平台适配:可以考虑将该物联网平台适配到常用的云平台(如AWS或阿里云),利用云服务的弹性和扩展性。 以上是一个大致的Java物联网平台后端架构设计思路,具体的实现还需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值