分布式系统中解耦的模式:显式化公共化你的领域事件 - mathiasverraes

19-05-14 banq
                   

将一小部分事件标记为公共事件,默认情况下保持其他事件为私有。(有界上下文内部时私有,有界上下文或微服务之间发送消息事件是公有,分成两个不同的消息主题通道)

问题

领域事件 不仅可用于与其他有界上下文进行通信,还可用于组织和解耦有界上下文中的代码,在CQRS / Eventsourcing架构中甚至是组织代码的主要方式。

使用单一总线发布所有这些事件非常方便,有效地使它们全部公开。当其中一些事件包含敏感数据时,这是一个问题。更重要的是,外部API与有界上下文的内部结构紧密耦合。更改内部会强制进行API更改。

解决

在有界上下文内部和外部设置单独的消息传递通道:默认情况下将所有事件保持为私有;对于要公开的事件使用显式@Public注释,标记接口或用isPublic():bool方法指示。

发送事件时,事件发布机制必须知道读取注释并仅在私有信道上发送事件,或者在私有和公共信道上发送事件。

讨论

一般来说,我的感觉是,仔细选择领域事件以反映业务领域,使用泛在的统一语言,并以正确的粒度时设计事件时,很少有问题发生。然后,这些事件在开发过程中会很快变得稳定,很少需要改变。当t域中的有重要改变时,事件可能需要更改,但在这些情况下,无论如何都需要API更改。

也就是说,它是软件设计中一种普遍有用的启发式方法,可以使所有内容尽可能地保持封闭状态,并且仅在有好的情况下打开它。