我正在 AWS 上设计一个 Event Store,我选择了 DynamoDB,因为它似乎是最好的选择。我的设计似乎相当不错,但我面临一些我无法解决的问题。
**该设计
事件由该对唯一标识(StreamId, EventId)
:
StreamId
:和aggregateId一样,意思是一个Event Stream对应一个Aggregate。EventId
:一个递增的数字,有助于将排序保持在同一事件流中
事件保留在 DynamoDb 上。每个事件映射到表中的单个记录,其中必填字段是 StreamId、EventId、EventName、Payload(可以轻松添加更多字段)。
partitionKey 是 StreamId,sortKey 是 EventId。
将事件写入事件流时使用乐观锁定。为此,我使用了 DynamoDb 条件写入。如果已经存在具有相同(StreamId,EventId)的事件,我需要重新计算聚合,重新检查业务条件,如果业务条件通过,最后再次写入。
事件流
每个事件流由 partitionKey 标识。查询所有事件的流等于查询 partitionKey=${streamId} 和 0 到 MAX_INT 之间的 sortKey。
每个事件流标识一个且只有一个聚合。如前所述,这有助于使用乐观锁定处理同一聚合上的并发写入。这也可以在重新计算聚合时提供出色的性能。
活动发布
利用 DynamoDB Streams + Lambda 的组合发布事件。
重播事件
这是问题开始的地方。将每个事件流仅映射到一个聚合(这导致拥有大量事件流),没有简单的方法可以知道我需要从哪些事件流中查询所有事件。
我正在考虑在 DynamoDB 中的某处使用一个额外的记录,它将所有 StreamIds 存储在一个数组中。然后我可以查询它并开始查询事件,但如果在我重播时创建了一个新流,我会丢失它。
我错过了什么吗?或者,我的设计是否完全错误?