簡體   English   中英

如何設計NServiceBus Saga從接收多條消息開始

[英]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將以三個不同的命令到達,分別為Message1Message2Message3

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屬性?

Message1Message3到達時,無法啟動傳奇。 Message2丟失。

然后另一個Message1到達。

然后, Message2到達。 (完成第一個傳奇,因此可以開始)

第二個Message1呢?

如何處理?

您的Saga實現所處理的每條消息將僅屬於該Saga的1個實例。 在這3條消息中的每條消息中,您仍將需要某種方式將它們與相同的Saga實例相關聯。

我將重新查看您的流程,看看將這3個實體的任何三個組合綁定在一起的過程是什么,以找到唯一標識Saga的內容,例如Order。

此后,您的Saga可以等待,直到收到所有3條消息以開始做您想做的事情為止,方法是在執行Saga需要做的事情之前檢查所有這三個ID是否都已設置。

Sagas不支持您正在描述的模式。 IAmStartedByMessages指令以ANY(而不是ALL)語義應用。

大致來說,您有兩種選擇;

  1. 使用所需消息之一啟動您的傳奇實例,然后在其他消息發送時處理它們的到達,或者
  2. 在調用您的傳奇之前的某個時候實現Aggregator模式,這顯然將消除等待多個消息的要求。

在我看來,啟動傳奇的舉動就是一場傳奇。 如果創建了一個傳奇來管理消息的收集,然后開始執行另一個操作來處​​理這些消息到達之前的工作,該怎么辦?

暫無
暫無

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

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