大型数据集的性能问题

时间:2019-02-05 09:01:49

标签: resolvejs

是否可以通过aggregateId过滤与读取模型相关联的投影中的事件?

在进行的测试中,我们总是收到 all 个注册事件。可以在上一个阶段应用过滤器吗?

我们有100,000个aggregateId,每个id都有15,000个events。无法被aggregateId过滤,我们的投影必须遍历 all events

1 个答案:

答案 0 :(得分:1)

因此,您有100.000个聚合,每个聚合有15.000个事件。

您可以使用ReadModel or ViewModel

读取模型

读取模型可以视为您的应用程序的读取数据库。因此,如果要存储有关每个聚合的某些数据,则应在每个表的某些表中插入/更新行或条目,请参见Hacker News example read model code

重要的是要了解,解析读取模型是按需构建的-在第一个查询上。如果您有很多活动,则可能需要一些时间。

要考虑的另一件事-新创建的解析应用程序配置为使用内存数据库读取模型,因此在每次启动应用程序时,都将对其进行重建。

如果您有很多事件,并且不想在每次启动应用程序时都等待读取模型的建立,则必须为读取模型配置真实的数据库存储。

有关配置适配器的详细信息,we'll fix this。这是您需要在mongoDB的相关配置文件中编写的内容:

readModelAdapters: [
  {
    name: 'default',
    module: 'resolve-readmodel-mongo',
    options: {
      url: 'mongodb://127.0.0.1:27017/MyDatabaseName',
    }
  }
]

由于具有数据库引擎,因此也可以将其用于事件存储:

storageAdapter: {
  module: 'resolve-storage-mongo',
  options: {
    url: 'mongodb://127.0.0.1:27017/MyDatabaseName',
    collectionName: 'Events'
  }
}

ViewModel ViewModel是在查询过程中即时构建的。它不需要存储,但是会读取给定aggregateId的所有事件。

reSolve视图模型正在使用快照。因此,如果您有15.000个给定聚合事件,那么在第一个请求上,所有这些事件将首次应用于计算竞争状态。此后,将保存此状态,所有后续请求将读取快照和所有后续事件。默认情况下,每100个事件完成一次快照。因此,在第二个查询中,reSolve将读取该视图模型的快照,并对其应用不超过100个事件。

同样,请记住,如果要使快照存储具有持久性,则应配置快照适配器:

snapshotAdapter: {
  module: 'resolve-snapshot-lite',
  options: {
    pathToFile: 'path/to/file',
    bucketSize: 100
  }
}

ViewModel还有一个好处-如果您在客户端上使用resolve-redux中间件,它将在该处保持最新状态,以反应方式应用应用程序通过websockets接收的事件。

相关问题