
1) 【一句话结论】采用“事件驱动+CDC+消息队列”混合架构,通过CDC捕获系统变更,封装为消息推送到消息队列,各系统异步消费并应用变更,结合版本号/时间戳机制处理冲突,确保数据最终一致性。
2) 【原理/概念讲解】
老师口吻解释各技术核心:
3) 【对比与适用场景】
| 技术方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| ETL | 批量数据抽取、转换、加载 | 批量处理,周期性(如每日),处理历史数据 | 数据仓库、报表生成 | 不适合实时变更,延迟高 |
| CDC | 捕获数据库变更日志 | 实时/准实时,低延迟,不影响业务 | 系统间实时数据同步(如TOS与WMS) | 需数据库支持变更日志(如MySQL binlog) |
| 消息队列 | 异步通信中间件 | 解耦、高吞吐、持久化 | 系统间异步交互,解耦耦合 | 需考虑消息顺序、重试机制 |
4) 【示例】
假设船舶位置更新(TOS系统)触发消息,WMS系统消费更新货物位置:
UPDATE ship_positions SET location='堆场A' WHERE ship_id='S001';,同时生成变更事件,发送到Kafka主题ship_position_events。ship_id和location更新货物位置表,检查版本号(version字段),若本地版本旧则更新。def consume_ship_events():
for msg in kafka_consumer.subscribe('ship_position_events').poll():
event = json.loads(msg.value)
ship_id = event['ship_id']
new_location = event['location']
local_version = get_ship_version(ship_id)
if local_version < event['version']:
update_wms_ship(ship_id, new_location, event['version'])
send_ack(msg)
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对港口多系统数据一致性,我设计的方案是采用事件驱动+CDC+消息队列的混合架构。核心思路是:各系统(如TOS、WMS)通过CDC捕获自身数据变更(比如船舶位置更新、货物位置变更),将变更封装为标准消息推送到消息队列(如Kafka),其他系统作为消费者异步消费消息并应用变更。这样既解耦了系统间的强依赖,又保证了变更的实时传递。具体来说,当TOS更新船舶位置时,会触发CDC生成变更事件,发送到消息队列;WMS消费该消息后,检查本地货物位置是否与船舶位置匹配,若不匹配则更新,并使用版本号(或时间戳)解决冲突。比如,当两个系统同时修改同一货物位置时,系统会根据最后修改时间或版本号决定哪个更新有效,避免数据混乱。这种方案通过异步消息保证高可用,通过CDC保证变更的实时性,最终实现数据的一致性。”
6) 【追问清单】
acks=all),确保消息至少被存储一次,消费者消费失败后重试。version字段),每次更新时记录版本,消费时比较本地版本与消息中的版本,若本地版本旧则更新,否则忽略或回滚。7) 【常见坑/雷区】