
1) 【一句话结论】采用变更数据捕获(CDC)技术从主数据库捕获数据变更日志,通过消息队列(如Kafka)异步分发至各校区,结合时间戳/版本号等冲突检测机制,最终保证数据一致性(通常为最终一致性,通过业务规则优化可达强一致性)。
2) 【原理/概念讲解】
老师:咱们先讲核心组件,一个是变更数据捕获(CDC),另一个是消息队列。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| CDC(如Debezium) | 从数据库日志捕获变更,生成事件 | 实时捕获,低延迟,与数据库强绑定 | 多数据源同步(如MySQL、PostgreSQL),数据变更实时同步 | 需要数据库支持日志(如MySQL binlog),配置复杂 |
| 消息队列(如Kafka) | 分布式消息系统,存储消息,消费端拉取 | 高吞吐、持久化、可扩展 | 异步解耦,缓冲数据,支持多消费端 | 需要集群部署,消息堆积风险 |
| 事务型消息(如Pulsar) | 支持事务消息,保证消息与业务事务一致 | 事务性,确保消息发送与业务操作一致 | 需要事务支持的场景(如金融交易) | 配置复杂,性能可能受影响 |
4) 【示例】
假设用户表结构:user(id, name, version, update_time),通过版本号解决冲突。
UPDATE user SET name='Alice', version=2 WHERE id=1 AND version=1;{"id":1, "op":"UPDATE", "data":{"name":"Alice", "version":2}, "timestamp":1670000000}name='Alice', version=2;5) 【面试口播版答案】
面试官您好,针对多校区用户数据同步一致性,我的方案是采用CDC+消息队列的架构。首先,通过CDC工具(如Debezium)从主数据库捕获所有用户数据的变更日志(INSERT/UPDATE/DELETE),实时生成事件并推送到消息队列(如Kafka)。各校区作为消费者,从Kafka拉取消息并更新本地数据库。冲突解决上,我们在用户表中增加一个版本号字段(version),每次更新时检查本地版本号是否小于远程版本号,若小于则更新,否则回滚或通知。这样既保证了数据最终一致性,又能通过版本号机制避免冲突。具体来说,当主校区更新用户名时,CDC捕获变更,Kafka发送消息,各校区消费后根据版本号判断是否需要更新,确保数据一致。
6) 【追问清单】
7) 【常见坑/雷区】