微服务篇:物化来自实体事件的状态

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 通过从实体事件流中按顺序处理实体事件,可以将信息物化成一个有状态的表。每个实体事件都会被更新插入键/值表中,这样对于一个给定的键,表中表示的就是最新读到的事件。

网络异常,图片无法展示
|

通过从实体事件流中按顺序处理实体事件,可以将信息物化成一个有状态的表。每个实体事件都会被更新插入键/值表中,这样对于一个给定的键,表中表示的就是最新读到的事件。相反,通过将每次更新发布到事件流,可以将表转化成一个实体事件流。这就是所谓的表流二元性(table-streamduality),它是事件驱动型微服务中创建状态的基础。如图 2-3 所示,AA和 CC 在其物化表中都有最新的值。

更新插入的意思是当表中不存在记录时就插入一个新行,否则更新这一行。

网络异常,图片无法展示
|

同样,可以将所有表记录的更新用于生成一个表示随时间变化的表状态的事件流。在下面的例子中,BB 被更新插入了两次,而 DD 只被更新插入了一次。图 2-4 中的输出流展示了表示这些操作的 3 次更新插入事件。

网络异常,图片无法展示
|

一个关系型数据库表是通过一系列插入、更新和删除命令来创建和填充的。

这些命令可以作为事件生成到不可变日志中,比如一个本地追加文件(如MySQL 中的二进制日志)或者一个外部事件流。通过回放日志中的所有内容,可以精确地重建表及其所有数据内容。

 这种表流二元性用于在事件驱动型微服务之间传递状态。任何消费者客户端都可以读取键控事件的事件流并物化成自身的本地状态存储。这种简单而强大的模式让微服务可以单纯通过事件共享状态,而无须在生产者服务和消费者服务之间有任何直接的耦合。

键控事件的删除是通过生成一个“墓碑”(tombstone)来处理的。墓碑是一个值被设为 null 的键控事件。这是一种约定,它向消费者表明应该从物化数据存储中移除这个键对应的事件,因为上游生产者已经宣称它已被删除。

除非进行压缩,否则追加的不可变日志可能会无限增长。压缩由事件代理来执行,通过只保留指定键的最新事件以减小其内部日志的大小。相同键的旧事件会被删除,剩余的事件会被压缩到一个新的、更小的文件集中。事件流的偏移会保持不变,这样消费者就无须进行任何更改。下图说明了在事件代理中一个事件流的压缩逻辑,包括墓碑记录的完全删除。

网络异常,图片无法展示
|

压缩减少了磁盘的使用和到达当前状态所需的事件的数量,其代价是放弃了事件流所提供的事件历史信息。

在事件驱动架构中,为业务逻辑维护状态是一种非常常见的模式。几乎可以肯定地说,一个完整的业务模型不可能适应完全无状态的流式领域,因为过去的业务决策将影响你今天做出的决策。举个具体的例子,如果你从事零售业务,那么你需要知道你的库存水平以确定何时重新订购,进而避免向客户销售不存在的商品。你也希望跟踪应付账款和应收账款。也许你想每周向所有提供了电子邮箱地址的客户推送一次促销活动。所有这些系统都要求你能够将事件流物化为当前状态表示。

连载中,还没关注的小伙伴记得点个关注不迷路~

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
86 0
|
消息中间件 存储 关系型数据库
基于领域事件实现微服务解耦
基于领域事件实现微服务解耦
186 0
基于领域事件实现微服务解耦
|
消息中间件 领域建模 数据安全/隐私保护
微服务架构谈(4):领域事件-解耦微服务的关键
微服务架构谈(4):领域事件-解耦微服务的关键
606 0
微服务架构谈(4):领域事件-解耦微服务的关键
|
Java Nacos 微服务
微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析
为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端; 由于篇幅有限,这里将源码分析分为上下两篇,其中上篇讲获取配置与事件订阅机制,下篇讲长轮询定时机制;
466 0
微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析
|
新零售 消息中间件 NoSQL
|
微服务 人机交互 存储
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
3月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。