NServiceBus传奇设计问题

ale*_*dev 3 c# persistence nservicebus saga nservicebus-sagas

我在使用NServiceBus saga时遇到"乐观并发冲突"异常.

我的传奇涵盖了一个相对简单的流程:当任何消息到达时,它几乎没有外部请求,并在一段时间后收集回复.

下面你可以找到我的传奇的一个例子.

NServiceBus为此类流产生"乐观并发冲突"异常是否正常?

我应该考虑以某种方式重新设计传奇吗?

class MySaga: SqlSaga<SagaData>, ...
{
    CorrelationPropertyName => nameof(SagaData.UserId);

    public Task Handle(StartSagaMessage message, IMessageHandlerContext context)
    {
        // save a new item id
        Data.Items.Add(message.ItemId);

        // make an external request for the item title
        context.Send<GetItemTitle>(message.ItemId);
        // make an external request for the item description
        context.Send<GetItemDescription>(message.ItemId);

        // gather results after one hour
        RequestTimeout<RequestTimeout>(TimeSpan.FromHours(1));
    }

    // this method sometimes raises "optimistic concurrency violation" exception
    public Task Handle(GetItemTitleResponse message, IMessageHandlerContext context)
    {
        Data.ItemTitles[message.ItemId] = message.ItemTitle;
    }

    // this method sometimes raises "optimistic concurrency violation" exception
    public Task Handle(GetItemDescriptionResponse message, IMessageHandlerContext context)
    {
        Data.ItemDescriptions[message.ItemId] = message.ItemDescription;
    }

    public Task Handle(RequestTimeout state, IMessageHandlerContext context)
    {
       context.Send<ProcessItems>(Data.Items, Data.ItemTitles, Data.ItemDescriptions);
       MarkAsComplete();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在用:

  • NServiceBus 6.4.2
  • NServiceBus.RabbitMQ
  • NServiceBus.Persistence.Sql

Sea*_*man 5

NServiceBus为此类流产生"乐观并发冲突"异常是否正常?

绝对.如果与同一个Saga实例相关的多条消息到达并尝试同时更新saga实例数据,则持久性将检测到它并抛出此异常.你不应该担心它作为可恢复性功能(NServiceBus重试)将采取它.如果您已禁用可恢复性,则可能需要启用.

我应该考虑以某种方式重新设计传奇吗?

如果您的传奇故事负担很高,那么您可以查看本博文中列出的选项.