我正在進行空中預訂項目。在處理無冪等性調用時,我應該使用事件設計嗎?
下圖顯示了我們到目前爲止開發域模型。
我們定義域服務(AirBookService),它封裝了預訂,票務等業務。我們的供應商提供Remote-Procedure-Call API來處理這些請求,所以我們通過添加一個反腐敗層(我們有多個供應商)來實施域服務。與imdenpotent RPC調用,例如獲取價格打交道時
這個解決方案正常工作。但是,在處理非imdenpotent 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) It will surely introduce some extra complexity if doing so. like messaging. b) I don' have much experience in event handling. c) The failure chances are very low even if we use rpc call in the transaction boundary, mostly caused by concurrency problem and contetion of AirReservation is relatively low in real world.
下面是我的事件的嘗試:
@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.Multiple資源管理問題(數據源和消息) 2.我必須創造一個修改旅客需求票和任何其他AirBookService操作很多特設的事件。
我左右爲難,不滿意目前的設計但隨着新事件的設計相當猶豫。
任何想法表示讚賞,在此先感謝。