在 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();
    }
  }