私は航空予約プロジェクトに取り組んでいます。
下の画像は、これまでに開発したドメイン モデルを示しています。
予約、発券、その他の操作をカプセル化するドメイン サービス (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);
}
}
res.modify() の後ろに airBookService.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 操作のために、多くのアドホック イベントを作成する必要があります。
私はジレンマに陥っています。現在のデザインに満足せず、新しいイベント デザインには非常に躊躇しています。
どんなアイデアでも大歓迎です、事前に感謝します。