
将事件驱动架构与现有系统集成
|
59
糟糕的可伸缩性
触发器数量应随着要被捕获的数据集数量线性伸缩。这要排除业务逻辑中可能已经存在
的所有其他触发器,比如用于增强表之间依赖关系的触发器。
事后结构化
对输出事件的结构化只能发生在已经将记录写到发件箱表之后。这可能会导致在发件箱
中有无法发布的事件。
某些数据库允许触发器在执行期间用可校验数据和输出事件
schema
兼容性
的语言来执行(例如,
PostgreSQL
可以用
Python
来执行)
。这会增加复杂性
和开销,但会显著降低下游
schema
不兼容的风险。
4.7
对处于捕获的数据集做数据定义变更
在数据解放框架中集成数据定义变更是很困难的。数据迁移对许多关系型数据库应用程序
来说是常见操作,并且数据捕获过程需要支持它们。关系型数据库的数据定义变更包括对
列的添加、删除和重命名,更改列的类型,以及添加或删除默认值。虽然所有这些数据集
变更操作都是合法的,但它们可能会对解放事件流数据造成问题。
数据定义
是对数据集的正式描述。例如,关系型数据库中的一张表是用
数据
定义语言
(
data
definition language
,
DDL
)来定义的。结果表、列、名称、
类型和索引都是其数据定义的一部分。
如果要求完全的
schema
演化兼容性,就不能删除处于捕获中的数据集中没有默认值的非
空列,因为正在使用之前所定义的
schema
的消费者期望有这个字段的值
。消费者将无法
回退使用任何默认值,因为在契约定义阶段没有指定,所以它们最终将处于一种不明确的
状态。如果不兼容的变更是绝对必要的,并且违反数据契约无法避免 ...