【发布时间】:2022-06-22 19:16:51
【问题描述】:
我们使用 MartenDB 事件存储和项目事件来读取模型。我们有一个 ASPNET Core API 来查询模型并将其发送到客户端。现在,有一个端点每 10-15 秒从被查询的读取模型中检索一个巨大的文档图(整个 Postgress DB 转储大约为 9 MB),如下所示:
public async Task<Content> GetContent()
{
var layouts = await GetShallowLayouts();
var pages = await GetAllPages();
// ...
// Other calls to DB
// Combine all results into one Content object
return content;
}
private async Task<IReadOnlyList<Layout>> GetShallowLayouts()
{
using async var session = DocumentStore.LightweightSession();
return await session.Query<Layout>()
.OrderByDescending(x => x.Brand)
.ToListAsync();
}
private async Task<IReadOnlyList<ExperimentWithVariants>> GetExperiments()
{
using async var session = DocumentStore.LightweightSession();
return await session.Query<ExperimentWithVariants>()
.ToListAsync();
}
...
当我们使用 .NET Core 3.1 和 Marten 3.X 时,整个应用程序在 kubernetes pod 中消耗了大约 250MiB(参见下面的屏幕)。
但是当移植到 Marten 5.x 和 NET6 时,内存消耗增加到大约 1.5 GiB (!) 我们尝试进行一些重构,以使所有调用都在一个打开的会话中进行,如下所示:
public async Task<Content> GetContent()
{
using(var session = DocumentStore.LightweightSession())
{
var layouts = await GetShallowLayouts(session );
var pages = await GetAllPages(session );
// ...
// Other calls to DB
// Combine all results into one Content object
return content;
}
}
private async Task<IReadOnlyList<Layout>> GetShallowLayouts(IQuerySession session)
{
return await session.Query<Layout>()
.OrderByDescending(x => x.Brand)
.ToListAsync();
}
private async Task<IReadOnlyList<ExperimentWithVariants>> GetExperiments(IQuerySession session)
{
using async var session = DocumentStore.LightweightSession();
return await session.Query<ExperimentWithVariants>()
.ToListAsync();
}
但内存仍约为 1 GiB。
我知道 Marten 中有很多配置设置,其中一些在版本 3 和 4 之间发生了变化,但有没有类似的问题,可以阐明我们应该在哪里寻找解决方案?
【问题讨论】:
标签: c# kubernetes marten