事件源是一种应用程序架构模式,使用只追加存储来记录对数据产生影响的事件,而不是仅存储域中数据的当前状态。事件溯源模式的定义是对一系列事件驱动的数据进行处理操作的方法,应用程序代码以命令方式描述每个数据操作的一系列事件发送到事件存储,这些事件在其中是持久化的。 每个事件表示对数据所作的一系列更改,由于事件源追加写入的特性,在任何时候,应用程序都可能读取事件的历史记录,并且将程序返回到任意历史状态;
传统数据库通常是指关系型数据库,这类数据库使用SQL语言进行数据管理,其在传统IT行业具有较高的使用率。关系型数据库普遍支持事务,同时基于锁的机制维持数据的一致性和完整性。
事件源模式和传统数据库方法用于数据管理的优缺点
事件源模式的优点:
- 事件源通过追加写入,可以保存所有对存储状态有影响的操作,这一特性为事务回滚和错误恢复提供了有效支持,同时可以通过数据分析的方法发现数据的变化趋势。
- 在事件源模式下,服务通过互相监听事件来交互,减少了直接依赖
事件源模式的缺点:
- 增加了系统复杂性,需要对事件日志进行管理并开发状态控制逻辑
- 在高并发环境下保证事件的写入顺序和一致性存在一定的困难
- 数据量较大时对存储空间的需求显著增加
传统数据库方法的优点
- 事务的特性可以确保写入数据的原子性、一致性、隔离性和持久性
- SQL语言的支持提供了优秀的数据查询能力
传统数据库方法的缺点
由于SQL固定的数据结构和语法,复杂的服务可能拥有复杂的表结构,在某些查询时会产生额外的时间开销。
事件源模式和传统数据库方法在数据量、数据结构和数据访问模式上的差异对应用程序性能的影响
事件源模式
事件源模式存储每一个引起状态变化的事件,随着时间的增加数据量会显著提高; 事件通常以日志形式存储,数据结构简单,但当需要重建一个复杂事件时可能需要聚合多个历史事件,需要额外的逻辑设计考量;事件源的数据访问模式是追加写入和顺序读取,因此对于需要频繁查询历史事件的场景,性能可能受限,因为每次查询可能都涉及到状态重建的复杂计算。
传统数据库方法
传统数据库通过覆盖写入的方式减少数据冗余,但当数据量增加到一定程度时,数据的读取速度会明显下降,但可以通过分表或建立索引等方式优化;传统数据库拥有高度规范化的数据结构,这一特性同样可能导致复杂的表连接,在复杂查询时可能成为性能瓶颈;传统数据库通过事务、索引和缓存机制来提升性能,但在高并发时,可能需要额外手段来提升性能,例如读写分离和多个主实例。
在云原生环境下,数据缓存、数据分区和数据复制对应用程序性能的影响
数据缓存
数据缓存可以将原本存储在硬盘的数据转存到内存中,极大的提升数据的检索速度,数据缓存的适用场景是那些变动不频繁但访问量较大的数据。数据缓存的一个典型技术是Redis。
数据分区
数据分区是指将数据分散到网络中的多个节点,根据请求来将访问分流,从而提高服务的并发处理能力;该技术的典型应用是Redis的Cluster分片存储技术。
数据复制
数据复制是指将数据的副本存储到一个或多个数据库实例,这个技术极大的提高了服务的容错性和可用性,当主库宕机时,原本作为副本的数据库实例可以立刻接替,成为新的主库。该技术的典型应用的MySQL的binlog和GTID主从复制以及Redis的sentinel。
使用事件源模式和传统数据库方法进行数据管理在性能、可扩展性、可靠性和可维护性的区别和优劣
性能
事件源采取追加写入而传统数据库方法一般是覆盖写入,因此事件源在写速度上有优势;缺点是读操作可能涉及到状态重建,尤其是当事件链较长时,而可能会产生额外的性能负担;相反传统数据库方法在读取数据有性能和时间优势,但当存在大量更新写入时可能遇到性能瓶颈。
可扩展性
在事件源模式下,服务通过互相监听事件来交互,因此非常适合在分布式系统中进行水平扩展;而MySQL、Redis、MongoDB等数据库同样提供了分片和复制方法来保证其水平扩展能力,但如何确保分片和复制结点中数据一致性可能是个挑战。
可靠性
相对独立的事件记录允许服务恢复到任何历史状态,但一旦事件记录出现问题,可能影响整个系统的状态重建;传统数据库方法提供手动备份和主从复制确保可靠性,但在极端情况下,例如主节点宕机而从节点尚未完成复制时,会出现数据丢失。
云原生环境下数据管理的最佳实践
选择合适的数据库类型
选择数据库时需考虑应用需求、拓扑结构以及性能指标。关系型数据库提供事务一致性,适合结构化数据和复杂查询。NoSQL数据库在大规模数据存储和高并发场景下表现更优,而事件源模式提供历史状态回溯。
确保数据持久性和高可用性
云原生平台通常采用容器化技术,容器作为一次性实体,它的生命周期通常短于需要持久存储的数据库。因此,可以通过Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 为数据库提供持久存储;利用复制组、主从结构或分布式数据库系统,即便在节点故障的情况下也能保持服务的连续性。
自动化操作
自动化减少了人工干预,提高了运维效率,降低了出错率。在数据库管理中,部署、监控、灾难恢复和扩缩容等环节都适合采取自动化措施。通过容器编排工具如Kubernetes中的Operators可自动化数据库生命周期过程;根据资源利用率自动调整数据库实例的数量或规格,以优化资源使用和成本。
确保数据安全
数据需符合安全标准与法规要求。包括访问控制、加密、备份策略等,对于敏感数据,甚至需要实施加密存储和传输。利用角色基础的访问控制(RBAC)限制对敏感数据的访问;确保传输中数据的加密,并通过定期备份和快照来防止数据丢失。
监控和日志分析
收集和分析指标如延迟、吞吐量和错误率,来优化性能;通过定期审查日志发现潜在的安全威胁或配置问题
References
- Microsoft, Event Sourcing pattern, https://learn.microsoft.com/en-us/azure/architecture/patterns/event-sourcing
- Mickael M, 19 March 2019, An introduction to event sourcing, IBM Developer, https://developer.ibm.com/articles/event-sourcing-introduction/
- David P, Relational vs. Non-Relational Database: Pros & Cons, Alog blog, https://aloa.co/blog/relational-vs-non-relational-database-pros-cons
- Adarshjkbjz, 31 October 2023, Event-Driven Architecture Patterns in Cloud Native Applications, Geeksforgeeks, https://www.geeksforgeeks.org/event-driven-architecture-patterns-in-cloud-native-applications/
- Alistair N, 5 Best Practices for Managing Data in the Cloud, Papercut, https://www.papercut.com/blog/print_tips/5-best-practices-for-managing-data-in-the-cloud/