MST

星途 面试题库

面试题:消息队列Kafka与其他组件协作构建实时推荐系统的一致性保障

在使用Kafka与其他组件(如数据库、缓存)共同构建实时推荐系统时,如何保证数据在不同组件之间的一致性?列举可能遇到的一致性问题场景,并给出相应的解决方案。
49.7万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

一致性问题场景及解决方案

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