场景:我用10个步骤构建了一个传奇故事。它正在更新各种系统,整个传奇可能需要几分钟才能完成。
saga是从另一个系统的数据开始的,在这个系统中,用户输入客户的信息。
我无法看到用户在他们的系统中输入数据的时间,但是我每隔x分钟从系统读取数据。
我的问题是,每当我以客户的数据开始传奇时,我需要确保相同客户的前一部传奇已经完成。如果用户花费10分钟输入数据,系统可能会在同一个客户上启动5个流,流可能会超过以前的流,从而导致数据混乱。
有人知道我怎么解决这个问题吗?
提前谢谢。
Ole
发布于 2016-01-04 17:01:59
如果不更改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);
...
}
...
}
这将导致在IContainSagaData实现中初始化saga并设置客户ID值,用于接收到的每个客户端消息。
为了解决进一步初始化新sagas的消息的问题,您可以创建另一种消息类型,以区分某人何时开始键入有关客户的内容,然后再键入有关该客户的其他内容。
类似于:
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来获取近似的队列行为。这可能会限制为客户创建并发sagas,但我不想依赖这一点。
发布于 2016-01-05 07:59:19
@janpieter_z和@tom都是正确的:确保您可以将该传奇映射到某种类型的客户id。
您还可以实现复杂佐贺发现逻辑来查找与传入的消息相对应的正确的传奇。
此外,如果多条消息没有按照正确的顺序到达,则可以将它们设置为"IAmStartedByMessages“。
最后,是谁在向你的传奇发送信息?传奇不应该负责发送收集数据的请求吗?也许每10秒通过超时或其他的方式,直到有几分钟没有收到任何消息,或者一个处理程序用不同的消息回复?
https://stackoverflow.com/questions/34593050
复制相似问题