从入门到放弃 - 事件溯源


本文转载自【何以解耦】:codedecoupled.com/php-es-quit.html

在接触事件溯源之初,其截然不同的设计模式常会让初学者望而却步。这篇文章概括了几种导致初学者放弃继续学习事件溯源的误解。

查询速度太慢

既然应用的当前状态需要通过事件流来获取的话,事件溯源无法实现对查询速度要求高的搜索功能。

当我们需要实现类似搜索这种对速度要求比较高的功能时,事件溯源提供了相应的解决方案 Projector。Projector 通过监听事件,生成独立的视图保存应用的当前状态。我们可以将其想象成数据库中的物化视图,或者是一种缓存。

聚合性能问题

随着事件数量的线性增长,塑造聚合的时间也会线性增长至无限长。

聚合需读取事件流来重塑其当前状态,塑造的时间确实会随事件数量的增长而呈线性增长,为了解决这个问题,事件溯源提供了一种叫做 Snapshot 的解决方案。

Snapshot 的中文意思是快照,顾名思义,Snapshot 的原理是将聚合的最新状态持久化。这样的话,在重塑时聚合便不需要读取所有的事件,这将大大提高其性能。

陡峭的学习曲线

与 CRUD 这种存储当前状态的模式相比,事件溯源的学习曲线太陡峭了,不值一顾。

学习事件溯源,我们必须改变传统的 CRUD 思想,学会使用事件驱动的方式解决问题。这种新的编程方式可以解决很多使用 CRUD 比较棘手的问题。

当然,我们也需要辩证地看待事件溯源。切不可任何项目都使用事件溯源,一定要分析业务场景,选择最理想的解决方案。

总结

放弃很简单,但坚持下来,一定很酷。

本文转载自【何以解耦】: codedecoupled.com/php-es-quit.html ,如果你也对 TDD,DDD 以及简洁代码感兴趣,欢迎关注公众号【何以解耦】,一起探索软件开发之道。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Know how, know why meanwhile.
xuding
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!