我有三个不同的第三方服务,我尝试在一个句柄方法中调用所有这些服务。另外,我想处理回滚操作。但我不确定实施情况。这是我的代码:
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。
灵感来自 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();
}