第三方服务回滚机制

问题描述 投票:0回答:1

我有三个不同的第三方服务,我尝试在一个句柄方法中调用所有这些服务。另外,我想处理回滚操作。但我不确定实施情况。这是我的代码:

void handle() {
    service1.create();
    callService2OrRollback();
    callService3OrRollback()
}

void callService2OrRollback() {
  try {
      service2.create();
  } catch(Exception e) {
      service1.delete();
      throw e;
  }
}

void callService3OrRollback() {
  try {
      service3.create();
  } catch(Exception e) {
      service1.delete();
      service2.delete();
      throw e;
  }
}

有没有更好的方法来实现回滚机制?顺便说一句,我正在使用 java 和 spring-boot。

java spring-boot rollback
1个回答
0
投票

灵感来自 Temporal:https://temporal.io/blog/saga-pattern-made-easy

public final class Saga {
    private final List<Runnable> compensationOps = new ArrayList<>();

    public void addCompensation(Runnable runnable) {
        compensationOps.add(runnable);
    }

    public void compensate() {
        for (Runnable runnable : compensationOps) {
            try {
                runnable.run();
            } catch (Exception e) {
                log.error("Unexpected error on compensation and ignored sakes of remaining rollbacks");
            }
        }
    }
}

用法示例:

Saga saga = new Saga();
try {
   triggerFirstService();
   saga.compensate(() -> addFirstServiceRollback());

   triggerSecondService();
   saga.compensate(() -> addSecondServiceRollback());

   triggerFinalService();
} catch(Exception ex) {
  saga.compensate();
}
© www.soinside.com 2019 - 2024. All rights reserved.