高频更新字段问题思路
对于一金额字段,由于会高频更新字段金额(一秒上百次),该如何设计技术方案处理可能出现的性能、一致性问题呢?
核心挑战
-
高并发更新导致数据库性能瓶颈
一次上百次更新,传统数据库单行更新会产生行级锁争用,影响吞吐量
-
数据一致性
事务隔离级别低,多并发请求同时修改,可能导致脏写;事务隔离级别高,则又会降低并发性能
方案一:基于数据库的行级乐观锁
适合单实例数据库,确保高并发下的数据一致性,适用于金额更新频率不超过1000TPS情况
方案二:基于数据库的批量更新
引入缓存(如redis)来累积一定时间窗口内的金额变动记录,然后批量更新数据库,减少update次数,提供吞吐量
适用金额更新频率很高的场景,降低数据库写入压力
方案三:基于Redis的计数器+异步持久化
所有金额更新优先写入redis,然后通过异步任务(如kafka+worker)定期更新redis数据到数据库
适用于极高吞吐量(>10000TPS),并且可以接受最终一致性
方案四:基于分布式消息队列
每次金额变动部署直接更新数据库,而是发送到kafka队列
后端消费worker进行批量更新
适合高并发、大规模分布式交易系统,确保高吞吐和一致性
方案五:读写分离:redis提供读,insert写
改update为insert,在每次insert时更新redis,然后redis对外提供读取金额服务
这样改的insert的在此抽象一下,就是一种账单的概念
方案六:魔改mysql:在数据库层面进行合并提交
在 MySQL Server 层排队批量提交多个事务,InnoDB 只用拿一次行锁,提交成功之后在 Server 层构造结果
Ref
- https://www.v2ex.com/t/1109295#reply51