MST

星途 面试题库

面试题:缓存设计之高级难度:高并发下缓存与消息队列的一致性保障

在高并发的业务场景下,如直播带货,缓存和消息队列的数据一致性很难保证。假设你使用Redis作为缓存,Kafka作为消息队列,阐述如何设计架构和流程来最大程度确保缓存与消息队列之间的数据一致性,分析可能出现不一致的情况及应对策略。
29.6万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

架构与流程设计

  1. 数据更新流程
    • 业务系统:当数据发生变化(如商品库存更新),业务系统首先向 Kafka 发送消息,消息内容包含数据更新的详细信息,如更新的字段、新的值等。
    • Kafka:负责接收并持久化这些消息,确保消息不会丢失。多个消费者可以从 Kafka 消费这些消息。
    • 消费者:从 Kafka 消费消息后,按照一定的策略更新 Redis 缓存。例如,可以先读取 Redis 中当前数据,结合消息中的更新内容进行修改,然后再写回 Redis。
  2. 数据读取流程
    • 业务系统:从 Redis 缓存读取数据。如果缓存命中,直接返回数据;如果缓存未命中,从数据库读取数据,然后将数据写入 Redis 缓存,再返回给业务系统。

可能出现不一致的情况及应对策略

  1. 消息处理顺序问题
    • 情况分析:Kafka 消息可能由于分区、并发消费等原因,导致消息处理顺序与发送顺序不一致,从而使 Redis 缓存数据更新顺序错误,出现数据不一致。
    • 应对策略
      • 消息顺序处理:在 Kafka 中,可以通过设置分区策略,将相关数据的消息发送到同一个分区,这样消费者按照分区顺序消费消息,能保证消息处理顺序。
      • 版本号机制:在数据中添加版本号字段。每次更新数据时,版本号递增。消费者在更新 Redis 缓存时,先比较当前缓存数据的版本号与消息中的版本号,如果缓存版本号小于消息版本号,才进行更新。
  2. 消息丢失问题
    • 情况分析:在 Kafka 消息传递过程中,可能由于网络故障、消费者故障等原因,导致部分消息丢失,使得 Redis 缓存未能及时更新,与数据库数据不一致。
    • 应对策略
      • Kafka 配置优化:通过合理配置 Kafka 的 replication factor(副本因子)和 min.insync.replicas(最小同步副本数),确保消息在多个副本中可靠存储,降低消息丢失风险。
      • 消息确认与重试:消费者在处理消息后,向 Kafka 发送确认消息。如果 Kafka 未收到确认,会重新发送消息。同时,消费者端设置重试机制,当处理消息失败时,自动重试一定次数。
  3. 缓存更新失败问题
    • 情况分析:消费者在更新 Redis 缓存时,可能由于 Redis 故障、网络问题等,导致缓存更新失败,造成数据不一致。
    • 应对策略
      • 重试机制:消费者在缓存更新失败后,设置重试逻辑,多次尝试更新 Redis 缓存。可以采用指数退避策略,即每次重试间隔时间逐渐延长,避免短时间内大量无效重试。
      • 日志记录与补偿:记录所有缓存更新操作的日志,包括更新时间、更新内容、是否成功等信息。当出现缓存更新失败且重试无效时,通过人工或自动化脚本根据日志进行补偿操作,重新更新 Redis 缓存。