在 Apache ServiceComb 补偿方法中处理附加数据
Handling additional data in Apache ServiceComb compensation methods
我目前正在研究用于分布式事务的 saga 模式的实现,我发现 Apache ServiceComp 包可能适合我。
但是,我发现了一个问题,即限制补偿方法与它们补偿的方法具有相同的声明可能是一个瓶颈。
来自 Apache 的示例:
@Compensable(compensationMethod = "cancel")
void order(CarBooking booking) {
booking.confirm();
bookings.put(booking.getId(), booking);
}
void cancel(CarBooking booking) {
Integer id = booking.getId();
if (bookings.containsKey(id)) {
bookings.get(id).cancel();
}
}
您可以看到我们对这两种方法有相同的声明。
但是,如果我需要额外的信息来补偿我的交易怎么办?例如,我调用外部系统将一些标志更新为 "true"。当我需要补偿它时,如何让 "cancel" 方法知道这个标志的原始值是什么?
当我们更新整个对象时,事情变得更加棘手。如何将修改前的整个对象发送到取消交易?
这些限制看起来不太乐观。您知道是否有解决此限制的方法吗?
您可以在您的应用程序中保存本地TxId和flag,并在补偿方法中使用本地TxId来获取flag
Map extmap = new HashMap();
@Autowired
OmegaContext omegaContext;
@Compensable(compensationMethod = "cancel")
void order(CarBooking booking) {
booking.confirm();
bookings.put(booking.getId(), booking);
//save flag
extmap.put(omegaContext.localTxId(),'Your flag')
}
void cancel(CarBooking booking) {
//get flag
extmap.get(omegaContext.localTxId());
Integer id = booking.getId();
if (bookings.containsKey(id)) {
bookings.get(id).cancel();
}
}
我目前正在研究用于分布式事务的 saga 模式的实现,我发现 Apache ServiceComp 包可能适合我。
但是,我发现了一个问题,即限制补偿方法与它们补偿的方法具有相同的声明可能是一个瓶颈。
来自 Apache 的示例:
@Compensable(compensationMethod = "cancel")
void order(CarBooking booking) {
booking.confirm();
bookings.put(booking.getId(), booking);
}
void cancel(CarBooking booking) {
Integer id = booking.getId();
if (bookings.containsKey(id)) {
bookings.get(id).cancel();
}
}
您可以看到我们对这两种方法有相同的声明。
但是,如果我需要额外的信息来补偿我的交易怎么办?例如,我调用外部系统将一些标志更新为 "true"。当我需要补偿它时,如何让 "cancel" 方法知道这个标志的原始值是什么?
当我们更新整个对象时,事情变得更加棘手。如何将修改前的整个对象发送到取消交易?
这些限制看起来不太乐观。您知道是否有解决此限制的方法吗?
您可以在您的应用程序中保存本地TxId和flag,并在补偿方法中使用本地TxId来获取flag
Map extmap = new HashMap();
@Autowired
OmegaContext omegaContext;
@Compensable(compensationMethod = "cancel")
void order(CarBooking booking) {
booking.confirm();
bookings.put(booking.getId(), booking);
//save flag
extmap.put(omegaContext.localTxId(),'Your flag')
}
void cancel(CarBooking booking) {
//get flag
extmap.get(omegaContext.localTxId());
Integer id = booking.getId();
if (bookings.containsKey(id)) {
bookings.get(id).cancel();
}
}