ServiceBus в Microsoft Orleans, исключение OrleansPrepareFailedException

Я использую Microsoft Orleans для .net Core и пытаюсь получать сообщения ServiceBus и обрабатывать их как можно быстрее.

С параметром MaxConcurrentCalls, установленным на 2, все работает нормально. Но с набором 10 или 30 выдается исключение:

OrleansPrepareFailedException, транзакция 50038 прервана, поскольку фаза подготовки не удалась

в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в MichalBialecki.com.OrleansCore.AccountTransfer.Client.Program.‹>c__DisplayClass4_0.‹b__0>d.MoveNext( )

код выглядит так:

subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
    var messageJson = Encoding.UTF8.GetString(message.Body);
    var updateMessage = JsonConvert.DeserializeObject<AccountTransferMessage>(messageJson);

    await client.GetGrain<IAccountGrain>(updateMessage.From).Withdraw(updateMessage.Amount);
    await client.GetGrain<IAccountGrain>(updateMessage.To).Deposit(updateMessage.Amount);

    await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(async args => Console.WriteLine(args.Exception + ", stack trace: " + args.Exception.StackTrace))
{ MaxConcurrentCalls = 30, AutoComplete = false });

Мой сценарий очень прост. Он обрабатывает сообщения о передаче учетной записи и после обновления баланса учетной записи (Grain) отправляет сообщение в другую тему ServiceBus. В настоящее время на моем локальном компьютере он может обрабатывать около 1500 сообщений в минуту, но он кажется медленным.


person Mik    schedule 11.03.2018    source источник
comment
Вы установили PrefetchCount. Что, если вы попытаетесь использовать AutoComplete как true?   -  person Mikhail Shilkov    schedule 11.03.2018
comment
Возникшее исключение имеет тип: OrleansPrepareFailedException, так что это скорее ошибка Орлеана. Установка PrefetchCount и AutoComplete не помогла.   -  person Mik    schedule 11.03.2018


Ответы (1)


Проблема заключалась в неправильной обработке состояния в классе зерна. Я использовал транзакционное состояние и постоянное состояние одновременно, хотя должен был использовать только одно. Мне удалось правильно запустить мой код для приложения Orleans версии 2.0 и .Net Core.

Вот мой код: https://github.com/mikuam/orleans-core-example А вот мой пост в блоге о добавлении постоянного хранилища в Microsoft Orleans в .Net Core: http://www.michalbialecki.com/2018/04/03/add-cosmosdb-persistent-storage-to-microsoft-orleans-in-net-core/

person Mik    schedule 03.04.2018