事件溯源:在内存中存储大量记录的开销



我正在实现事件溯源架构,我的聚合将在内存中包含大量记录。为了测试 .NET 在内存中存储大量记录的能力,我创建了一个简单的程序:

static void Main(string[] args)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
int maxRecords = 100000000;
for (int i = 0; i < maxRecords; i++ )
{
dict.Add(i.ToString(), new String('A', 10));
}
Console.WriteLine("Done");
Console.ReadLine();
}

在配置文件中,我有:

<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>

所以我存储了 1 亿条记录,每条记录是 10 个字节(假设 20 个,因为它可能是 Unicode(。所以我在内存中存储了大约 2GB 的数据。但是,该应用程序增长到15GB。

  1. 理想情况下,我想将东西存储在 IDictionary 中。我可以做些什么来减少开销?

  2. 如果有人使用过在内存中存储大量数据的事件溯源体系结构,请分享您的经验以及您如何构建聚合。

这个问题的经典解决方案通常基于两点:

  • 选择正确的聚合根,以便其中哪个状态较小。由于不允许聚合间通信,因此对于执行单一命令,应仅为一个聚合根加载一个小状态。它可以很容易地通过数据库中的一个异步查询来检索

  • 将查询端存储在许多不同的集合上,其上的每个项目都按文档标识符隔离。因此,您的系统进程不必将读取模型持久保存在内存中。

最新更新