本地消息表性能瓶颈:高频写入拖垮主库?异步批量落盘 + 分表策略优化!
公司用本地消息表做分布式事务的最终一致性。每笔订单创建后往消息表里插一条"待发送"记录,后台定时任务轮询发送。业务量上来以后,消息表单表积压了几千万条数据,每次 INSERT 都要等几十毫秒,DB 连接池打满,主库 CPU 飙到 80%。订单创建都跟着变慢了。 本地消息表本来是为了解耦,结果自己成了瓶颈。今天聊聊怎么把消息表的高频写入从主库的业务路径上剥离,用异步批量落盘加分表来扛住海量消息。 问题到底出在哪 本地消息表最朴素的实现是业务代码里直接 INSERT: @Transactional public void createOrder(Order order) { orderMapper.insert(order); // 订单入库 messageMapper.insert(new Message( // 消息入库 —— 跟订单在同一个事务 order.getId(), "ORDER_CREATED", "PENDING" )); } 这种写法,消息的 INSERT 跟业务 SQL 在同一个事务里。单看一条没问题,但当每秒几千个订单同时创建,消息表的 INSERT 就变成了主....