EventStore文件存储设计

本文探讨了一个专为Event Sourcing场景设计的Event Store实现,强调高性能和并发控制。介绍了内存存储策略,包括aggregateLatestVersionDict和commandIdDict,以及物理存储的事件数据、事件索引和命令索引的细节,如B+树和BloomFilter的应用。

背景

ENode是一个CQRS+Event Sourcing架构的开发框架,Event Sourcing需要持久化事件,事件可以持久化在DB,但是DB由于面向的是CRUD场景,是针对数据会不断修改或删除的场景,所以内部实现会比较复杂,性能也相对比较低。而Event Store实际上对数据只有新增和查询的需求,所以我想为Event Sourcing的场景针对性的实现一个Event Store。看了一下业界的一些实现,感觉都没有达到我的期望,所以想自己动手实现一个。下面是我构思的一个Event Store的单机版应该要具备的能力以及对应的设计方案,分享出来和大家讨论。

一、需求概述

  • 存储聚合根的事件数据
  • 支持事件的版本并发控制,新事件的版本号必须是当前版本号+1
  • 支持命令重复判断,即不可以处理重复命令产生的事件
  • 支持按聚合根ID查询该聚合根的所有事件
  • 支持按聚合根ID+事件版本号查询指定的事件
  • 支持按命令ID查询该命令对应的事件数据
  • 高性能,写入要尽量快,查询要尽量快

二、事件数据格式

{
  "aggregateRootId": "",     //聚合根ID
  "aggregateRootType": "",   //聚合根类型
  "eventVersion": "",        //事件版本号
  "eventTime": "",           //事件发生时间
  "eventData": "",           //事件数据,JSON格式
  "commandId": "",           //产生该事件的命令ID
  "commandTime": ""          //产生该事件的命令产生时间
}

三、存储设计

1、核心内存存储设计

  • 遵循内存只存储索引数据的原则,尽量充分利用内存;
  • aggregateLatestVersionDict,存储每个聚合根的最大事件版本号k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值