Apache kafka 在事件驱动体系结构中使用变更数据捕获和Debezium导致的不一致性
我们一直在使用更改数据捕获和发件箱模式,通过使用Debezuim和Kafka在我们的事件驱动架构中保持不同微服务之间的数据库同步。我们在早期阶段面临的一个挑战是,如果Kafka不能跨多个分区保持秩序,我们如何确保数据库不会失去同步。处理这种情况的方法是明智地选择分区键,这样与相同实体相关的所有事件都应该基于分区键转到相同的分区。因此,可以为同一实体保留顺序。一开始这似乎很简单,但解决涉及两个不同实体的情况似乎是一个根本性的挑战。由于我们只能有一个分区键,因此我们需要决定在选择分区键时可以考虑哪个实体。下面是一个可能出错的实际示例: 假设有两个实体<代码>用户和具有MxN关系的工作区。每个Apache kafka 在事件驱动体系结构中使用变更数据捕获和Debezium导致的不一致性,apache-kafka,debezium,change-data-capture,event-driven-design,Apache Kafka,Debezium,Change Data Capture,Event Driven Design,我们一直在使用更改数据捕获和发件箱模式,通过使用Debezuim和Kafka在我们的事件驱动架构中保持不同微服务之间的数据库同步。我们在早期阶段面临的一个挑战是,如果Kafka不能跨多个分区保持秩序,我们如何确保数据库不会失去同步。处理这种情况的方法是明智地选择分区键,这样与相同实体相关的所有事件都应该基于分区键转到相同的分区。因此,可以为同一实体保留顺序。一开始这似乎很简单,但解决涉及两个不同实体的情况似乎是一个根本性的挑战。由于我们只能有一个分区键,因此我们需要决定在选择分区键时可以考虑哪个
用户
可以访问多个工作区
s,每个工作区
可以被多个用户
s访问。因此,定义了三组不同的事件来处理用户
和工作区
之间的关系:
事件(用户
,创建
和更新
)删除
事件(工作区
,创建
和更新
)删除
事件(用户工作区
和创建
)删除
工作区
分配给用户
时,可以生成以下三种类型的事件:
更新
用户
更新
工作区
创建
用户工作区
USER-WORKSPACE
包含USER
和WORKSPACE
的所有属性
2-仅使用用户-工作区
:用户ID
和工作区ID
架构中每个实体的ID
第一种方法的问题是它非常冗余,我们需要创建太多重复记录
另一方面,,第二种方法的问题是,我们无法保证在不同类型的事件之间保持顺序,因此我们需要以一种特殊的方式实现消费者,假设在消费USER
或WORKSPACE
实体之前消费了USER-WORKSPACE
,我们需要创建一个占位符在消费者服务方面。因此,如果相应的实体不存在,则可以为用户
和工作区
创建空实体
只有当我们能够保证相同类型事件的顺序时,此解决方案才有效。但是,当涉及到用户-工作区
事件时,如果选择用户id
,则工作区
可能会失去同步,如果选择工作区id
,则用户
可能会失去同步
下面是一个事件序列的示例,如果使用user_id作为user-WORKSPACE
事件的分区键,则可能会导致不一致。这是生成的事件的顺序:
1-USER
U1已创建
2-工作区
W1已创建
3-USER-WORKSPACE
U1-W1已创建
4-工作区
W1被删除
5-USER-WORKSPACE
U1-W1被删除
快照:
U1USER
工作区
W1已创建
2-工作区
W1被删除
3-USER
U1已创建
4-USER-WORKSAPCE
U1-W1已创建(应创建工作区的占位符
)
5-USER-WORKSPACE
U1-W1被删除(无法删除WORKSPACE
的占位符,因为我们不知道这是否是删除WORKSPACE
实体或相应关系的副作用)
快照:
U1USER
W1(占位符)WORKSPACE