[英]How to design a NServiceBus Saga started by receipt of multiple messages
我正在嘗試尋找有關在NServiceBus 5.x中設計Saga(由2條或更多消息開始)的幫助。 這意味着傳奇將不會以單個消息開頭,但是所有消息都必須在傳奇開始之前存在。
我不太了解如何使用,並且在任何地方都找不到示例或示例。
我讀了幾本書,清楚地表明,通過多個消息開始一個傳奇故事是很好的。
我不明白的是,當您需要3條消息來啟動傳奇時,如何找到傳奇。 所有3條消息都必須以任意順序到達,然后才能開始傳奇。 這如何影響我對[Unique]
屬性的選擇?
示例:我需要由三個ID“ StoreID”,“ ComputerID”,“ UserID”“唯一”標識的傳奇。 這三個ID將以三個不同的命令到達,分別為Message1
, Message2
, Message3
。
public class MySaga : Saga<MySagaData>,
IAmStartedByMessages<Message1>,
IAmStartedByMessages<Message2>,
IAmStartedByMessages<Message3>
{ ...
}
MySagaData是否應在三個屬性上具有[Unique]屬性?
public class MySagaData
{
[Unique]
public int StoreId {get;set;}
[Unique]
public int ComputerId {get;set;}
[Unique]
public int UserId {get;set;}
}
還是我必須創建連接這三個的readonly屬性?
當Message1
和Message3
到達時,無法啟動傳奇。 Message2
丟失。
然后另一個Message1
到達。
然后, Message2
到達。 (完成第一個傳奇,因此可以開始)
第二個Message1
呢?
如何處理?
您的Saga實現所處理的每條消息將僅屬於該Saga的1個實例。 在這3條消息中的每條消息中,您仍將需要某種方式將它們與相同的Saga實例相關聯。
我將重新查看您的流程,看看將這3個實體的任何三個組合綁定在一起的過程是什么,以找到唯一標識Saga的內容,例如Order。
此后,您的Saga可以等待,直到收到所有3條消息以開始做您想做的事情為止,方法是在執行Saga需要做的事情之前檢查所有這三個ID是否都已設置。
Sagas不支持您正在描述的模式。 IAmStartedByMessages指令以ANY(而不是ALL)語義應用。
大致來說,您有兩種選擇;
在我看來,啟動傳奇的舉動就是一場傳奇。 如果創建了一個傳奇來管理消息的收集,然后開始執行另一個操作來處理這些消息到達之前的工作,該怎么辦?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.