Microsoft Orleans 中的 ServiceBus,OrleansPrepareFailedException 异常

ServiceBus in Microsoft Orleans, OrleansPrepareFailedException exception

我正在为 .net Core 使用 Microsoft Orleans,我正在尝试接收 ServiceBus 消息并尽可能快地处理它们。

将参数 MaxConcurrentCalls 设置为 2 一切正常。但是设置 10 或 30 会抛出异常:

OrleansPrepareFailedException, Transaction 50038 aborted because Prepare phase did not succeed

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at 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 条消息,但感觉有点慢。

问题是对 grain 中的状态处理不当 class。我同时使用了事务状态和持久状态,我应该只使用一个。我设法为 Orleans 2.0 版和 .Net Core 应用程序正确获取代码 运行。

这是我的代码:https://github.com/mikuam/orleans-core-example 这是我的博客 post 关于在 .Net Core 中向 Microsoft Orleans 添加持久存储:http://www.michalbialecki.com/2018/04/03/add-cosmosdb-persistent-storage-to-microsoft-orleans-in-net-core/