簡體   English   中英

nservicebus從另一個Saga內調用Saga

[英]nservicebus calling a Saga from within another Saga

我是NServiceBus的新手,正在嘗試尋找對使用補償交易的方案進行建模的最佳方法。

例如,假設我有一個典型的BookHotel場景:

在令人滿意的情況下,消息傳遞流程將如下進行:

  1. BookHotelCommand-> BookHotelSaga
  2. BookFlightCommand->回復IFlightBookedMessage
  3. BookRentalCommand->回復IRentalBookedMessage
  4. ReplyToOriginator-> HotelBookedMessage

在上述流程中,如何對補償交易進行建模? 最初,我根據某些業務狀況考慮在上述答復之一中稱呼“ UnbookHotelSaga”。 但是,在使此工作正常進行方面,我似乎遇到了一些挑戰。 如果這是正確的方法,具有Saga的人可以發表評論嗎?

這是我認為可以通過調用另一個Saga來實現的方案:

  1. BookHotelCommand-> BookHotelSaga
  2. BookFlightCommand->回復IFlightBookedMessage
  3. BookRentalCommand->(滿足條件)-> UnbookHotelCommand-> UnbookHotelSaga
  4. UnbookRentalCommand->回復IUnbookRentalMessage
  5. UnbookFlightCommand->回復IUnbookFlightMessage
  6. UnbookHotelCommand-> ReplyToOriginator-> UnbookedHotelMessage

有人可以建議實施補償交易的最佳實踐方法嗎?

我不太確定自己是否了解長期運行的流程及其應采取的措施。 有關功能的更多信息可能會有所幫助。

我注意到的第一件事就是提到IUnbookRentalMessage 首先,請勿在消息開頭使用I 它們可以是接口的事實與.NET的多態性和多重繼承功能有關。 消息本身在線路上沒有技術意義,因此您不應包含I

同樣,命令使用命令式時態 ,事件使用過去式 因此, BookFlight用於命令,而FlightBooked用於事件。

從理論上講,您可以創建多個Sagas,它們全部參與一個長期運行的業務流程。 一個稱為BookingPolicyBookingProcessBookingSaga傳奇,用於協調整個過程。 FlightBookingPolicy為飛行和HotelBookingPolicy為酒店。

如果從BookFlight命令開始, FlightBookingPolicy可能會發布一個名為FlightBooked的事件。 BookingPolicy可以使用該事件來啟動其自己的傳奇實例。 因此,例如,發送所有命令的(ASP.NET)網站將不必了解BookingPolicy 它只是發送具有適當數據的適當命令。 酒店,汽車等也是如此。

然后,在某個時候,該網站發送一個CommitBookingFinishUpMyVacation命令,該命令確實到達 BookingPolicy傳奇,並最終確定了整個預訂。 它發送一個事件BookingFinishingUp或其他東西。 基於該事件,某些處理程序可能會從信用卡中扣款。 另一個處理程序與第三方進行整合以實際提交假期。 另一個處理程序發送電子郵件。 Etcetera。

最后,當BookingPolicy (甚至另一個傳奇 )完成后, BookingPolicy傳奇將發布名為事件BookingFinished和適當FlightBookingPolicyHotelBookingPolicyCarBookingPolicy也包裹起來,結束他們的工作。 不管是什么。

那有意義嗎? 如果需要,您也可以通過https://discuss.particular.net/或support@particular.net繼續對話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM