1

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

将参数 MaxConcurrentCalls 设置为 2 一切正常。但是使用 set 10 或 30 它会引发异常:

OrleansPrepareFailedException,事务 50038 因准备阶段未成功而中止

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

4

1 回答 1

1

问题是在粮食阶级中对国家的处理不当。我同时使用了事务状态和持久状态,我应该只使用一个。我设法让我的代码在 Orleans 2.0 版和 .Net Core 应用程序中正确运行。

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

于 2018-04-03T12:33:54.330 回答