我正在使用Microsoft奥尔良的.net Core,我正在尝试接收ServiceBus消息并尽可能快地处理它们。
将参数 MaxConcurrentCalls 设置为 2 时,一切正常。但是对于集合 10 或 30,它会抛出一个异常:
新奥尔良准备失败异常,事务 50038 中止,因为准备阶段未成功
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at MichalBialecki.com.OrleansCore.AccountTransfer.Client.Program.<>c__DisplayClass4_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 });
我的方案非常简单。它处理帐户转移消息,并在更新帐户 (粒度) 余额后,将消息发送到其他 ServiceBus 主题。目前在我的本地机器上,它每分钟可以处理大约 1500 条消息,但感觉有点慢。
问题是在谷物类中错误地处理了状态。我同时使用了事务状态和持久状态,而我应该只使用一个。我设法让我的代码在奥尔良版本 2.0 和 .Net Core 应用程序上正确运行。
这是我的代码:https://github.com/mikuam/orleans-core-example 下面是我关于在 .Net Core 中向Microsoft奥尔良添加持久存储的博客文章: http://www.michalbialecki.com/2018/04/03/add-cosmosdb-persistent-storage-to-microsoft-orleans-in-net-core/