【问题标题】:NServiceBus - queue up sagas with the same keyNServiceBus - 使用相同的键排队 saga
【发布时间】:2016-01-04 14:11:21
【问题描述】:

场景: 我用 10 个步骤构建了一个传奇。它正在更新各种系统,整个传奇可能需要几分钟才能完成。

这个传奇是从另一个系统的数据开始的,用户在这个系统中输入客户的信息。

我无法看到用户何时在他们的系统中完成输入数据,但我每 x 分钟读取一次系统更改的数据。

我的问题是,每当我开始一个包含客户数据的 saga 时,我都需要确保同一客户的前一个 saga 已经完成。 如果用户在输入数据上花费了 10 分钟,系统可能会针对同一客户启动 5 个流程,并且流程可能会超过之前的流程,从而导致数据混乱。

有人知道我该如何解决这个问题吗?

提前致谢。

奥莱

【问题讨论】:

  • 您能否将您的独特属性设为客户 ID?如果是这种情况,您可以让启动 saga 的消息也被映射到 saga 并由 saga 处理。这样,如果客户 id 为 1 的 saga 启动并且有新消息到达(收到客户 1 的更新),则结果由同一个 saga 处理。如果这不起作用,您能否提供有关您的 saga 映射的短代码 sn-ps + 初始化消息

标签: nservicebus nservicebus-sagas


【解决方案1】:

如果不更改 saga 以及可能由客户端系统发送的消息,您将无法解决此问题。

您的问题是 saga 可能配置为在收到某种消息类型时启动,该消息类型由客户端应用程序在每次用户对客户进行更改时生成。

让我们调用这个消息:

public class ClientTypedSomethingAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

你的传奇将被设置成这样:

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientTypedSomethingAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);
        ...
    }
    ...
}

这会导致初始化 saga,并在 IContainSagaData 实现中设置客户 ID 值,用于接收到的每条客户端消息。

要解决更多消息初始化新 sagas 的问题,您可以创建另一种消息类型,以区分某人何时开始键入有关客户的内容,然后键入其他内容 em> 关于那个客户。

类似:

public class ClientTypedSomethingElseAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

那么你的传奇应该是这样的:

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
    ,IHandleMessages<ClientTypedSomethingElseAboutCustomer>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientTypedSomethingAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);

        ConfigureMapping<ClientTypedSomethingElseAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);
    }
    ...
}

这将确保有关客户的所有消息都将路由到单个 saga 实例。

可以通过在单线程模式下运行 NServiceBus 来实现近似的排队行为。这可能会限制为客户创建并发 saga,但我不想依赖于此。

【讨论】:

【解决方案2】:

@janpieter_z 和 @tom-redfern 都是正确的:确保您可以将 saga 映射到某种客户 ID。

您还可以实现complex saga finding logic 来找到正确的saga,对应于传入的消息。

此外,如果消息未按正确顺序到达,则可以将多条消息设置为“IAmStartedByMessages”。

最后,谁在向您的传奇发送消息? saga 不应该负责发送请求以收集数据吗?也许每 10 秒通过超时或其他方式,直到几分钟内没有收到任何内容,或者处理程序回复了不同的消息?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2012-02-13
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多