事件溯源和CQRS非常好,因为它可以摆脱开发人员陷入一个预先建模的数据库中,除非进行大型数据迁移项目,否则需要在应用程序的生命周期内使用该数据库。 CQRS和ES还有其他好处,如扩展事件存储,审计日志等,这些好处已经在互联网上广泛存在。
但是有什么缺点呢?
以下是我在研究和编写小型演示应用程序后想到的一些缺点:
- 复杂: 有些人说ES很复杂。但我想说,拥有一个复杂的应用程序总比拥有一个只能使用查询语言(多个连接、索引等)运行非常受限制的查询的复杂数据库模型要好。我的意思是,一些编程语言,如Scala,具有非常丰富的集合库,非常灵活,可以产生一些非常复杂的聚合,而且还有Apache Spark,它使查询分布式集合变得容易。但是,数据库将始终受到其查询语言功能的限制,并且分发数据库比分发应用程序代码更困难 (只需在另一台机器上部署另一个实例!)。
- 高磁盘空间使用率:事件存储可能会使用大量磁盘空间存储事件。但我们可以每隔几周安排一次清理,并创建快照,也许我们可以在外部硬盘上本地存储历史事件,以防将来需要旧事件?
- 高内存使用率:每个域对象的状态都存储在内存中,这可能会增加RAM的使用量,而我们都知道RAM有多么昂贵。 大问题!因为我很穷!有什么解决方案吗?也许使用Sqlite而不是在内存中存储状态?通过在应用程序中引入多个Sqlite实例,是否使事情更加复杂?
- 启动时间较长:在故障或软件升级时,启动时间取决于事件数量。但我们可以使用快照来解决这个问题?
- 最终一致性:某些应用程序的问题。想象一下,如果Facebook用Event sourcing和CQRS来存储帖子,考虑到Facebook的系统有多忙,如果我发布了一个帖子,我可能要等到第二天才能看到我的fb帖子 :)
- 事件存储中的序列化事件:事件存储将事件作为序列化对象存储,这意味着我们无法查询事件存储中事件的内容,而且这也是不鼓励的。而且,我们将来也无法向事件中添加另一个属性。解决方案是将事件存储为JSON对象而不是序列化事件?但这是一个好主意吗?或者增加更多的事件以支持对原始事件对象的更改?
请有人评论我提出的缺点,并纠正我是否错误并建议我可能遗漏的任何其他缺点?