🚀 哈啰二面真题
缓存和数据库数据一致性问题?
默认方案一般都是先更更新数据库,再删除缓存,此时面试官询问: 删除缓存失败了怎么办? 我想的是引入重试机制
a. 同步重试(你已提到,但可以优化):
- “对于删除缓存失败,首先想到的确实是重试。但简单的同步
while
循环重试可能会阻塞当前请求。我们可以设置一个合理的最大重试次数 和重试间隔,例如重试3次,每次间隔50ms。如果同步重试都失败,可以将删除操作转为异步。”
b. 异步重试(核心方案):
- 为了不影响主流程的性能和可用性,更可靠的方式是采用异步重试机制。当缓存删除失败时,可以将这个删除任务
- (比如要删除的缓存key)发送到消息队列(MQ 中,如RabbitMQ 等。
- 然后由一个或多个独立的消费者服务 从MQ中获取任务,尝试删除缓存。这样即使缓存服务暂时不可用, 消息队列也能保证消息不丢失,消费者服务可以持续重试,直到成功。如果多次重试后仍然失败(例如达到最大重试次数), 可以将这些失败的删除任务记录到死信队列或日志中,并触发监控告警,以便人工介入排查和处理。 这种方式能有效保证最终一致性,并且对主业务逻辑的侵入性小。