BeetlSQL 3.2.0 发布,多库和微服务事务支持

栏目: 软件资讯 · 发布时间: 3年前

内容简介:本次发布主提供多库和微服务事务支持,使用了 BeetlSQL 的自带的 Saga 实现 新增多库和微服务 Saga 实现 修复代码生成因为重构带来的问题 Saga文档 Maven <dependency> <groupId>com.ibeetl</groupId> <...

本次发布主提供多库和微服务事务支持,使用了 BeetlSQL 的自带的 Saga 实现

  • 新增多库和微服务 Saga 实现
  • 修复代码生成因为重构带来的问题

Saga文档

Maven

<dependency>
  <groupId>com.ibeetl</groupId>
  <artifactId>beetlsql</artifactId>
  <version>3.2.0-RELEASE</version>
</dependency>

Saga 初期是长事务的解决方案,微服务流行后也可以为微服务提供事务解决方案。不同于传统的数据库事务或者 2 阶段提交,必须·依赖于数据库系统实现 ACID 事务,Saga 不依赖于特定系统(实际上也不可能让所有系统实现 ACID,比如 Redis,Mongdb),只要求特定系统能提供补偿操作,在出错的时候能执行补偿操作即可。因此可以很方便用在现代的微服务架构中。

一个长事务的例子,如订购电影票,分为选座位和支付俩个步骤。用户可能会花好几分钟才能能完成。另一个例子是下单旅游产品,需要酒店,飞机,旅行社各个系统协作。 关于Saga,我认为最好的文章是 https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/saga/saga,因为他即告诉你什么是Saga。也告诉你Saga不完美的地方。

因此 Saga 的核心是补偿操作以及执行这些操作的任务的管理。下面列举了一些目前我认为的现在一些 Saga 框架实现的缺点

  • 补偿操作需要手动编写,这工作量不小,而且容易写错,需要仔细审核代码
  • 有些框架能自动根据 SQL 产生逆向 SQL,这有效减少了编写补偿的工作。但解析 SQL 和生成逆向 SQL 的难度非常大,会成为 Saga 框架的主要难点
  • 现在几乎所有的 Saga 框架将要改变编写微服务调用方式,因为 Saga 提倡通过消息调用来实现服务调用和补偿操作。不符合编写业务代码习惯,还是期望能在编写微服务的时候,像传统事务编程模式那样,微服务业务代码嵌套在一个 Saga 事务开始,提交或者回滚即可
  • 几乎所有的框架都要实现进行 Saga 编排,即 Saga 事务里那些微服务调用必须事先编排(配置)。这非常不灵活,因为业务时刻在变化。非常有可能升级了业务代码,却忘记重新编码。 程序员期望能像普通编写业务代码那样而不需要实现编排配置

BeetlSQL 的 Saga 实现试图解决上述问题。让微服务编程变得跟简单。

单系统多库 Saga 事务

@Test
public void simple(){
  SagaContext sagaContext = SagaContext.sagaContextFactory.current();
  UserMapper userMapper = sqlManager.getMapper(UserMapper.class);
  long count = sqlManager.allCount(User.class);
  try{
    sagaContext.start()
      
    User user = new User();
    user.setName("abc");
    userMapper.insert(user);
    //根据名字hash入不同数据库
    User user2 = new User();
    user2.setName("efg");
    userMapper.insert(user2);
    if(1==1){
      throw new RuntimeException("模拟异常");
    }
    sagaContext.commit();
    
  }catch(RuntimeException ex){
    sagaContext.rollback();
  }
  long  afterCount = sqlManager.allCount(User.class);
  Assert.assertEquals(count,afterCount);
}

微服务Saga事务,采用同样的编程方式

SagaContext sagaContext = SagaContext.sagaContextFactory.current();
try {
  sagaContext.start(gid);
  //模拟调用俩个微服务,订单和用户
  rest.postForEntity(orderAddUrl, null,String.class, paras);
  rest.postForEntity(userBalanceUpdateUrl, null,String.class, paras);
  if (1 == 1) {
    throw new RuntimeException("模拟失败,查询saga-server 看效果");
  }
} catch (Exception e) {
  sagaContext.rollback();
  return e.getMessage();
}

BeetlSQL 的目标是提供开发高效,维护高效,运行高效的数据库访问框架,在一个系统多个库的情况下,提供一致的编写代码方式。支持如下数据平台

  • 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等
  • 大数据:HBase,ClickHouse,Cassandar,Hive
  • 物联网时序数据库:Machbase,TD-Engine,IotDB
  • SQL查询引擎:Drill,Presto,Druid
  • 内存数据库:ignite,CouchBase

阅读文档 源码和例子


以上所述就是小编给大家介绍的《BeetlSQL 3.2.0 发布,多库和微服务事务支持》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++ Primer 中文版(第 5 版)

C++ Primer 中文版(第 5 版)

[美] Stanley B. Lippman、[美] Josée Lajoie、[美] Barbara E. Moo / 王刚、杨巨峰 / 电子工业出版社 / 2013-9-1 / CNY 128.00

这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级。除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委员会原负责人 Josée Lajoie 对C++标准的深入理解,以及C++ 先驱 Barbara E. Moo 在 C++教学方面的真知灼见外,更是基于全新的 C++11标准进行了全面而彻底的内容更新。......一起来看看 《C++ Primer 中文版(第 5 版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换