面试题答案
一键面试一致性问题场景及解决方案
- 数据写入一致性
- 场景:Kafka 接收到实时数据,要同步写入数据库和缓存。可能出现写入数据库成功,但写入缓存失败,导致数据库与缓存数据不一致。
- 解决方案
- 使用事务:如果数据库支持事务(如关系型数据库),在 Kafka 消费端代码中,将数据库写入和缓存写入操作放在一个事务中。若缓存写入失败,事务回滚,数据库写入也撤销。
- 重试机制:对于缓存写入失败的情况,设置合理的重试次数。若多次重试仍失败,记录日志并报警,人工介入处理。
- 数据更新一致性
- 场景:推荐系统运行过程中,新数据到达 Kafka,需要更新数据库和缓存中的旧数据。可能由于网络延迟等原因,缓存更新成功,数据库更新失败。
- 解决方案
- 引入中间状态:在数据库和缓存之间引入一个中间状态标记。例如,先在数据库中标记数据为“待更新”,更新缓存成功后,再更新数据库中的实际数据并清除“待更新”标记。如果更新数据库失败,可根据“待更新”标记进行重试。
- 使用消息队列保证顺序:如果更新操作有顺序要求,利用 Kafka 的分区特性保证同一类数据的更新消息按顺序消费,避免因消息乱序导致的不一致。
- 缓存与数据库读取一致性
- 场景:从缓存读取数据失败(如缓存过期),转而从数据库读取。此时如果数据库数据刚被更新但缓存未及时更新,可能读取到旧数据。
- 解决方案
- Cache - Aside 策略:应用程序先从缓存读取数据,若未命中则从数据库读取。读取到数据后更新缓存,并设置合理的缓存过期时间。在数据更新时,先更新数据库,再使缓存失效。
- Read - Through 策略:引入一个代理层,当缓存未命中时,代理层负责从数据库读取数据并更新缓存,应用程序始终从缓存读取数据,保证数据一致性。