簡體   English   中英

NServiceBus傳奇設計問題

[英]NServiceBus saga design issue

我在使用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();
    }
}

我在用:

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

NServiceBus為此類流產生“樂觀並發沖突”異常是否正常?

絕對。 如果與同一個Saga實例相關的多條消息到達並嘗試同時更新saga實例數據,則持久性將檢測到它並拋出此異常。 你不應該擔心它作為可恢復性功能 (NServiceBus重試)將采取它。 如果您已禁用可恢復性,則可能需要啟用。

我應該考慮以某種方式重新設計傳奇嗎?

如果您的傳奇故事負擔很高,那么您可以查看本博文中列出的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM