1

我正在尝试寻找有关在 NServiceBus 5.x 中设计由 2 条或更多消息启动的 Saga 的帮助。这意味着 saga 不会以单个消息开始,但所有消息都必须在 saga 开始之前存在。

我不太明白它是如何工作的,并且在任何地方都找不到示例或示例。

我读了几本书,其中清楚地表明由几条消息开始一个传奇是完全可以的。

我不明白的是,当您需要例如 3 条消息来启动 saga 时如何找到 saga。在 saga 可以“开始”之前,所有 3 条消息必须以任何顺序到达。这对我对[Unique]属性的选择有何影响?

示例:我需要由三个 ID“StoreID”、“ComputerID”、“UserID”“唯一”标识的 saga。这三个 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;}
}

还是我必须创建连接这三个的只读属性?

Message1Message3到达时,传奇无法开始。Message2不见了。

然后另一个Message1来了。

然后Message2到达。(完成第一个saga,所以可以开始了)

第二个Message1呢?

这将如何处理?

4

3 回答 3

3

收到的 Saga 实现处理的每条消息都只属于该 Saga 的 1 个实例。您仍然需要在这 3 条消息中的每一条中使用某种方式将它们关联到同一个 Saga 实例。

我会重新查看您的流程,看看是什么将这三个实体的任何三个组合绑定在一起,以找到唯一标识 Saga 的内容,例如 Order。

在此之后,您的 Saga 可以等到它接收到所有 3 条消息,然后通过检查所有这三个 ID 是否已设置,然后再执行 Saga 需要执行的任何操作,来开始执行您想要执行的操作。

于 2016-09-15T14:52:35.847 回答
1

Sagas 不支持您描述的模式。IAmStartedByMessages 指令适用于 ANY,而不是 ALL,语义。

总的来说,您有两种选择;

  1. 使用所需消息之一启动您的 saga 实例,然后在发送其他消息时处理它们的到来,或者
  2. 在调用 saga 之前的某个时间点实现聚合器模式,这显然会消除等待多条消息的要求。
于 2016-09-15T10:47:01.570 回答
0

在我看来,开始这个传奇的行为就是一个传奇。如果您创建了一个 saga 来管理消息的集合,然后启动一个不同的 saga 来完成等待这些消息到达的任何工作。

于 2016-09-15T13:04:58.370 回答