【发布时间】:2017-10-04 15:15:56
【问题描述】:
我正在尝试使用 Postgres 实现事件溯源系统。 最好的解释方式是举例。 所以让我们假设我的事件最终需要描述一个人。 我有以下事件:
- PersonCreatedEvent(value = 100, field = "id", date = ..)
- AgeUpdated(值 = 10,字段 = “年龄”,日期 = ..)
- LastNameUpdate(value = "newLastName", field = "lastname", date = ..)
- LocationUpdated(value = (lat, long), field = "location", date = ..)
- BalanceUpdated(value = 1000, field = "balance", date = ..)
事件 1 在人的一生中只会发生一次。
事件 2 - 3 可能发生多次。
事件 4 - 5 可以发生很多次。
最终,我将得到一个主要与事件 4 和 5 一致的表格。
因此,如果我的表中有 1000 万人,我可能有数十亿个事件,而其中 99% 基本上是 4 和 5。这将导致一个巨大的数据存储,不确定 Postgres 是否能很好地处理它.(它可以..但随着大量工作\基础设施的增加。)
这只是一个示例,我的实体可能由 100 个字段组合而成,这意味着每个实体至少有 100 个事件。部分字段具有事件4和事件5的特征。
在我的案例中使用事件溯源的附加价值是我获得了关于我的实体的固有历史记录,这在我的案例中是产品要求。
在这种情况下,最佳做法是什么? 也许更频繁的属性应该在其他地方处理?
更新: 另一个例子是查看设备聚合。
- DeviceManufacturerUpdated(value = "cisco", field = "manufacturer", date = ..)
- DeviceNameUpdated(value = "foo", field = "name", date = ...)
- DeviceIpUpdated(value = "1.1.1.1", field = "ip", date = ...)
- DeviceLocationUpdated(value = "新位置", field = "location", date = ...)
- DeviceLastSeenUpdated(value = "some date", field = "last_seen), date = ...)
这里也一样 1. 事件 1 可以发生一次 2. 事件 2 可以发生多次 3.事件3可能每天都在发生 4. 事件 4 可能一天发生几次 5. 事件 5 可能每分钟发生一次
如果我在 postgress 上实现它,我最终会得到一个巨大的表,其中主要包含事件 4 和 5。
【问题讨论】:
-
快照可能会有所帮助,但我认为在某些时候我需要对我的数据库大小做一些事情。 (大小是我坚持的事件“类型”的结果)。所以在某些时候会留下快照,但我会失去历史记录功能(删除事件后)。当我的表包含 99% 相同的事件类型时,感觉就像我做错了什么。感觉好像还有我不知道的优化空间..:-|你怎么看?
标签: cqrs event-sourcing