大型数据集的性能问题

Performance issues with large datasets

有没有什么方法可以通过 aggregateId 过滤与读取模型关联的投影中的事件?

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

我们有 100,000 个 aggregateId,每个 id 关联了 15,000 个 events。无法按 aggregateId 过滤,我们的预测必须迭代 all events.

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

您可以使用 ReadModel or ViewModel:

阅读模型:

读取模型可以看作是您应用程序的读取数据库。因此,如果您想存储有关每个聚合的一些数据,您应该 insert/update 行或每个聚合的某些 table 中的条目,请参阅 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 个事件用于给定聚合,那么在第一次请求时,所有这些事件都将首次应用于计算 vies 状态。在此之后,该状态将被保存,所有后续请求将读取快照和所有后续事件。默认情况下,每 100 个事件完成一次快照。因此,在第二个查询中,reSolve 会读取此视图模型的快照,并对其应用不超过 100 个事件。

再次记住,如果您希望快照存储持久化,您应该配置一个快照适配器:

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

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