首页 文章

NServicebus传奇赛况

提问于
浏览
2

我在使用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 回答

  • 4

    由于saga数据和bus.send的持久性将成为同一事务的一部分,因此我认为没有竞争条件的任何可能性 . 您是否100%确定在回复到来之前数据未被保留?

相关问题