2 回答

TA貢獻1777條經驗 獲得超10個贊
首先,讓我回答你的主要問題:
我的問題是有人對 Axon 做過類似的事情嗎?
很快,是的,因為這是 Sagas 的主要用例之一。根據經驗,我想說 Saga 可用于協調以下之間的復雜業務事務:
幾個不同的聚合實例
幾種限界上下文
從表面上看,您似乎已經選擇了委托復雜業務交易的第二種選擇。
需要注意的是,當您使用 Sagas 時,您應該非常有意識地處理任何異常和/或命令調度結果。
因此,如果您從“Master”向“Slave 1”發送命令,而后者操作失敗,則該結果將返回到 Saga。因此,這為您提供了重試操作的第一個選項,我建議使用補償操作來執行此操作。最后,通過補償操作,我正在討論發送命令來觸發它。
如果您不能依賴調度命令的直接響應,那么在 Saga 中重試/重新安排消息將是合理的第二個選擇。
為此,Axon 擁有EventScheduler
和DeadlineManager
。請注意,兩者中的前者發布了一個事件供所有人查看。后者DeadlineMessage
在單個 Saga 實例的上下文中安排 a,從而限制了誰可以看到正在發生重試的范圍。
通常,這DeadlineManager
將是我首選的操作模式,除非您要求每個人都看到這種“重新安排操作”。
示例更新
下面是一些偽代碼,可以讓您了解 Saga 事件處理程序中的補償操作是什么樣子的:
class SomeSaga {
? ? private CommandGateway commandGateway;
? ? @SagaEventHandler(assocationValue = "some-key")
? ? public void on(SomeEvent event) {
? ? ? ? // perform some checks, validation and state setting, if necessary
? ? ? ? commandGateway.send(new MyActionCommand(...))
? ? ? ? ? ? ? ? ? ? ? .exceptionally(throwable -> {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?commandGateway.send(new CompensatingAction(...));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?});
? ? }
}

TA貢獻1719條經驗 獲得超6個贊
我不知道您的確切用例,但從這個問題和您上一個問題中,我得到的印象是您想要回滾,或者在本例中撤消事件,如果事件處理程序之一無法處理該事件。
一般來說,您可以做一些事情。您可以查看首先應用該事件的聚合是否具有或可以具有信息來檢查“從屬”微服務是否應該能夠在應用該事件之前處理該事件。如果這不切實際,從屬微服務還可以直接在事件總線上應用“失敗”事件,以通知系統的其余部分已發生需要處理的失敗狀態。
添加回答
舉報