浅谈「领域事件」实践

2021-04-29  本文已影响0人  Gael

领域事件是DDD,Event Sourcing等架构中的一个重要概念。
基于工作环境中的一些实践经验,我总结了一些粗浅的体会。
文中不会有非常高深复杂的定义,只使用一些基本的概念。

领域事件定义

国外书籍中很少使用下定义的方式解释一个名词的含义。一般都会使用作诠释的方式:“领域事件可以怎样怎样”、“领域事件会带来什么什么”。

让我来下定义的话:领域事件是微服务系统中各服务通信的一种方式。和RPC类似,领域事件用于在服务之间交换信息,但领域事件并不追求实时一致性,仅要求数据的最终一致性。

各服务在一些关键有意义的业务节点完成后会发送领域事件,代表一些关键的动作「已完成」。因此领域事件的命名多采用过去分词,例如「订单已发送Order sent」「订单已取消Order canceled」。

领域事件有多种实现方式。我工作中使用到的方式是:将一些关键的、其他服务可能用到的信息,打包成一个结构体,以消息的形式,通过消息队列中间件,异步传输给系统中订阅该消息的服务。

领域事件带来的收益

介绍领域事件的书籍从不吝惜对领域事件优点的赞美。在此我针对各优点谈谈自己的感受。

增强服务自治性

这大概是领域事件最常被提及的优点了。何谓“自治性”?我的理解是:一个服务只需要关注自己,不与其他服务耦合的程度。单体服务不依赖其他任何服务,自治性最高;如果一个服务调用了大量其他服务的RPC,那么它的稳定性和业务逻辑必定受其他服务的影响,自治性稍差。

为什么能提升自治性?个人认为有以下原因:

首先领域事件一般使用消息队列实现,消息队列是异步的,不会阻塞调用。如果因一时网络原因消息无法传达,那么也会由消息组件重试。领域事件可以看做异步的非阻塞的由第三方保证最终送达的RPC,可靠性比普通的RPC更高。

另一点就是领域事件不必指定消息的接收方是谁。假设我们有这样的业务场景,A服务完成了某一动作后,需要通知B。如果我们使用RPC通信,后面业务扩展时增加了C,D服务需要通知,则实现时我们需要修改A的代码,A的业务逻辑可能还要受到C,D处理结果的影响。但是如果我们使用领域事件进行通信,则在新增C,D服务之后,让它们订阅A发出的事件即可,A服务完全不需要修改,不受其他服务的影响,提升了自治性。

回放系统动作

如果我们把系统看做一个状态机,则领域事件可以看做推动状态机转移状态的输入。领域事件是具有业务含义的,回放某一时间段的领域事件可以复现用户操作。通过数据库binlog回放也可以达到类似的效果,但binlog是没有业务语义的,回放结果没有准确的解读方式。

回放领域事件当然需要某种消息存储/检索机制,这里不做展开。

实践领域事件时的一些思考

上一篇下一篇

猜你喜欢

热点阅读