首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NServiceBus -使用相同的密钥将sagas排队

NServiceBus -使用相同的密钥将sagas排队
EN

Stack Overflow用户
提问于 2016-01-04 14:11:21
回答 2查看 162关注 0票数 2

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

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

我无法看到用户在他们的系统中输入数据的时间,但是我每隔x分钟从系统读取数据。

我的问题是,每当我以客户的数据开始传奇时,我需要确保相同客户的前一部传奇已经完成。如果用户花费10分钟输入数据,系统可能会在同一个客户上启动5个流,流可能会超过以前的流,从而导致数据混乱。

有人知道我怎么解决这个问题吗?

提前谢谢。

Ole

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-04 17:01:59

如果不更改saga,以及客户端系统发送的消息,您就无法解决这个问题。

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

让我们调用此消息:

代码语言:javascript
运行
复制
public class ClientTypedSomethingAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

你的传奇将会是这样的:

代码语言:javascript
运行
复制
public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<ClientTypedSomethingAboutCustomer>
            (message => message.CustomerId).ToSaga(saga => saga.CustomerId);
        ...
    }
    ...
}

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

为了解决进一步初始化新sagas的消息的问题,您可以创建另一种消息类型,以区分某人何时开始键入有关客户的内容,然后再键入有关该客户的其他内容。

类似于:

代码语言:javascript
运行
复制
public class ClientTypedSomethingElseAboutCustomer 
{
    int CustomerId {get;set;}
    ...
}

那么你的传奇会是这样的:

代码语言:javascript
运行
复制
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来获取近似的队列行为。这可能会限制为客户创建并发sagas,但我不想依赖这一点。

票数 0
EN

Stack Overflow用户

发布于 2016-01-05 07:59:19

@janpieter_z和@tom都是正确的:确保您可以将该传奇映射到某种类型的客户id。

您还可以实现复杂佐贺发现逻辑来查找与传入的消息相对应的正确的传奇。

此外,如果多条消息没有按照正确的顺序到达,则可以将它们设置为"IAmStartedByMessages“。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34593050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档