大型数据集的性能问题
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 接收的事件。
有没有什么方法可以通过 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 接收的事件。