Saga分布式事务一致性解决方案使用疑惑

  • Choerodon平台版本:0.8.0

  • 运行环境(如localhost或k8s):localhost

  • 遇到问题时的前置条件:

  • 问题描述:

参考猪齿鱼最新的分布式事务一致性解决方案(Saga)

http://choerodon.io/zh/docs/development-guide/backend/framework/saga/(如何使用Saga)

http://choerodon.io/zh/blog/event-consistent/(Saga简介)

在合同系统进行了相关程序的集成以及参考demo程序逻辑编写,

在github上所获取到的saga相关的阿斯加德服务 版本为0.8.0.RELEASE
合同系统相关的服务均按照文档所说对 猪齿鱼开发包版本升级至0.6.0RELEASE <choerodon.starters.version>0.6.0.RELEASE</choerodon.starters.version>

并在消费端开启saga相关配置

  • 报错信息(请尽量使用代码块的形式展现):
    在使用debug追踪后,发现在使用feign调用阿斯加德服务时,程序在如下位置报错,
    @Override
    public ResponseEntity<SagaInstanceDTO> start(final StartInstanceDTO dto) {
    final String code = dto.getSagaCode();
    if (!sagaMapper.existByCode(code)) {
    throw new FeignException(“error.saga.notExist”);
    }
    SagaTask sagaTask = new SagaTask();
    sagaTask.setIsEnabled(true);
    sagaTask.setSagaCode(code);
    List<SagaTask> sagaTasks = taskMapper.select(sagaTask);
    if (sagaTasks.isEmpty()) {
    Date date = new Date();
    SagaInstance instanceDO = new SagaInstance(code, dto.getRefType(), dto.getRefId(),
    SagaDefinition.InstanceStatus.NON_CONSUMER.name(), date, date);
    if (instanceMapper.insertSelective(instanceDO) != 1) {
    throw new FeignException(DB_ERROR);
    }
    return new ResponseEntity<>(modelMapper.map(
    instanceMapper.selectByPrimaryKey(instanceDO.getId()), SagaInstanceDTO.class), HttpStatus.OK);
    }

return new ResponseEntity<>(startInstanceAndTask(dto, sagaTasks), HttpStatus.OK);
}public ResponseEntity<SagaInstanceDTO> start(final StartInstanceDTO dto) {
final String code = dto.getSagaCode();
if (!sagaMapper.existByCode(code)) {
throw new FeignException(“error.saga.notExist”);
}

  • 原因分析:

    查询到相关的表为如下表 asgard_orch_saga

  • 疑问:

    问题:请问saga如何在这张表(asgard_orch_saga)中维护数据,是需要手动维护还是在其他地方?在博客中提及的猪齿鱼事务定义界面如何访问?

本地启动我们的eureka-server,线上注册中心用go-register-server,服务启动后注册中心发送事件到kafka,然后asgard-service通过kafka的消息监听微服务启动,在服务启动后向具体服务拉去@Saga和@SagaTask的事务定义实现自动维护。
可通过root用户登录访问事务定义页面。