GetGrain 的新奥尔良性能问题并保存到事件存储



我正在使用Orelans(2.0.3(与SQL数据库(2017(。数据库位于应用程序所在的同一主机上。目前我正在努力解决以下性能问题:

var purchaseGrain = _grainFactory.GetGrain<IPurchaseGrain>(id);
await purchaseGrain.Create(id, command);

出于测试目的创建方法不执行任何操作,看起来像:

public Task Create(Guid id, CreatePurchaseCommand message)
{
var @event = new PurchaseCreatedEvent
{
Id = id,
Name = message.Name,
Type = message.Type
};
return Task.CompletedTask;
}

这部分的时间执行需要很长时间:

var purchaseGrain = _grainFactory.GetGrain<IPurchaseGrain>(id);
await purchaseGrain.Create(id, command);

以毫秒为单位的示例时间执行:

79
105
145
69
90
108
140
74
97
128
153
79
103
140
67
95
130
158
87
119
152
75
102
134

我对以下部分也有问题:

protected async Task Publish(IEvent @event)
{
RaiseEvent(@event); //Rise event works very fast
await ConfirmEvents(); // here is long time execution issue
}

确认事件的执行时间示例(以毫秒为单位(:

172
205
165
231
294
222
259
208
177
274
238
228
200

一切都在我的本地机器上工作,配备 CPU 英特尔酷睿 i7,16 GB RAM。 请让我知道,我应该提供哪种配置来查找长时间执行的原因。 感谢您的任何帮助!

没有直接解决性能问题,一些背景。

即使你的Create()方法也不执行任何操作,新奥尔良需要在第一次调用时管理很多东西:必须在粒度目录中查找/创建此粒度等,这需要一些通信和数据库访问,即。 这不是几个 CPU 周期的虚拟调用。

在事件溯源方面:RaiseEvent()是一个便宜的调用,它将事件存储在本地内存中的队列中(在将来的某个版本中,这将重命名为EnqueueEvent()以明确会发生什么(,并且当粒度空闲(或至少在await中等待(或当您调用ConfirmEvents()时,奥尔良将存储事件。存储事件也需要一些管理,例如。它保证了强大的(线性化(一致性,即使跨集群有多个实例也是如此。

请注意,在不解决 100-200 毫秒执行时间的情况下,这些算法是为 10 秒、100 秒或 1000 台机器设计的,而不是针对单个机器开发环境进行优化。即使在实时环境中,单个粒度调用也不会很快,但一般吞吐量(分布在真实集群中的多个粒度和多个调用(会很高(16.000 req/s/silo(25 x A4 (8core 14GB(、2hop/req、200kreq/s/cluster、2*200k/25=16k((。

我太没有资格再说奥尔良的表现了。如果你有一个显示性能问题的示例项目,把它上传到github,提出一个问题,如果开发人员只需要几分钟来分析你的问题,他们会提供帮助,但他们至少需要详细的日志来查看真正的问题是什么。

最新更新