我正在做一个机票预订项目。
下图显示了我们迄今为止开发的域模型。
我们定义了一个域服务(AirBookService),它封装了预订、票务等操作。我们的供应商提供了 Remote-Procedure-Call api 来处理这些请求,因此我们通过添加反腐败层来实现域服务(我们有多个供应商)。
在处理无能的 rpc 调用(例如获取价格)时,此解决方案可以正常工作。但是,在处理非幂等 rpc 调用时存在风险。
例如
public class TransactionalReservationHandlingServiceImpl .... {
@Transactional
@Override
public void modifyTraveler(String resId, String tktId, AirTravler traveler) {
AirReservation res = reservationRepository.findBy(resId);
res.modify(tktId, traveler);
airBookService.modify(res, traveler);
reservationRepository.store(res);
}
}
我将 airBookService.modify() 放在 res.modify() 后面,因此如果某些本地域逻辑被破坏,则可以避免 rpc 调用。但是如果 rpc 调用成功而本地事务失败怎么办?我们的应用程序和供应商应用程序中的旅行者之间存在差异。
是否值得在单独的事务中处理 rpc 调用和本地修改?
我担心的是:
a) 如果这样做肯定会引入一些额外的复杂性。像消息传递。 b) 我在事件处理方面没有太多经验。 c) 即使我们在事务边界使用 rpc 调用,失败的可能性也很低,主要是由于并发问题和现实世界中 AirReservation 的争用相对较低。
以下是我的活动尝试:
@Transactional
@Override
public void modifyTraveler(String resId, String tktId, AirTravler traveler) {
AirReservation res = reservationRepository.findBy(resId);
ModifyTravelerEvent event = airBookService.modify(res, traveler);
handlingEventRepository.store(event);
events.notifyTravelerModified(event);// using messaging
}
@Transactional
@Override
public void modifyTraveler(String eventSequence) {
ModifyTravelerEvent event = handlingEventRepository.of(eventSequence);
AirReservation res = reservationRepository.findBy(resId);
event.handle(res);
reservationRepository.store(res);
handlingEventRepository.store(event );
}
优点是本地修改与 rpc 调用分开。但这引入了: 1. 多资源管理问题(数据源和消息传递) 2. 我必须创建很多临时事件来修改旅客、需求机票和任何其他 AirBookService 操作。
我处于两难境地,对当前的设计不满意,但对新的活动设计犹豫不决。
任何想法表示赞赏,在此先感谢。