通过强制读取主库解决主从延迟问题

3 阅读1分钟

一、主从延迟的典型场景 + 对应问题

主从延迟的核心问题是「主库数据已更新,但从库未同步完成,导致读从库时获取旧数据」,以下是 Java 后端最常遇到的场景:

业务场景具体流程延迟带来的问题
电商下单支付1. 用户下单(写主库)→ 2. 跳转支付页(读从库查订单状态)支付页显示 “未下单”,用户困惑
用户资料修改1. 修改昵称(写主库)→ 2. 刷新个人中心(读从库查昵称)刷新后还是旧昵称,以为修改失败
秒杀库存扣减1. 扣减库存(写主库,库存 = 0)→ 2. 其他用户查询库存(读从库)库存已为 0,但从库仍显示有库存,导致超卖
订单状态更新1. 订单发货(写主库,状态 = 已发货)→ 2. 用户查物流(读从库)显示 “待发货”,物流信息不一致
数据统计报表1. 白天产生业务数据(写主库)→ 2. 凌晨从从库导出报表报表数据缺失 / 不准确,影响决策

这些场景的共性:写操作后短时间内需要读数据,且读请求被路由到了从库,而此时主从延迟还未消除。

二、解决方案

核心是:对 “写后必须立即读” 的核心业务,强制读主库;非核心业务读从库,避免因路由错误导致的旧数据问题。

//开启读主库 
HintManager.getInstance().setMasterRouteOnly();
// 业务代码【整个流程】
//关闭强制读主库 
HintManager.*clear*();