我正在将 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 条消息,但感觉有点慢。