先这样答
系统可以按文档计算内容 hash,再通过轮询或监听数据源变更来触发比对。系统把当前文档的 hash 和已有记录进行比较,就能判断文档是新增、修改还是删除。
基础方案适合对实时性要求不高的场景。轮询实现简单,系统按固定方式检查数据源,再计算并比对 hash。监听数据源变更可以减少不必要的检查,数据源发生变化时再处理。
如果实时性要求高,我会改成消息队列驱动的事件处理。文档发生变更后,数据源产生变更事件,消息队列传递事件,消费方收到事件后触发入库。这样文档变更可以做到秒级生效。面试时我会先说明基础方案,再根据实时性要求选择事件驱动方案。
面试官会怎么追问
-
「为什么要给每个文档计算内容 hash?」 内容 hash 可以代表当前文档内容。系统拿当前 hash 和已保存的 hash 做比对,就能判断内容是否发生变化。
-
「新增、修改、删除分别怎么判断?」 系统把数据源中的文档和已有记录进行比对。只在数据源中出现的文档属于新增,hash 发生变化的文档属于修改,已有记录中不再出现的文档属于删除。
-
「消息队列在这里具体解决什么问题?」 消息队列承接文档变更事件,并把事件传给处理方。处理方收到事件后触发入库,避免只依赖轮询,从而让变更做到秒级生效。
回答的坑
- 只说轮询而不提实时性要求高时的消息队列方案,无法回答场景变化。
- 只说监听变更而不说明通过内容 hash 比对,无法清楚判断新增、修改和删除。
同系列的题
—— 本题完 ——