Я использую 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 сообщений в минуту, но он кажется медленным.
PrefetchCount
. Что, если вы попытаетесь использоватьAutoComplete
какtrue
? - person Mikhail Shilkov   schedule 11.03.2018