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

时间:2018-06-30 09:34:38

标签: orleans

我正在将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
        }

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

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

我的本​​地计算机上的所有内容都在使用CPU intel核心i7、16 GB RAM。 请让我知道,我应该提供哪种配置来查找长时间执行的原因。 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

某些背景无法直接解决性能问题。

即使您的Create()方法什么也不做,奥尔良在第一次调用时就需要管理很多东西:必须在grain目录中定位/创建该grain,等等,这需要进行一些通信和数据库访问,即。这不是几个CPU周期的虚拟调用。

在事件源方面:RaiseEvent()是一个廉价电话,它将事件存储在本地内存中的队列中(在将来的版本中,它将重命名为EnqueueEvent()以清楚地知道发生),并且当粮食闲置(或至少在await中等待)或您致电ConfirmEvents()时,奥尔良将存储事件。存储事件还需要一些管理,例如。即使集群中有多个实例,它也可以确保强大的(线性化)一致性。

请注意,这些算法是针对10s,100s或1000s的计算机而设计的,并未解决您的100-200ms执行时间,并且并未针对单个机器开发环境进行优化。即使在现场环境中,也不会单次调用速度很快,但是总体吞吐量(在一个实际群集中分布的多个调用和多次调用)将很高(16.000 req / s / silo(25 x A4(8核14GB)), 2hop / req,200kreq / s / cluster,2 * 200k / 25 = 16k))。

我太无资格谈论奥尔良的表现了。如果您有一个显示性能问题的示例项目,请将其上传到github,提出一个问题,如果开发人员只需几分钟来分析您的问题,他们会有所帮助,但他们至少需要详细的日志才能了解到什么真正的问题。

相关问题