前言

  • 在工作中,我碰到了分布式系统数据一致性的问题,开始的解决方案是写补偿方法,缺点明显,侵入业务严重,而且每个业务方法都要写类似的容错代码,于是网上找没有侵入的分布式事务解决方案。 XA/JTA协议的框架侵入性小,但是性能低下,整个事务期间都会锁住数据,主流框架是ATOMIKOS和JOTM,不支持dubbo,然后又找了阿里的GTS,遗憾的是GTS收费且不开源,那就自己写一个
  • meepo基于byteJta,byteJta是一个典型的两阶段提交协议(原理:https://www.w3cschool.cn/architectroad/architectroad-two-phase-commit.html),JTA规范的框架,支持dubbo和springcloud,方便改写

meepo 是什么?有什么功能?

  • meepo是一款高性能、接入简单的分布式事务中间件,用于解决分布式环境下的事务一致性问题的JTA开源方案。github地址
  • 支持dubbo框架进行分布式事务(后续会添加springcloud)。
  • 可以保证分布式系统中的分布式事务的 ACID 特性。 支持 Oracle、MySQL、Postgresql 等关系型数据库
  • meepo是阿里GTS的一个开源实现,按GTS的流程实现各功能模块,同时限制条件也类似。比如事务里的表必须有主键;保证所有框架事务管理范围内的数据,都不会被框架管理范围外的系统所修改。GTS链接:https://help.aliyun.com/document_detail/56746.html?spm=a2c4g.11186623.6.589.cdEaX4
  • meepo的全局锁表中存储了记录的加锁信息。封锁的粒度是行(记录),锁的类型包括共享锁和互斥锁,对于同一个记录,加锁的规则是共享锁与共享锁不冲突,共享锁与互斥锁冲突、互斥锁与互斥锁冲突。对插入(INSERT)、修改(UPDATE)、删除(DELETE)、更新模式的锁定查询(SELECT… FOR UPDATE) 操作加互斥锁。对于共享模式的锁定查询 (SELECT…LOCK IN SHARE MODE) 操作加共享锁。若没有锁冲突,在锁表中,增加一行记录,表示加锁成功。

项目结构

结构图

  • meepo-core 该项目是JTA框架的核心实现,包括全局事务,XA资源,锁,事务镜像、定时清理等实现。

  • meepo-supports 该项目是对核心组件的支持,包括jdbc、spring、切面的实现。

  • meepo-supports-dubbo 该项目是对dubbo框架的支持,里面主要针对dubbo的特性的实现,最主要对filter的spi扩展。