【问题标题】:How to design a NServiceBus Saga started by receipt of multiple messages如何设计一个从接收多条消息开始的 NServiceBus Saga
【发布时间】:2016-09-15 10:07:25
【问题描述】:

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

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

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

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

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

或者我必须创建连接这三个的只读属性吗?

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

然后另一个Message1 到达。

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

第二个Message1呢?

如何处理?

【问题讨论】:

  • 据我所知,没有什么专门用​​来支持这一点的。当任何条消息到达时,你的传奇就必须开始。然后由您对到达的其他消息做出反应以建立您的“完整”数据集,确定消息是相关的,等等。
  • 你使用的是哪种数据持久化?
  • @ColinPear Nhibernate

标签: c# .net nservicebus nservicebus5 nservicebus-sagas


【解决方案1】:

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

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

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

【讨论】:

  • 就像 Bob 提到的那样,您需要一些东西来关联这三条消息。
【解决方案2】:

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

一般来说,您有两种选择;

  1. 使用所需消息之一启动您的 saga 实例,然后在其他消息发送时处理它们的到来,或者
  2. 在调用 saga 之前的某个时间点实现 Aggregator 模式,这显然会消除等待多条消息的要求。

【讨论】:

  • 谢谢汤姆。这两个选项都是可行的,但是我现在所做的是仅使用 StoreID 开始 saga 1。然后使用 StoreID + ComputerID 从 Saga 1 中启动 Saga 2。然后使用 StoreID + ComputerID + UserID 从那里开始 saga 3。它有点像 3 个 sagas 的嵌套。因此,其中包含 StoreID + COMputerID 的消息将找到 Saga 2,而不是 Saga 1 或 3。这是一种有效的方法吗?
  • @John - 它非常优雅。很难预测是否会导致任何问题,但您只能尝试找出。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多