面试题答案
一键面试技术选型
- 消息队列:选择 Kafka。Kafka 具有高吞吐量、可持久化、分布式等特性,适合海量数据的处理。它可以很好地应对高并发的消息生产和消费,并且通过多副本机制保证数据的可靠性。
- 缓存:选用 Redis。Redis 是高性能的内存数据库,读写速度极快,支持多种数据结构。在分布式场景下,Redis Cluster 可以提供水平扩展能力,满足大规模缓存需求。
消息队列的部署方式
- 多副本机制:Kafka 集群采用多副本机制,每个分区有多个副本分布在不同的 Broker 节点上。通过设置合适的副本因子(如 3),确保数据在部分节点故障时仍可访问。
- 分区策略:根据业务需求,对消息进行合理分区。例如,按照缓存键的哈希值进行分区,这样可以均匀地分布消息负载,提高并行处理能力。同时,保证每个分区的消息有序,便于后续缓存更新按顺序处理。
缓存的更新策略
- 读写穿透:
- 读操作:应用首先尝试从缓存读取数据。如果缓存命中,直接返回数据;若缓存未命中,从数据库读取数据,然后将数据写入缓存,并返回给应用。
- 写操作:应用更新数据库后,同时向消息队列发送更新缓存的消息。
- 异步更新:消息队列消费者接收到更新缓存的消息后,异步更新 Redis 缓存。这种方式避免了同步更新带来的高延迟,提高了系统的整体性能。
保证数据一致性
- 顺序消费:通过 Kafka 的分区机制,保证同一个缓存键相关的更新消息在同一个分区内,消费者按顺序消费消息进行缓存更新,避免因并发更新导致的数据不一致问题。
- 版本控制:在数据库和缓存中添加版本号字段。每次更新数据库时,版本号递增。消息队列传递的更新消息包含版本号,消费者更新缓存时,比较当前缓存版本号与消息中的版本号,若缓存版本号小于消息版本号,则进行更新,否则忽略该消息,确保缓存数据是最新的。
故障恢复
-
消息队列故障恢复:
- Kafka 本身的多副本机制可在部分 Broker 节点故障时自动进行副本切换,保证消息不丢失且可继续消费。
- 当新的 Broker 节点加入集群时,Kafka 会自动平衡分区和副本分布,恢复集群的整体性能。
-
缓存故障恢复:
- Redis Cluster 具备自动故障检测和故障转移机制。当某个节点故障时,集群中的其他节点会自动检测并将其负责的插槽转移到其他正常节点,保证缓存服务的可用性。
- 对于缓存数据丢失的情况,可以通过重新读取数据库数据,并结合消息队列中未处理完的更新消息,重新构建缓存数据。
-
消费者故障恢复:
- 消费者记录已消费消息的偏移量(offset),当消费者发生故障重启后,从上次记录的偏移量继续消费消息,保证数据处理的连续性。
- 采用多消费者实例的方式,当某个消费者实例故障时,其他实例可以继续处理消息,提高系统的容错性。