我在使用NServiceBus传奇时遇到了竞争条件 .
问题是这个 -
我有一个派生自Saga的类,实现IAmStartedByMessages并在sql server中保存saga数据 . 此saga处理传入消息,创建新消息,将其发送到另一台服务器 . 此服务器处理消息并发回响应 . 然后将此回复消息作为saga处理的下一阶段处理 . 我正在使用saga id来配置映射 .
紧接在saga数据之前的回复消息已保存到数据库时出现问题 . 由于尚未保存传奇数据,因此映射失败并且消息丢失 .
为了说明下面的例子,假设我让这些处理程序监听不同的 endpoints ,我在SagaData被持久化之前得到了AnotherMessage . -
public class MySaga : Saga<SagaData>,
IAmStartedByMessages<StartMesssage>
HandleMessage<AnotherMessage>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<AnotherMessage>(s => s.Id, x => x.SagaId);
}
void Handle(StartMessage message)
{
var sendMsg = new SendMessage(){SagaId=this.Data.Id}
bus.Send(sendMsg)
}
void Handle(AnotherMessage message)
{
}
}
public class NextStage : IHandleMessages<SendMessage>
{
void Handle(SendMessage message)
{
var anotherMsg = new AnotherMessage() {SagaId=message.SagaId};
bus.Send(anotherMsg);
}
}
(顺便说一句,我使用的是NServiceBus 2.x(apache许可版)
问候,
伊利亚斯
1 回答
由于saga数据和bus.send的持久性将成为同一事务的一部分,因此我认为没有竞争条件的任何可能性 . 您是否100%确定在回复到来之前数据未被保留?