热点账户高并发解决方案
https://www.cnblogs.com/zyl2016/p/9928567.html
https://blog.csdn.net/xmfsamsara/article/details/80295478
热点账户交易是性能瓶颈,在银行或者第三方支付系统的账务数据库的处理中,数据从一个账户转出,或者有数据转入一个账户,账户都会收到记账请求,并都有一个记账处理的过程。记账处理过程主要包括两部分,一是记录记账凭证,二是更新账户的余额。为了保证账户不被其他请求影响数据的准确性,在进行记账处理时,会先对账户的资源加锁,记账处理完毕后会自动释放锁。随着账务处理业务量的增大,账务数据库中的账户常常会在瞬间产生多个并发操作,但所有对应的并发线程中只有一个线程能够持有当前账户的资源锁,其他线程必须等待该锁被释放后再逐一进行记账处理,这样该账户将会被频繁加锁释锁,使该账户成为账务数据库热点,产生性能瓶颈点,严重影响账务数据库的性能。
对于同一账户ID来说,由于实际业务需要更新账户可用余额和账户流水日志,所以单笔冲扣功能是在一个事物中进行操作,任何更新操作都会对数据上行锁,图例如下
汇总明细记账
实时的交易全部是insert账务明细(insert的开销很小,能够支持高并发。如果基于分布式部署,insert的并发容量理论上可以无限大),然后定时(比如每半个小时)将之前半个小时内的账务明细sum出一个结算总金额,一笔入账结算到指定账户。这个方案的缺点就是:交易不能实时入账,其实如果控制好定时汇总入账的频度,比如分钟级,用户也是可以接受的。这种方式对收单类业务(账户加钱)非常实用,但是对支出类业务(账户减钱)类来说,有账户透支地风险。
缓冲入账
将实时同步的记账请求进行异步化,以达到记账实时性和系统稳定性之间平衡的记账手段,这就是”削峰填谷“。详细地讲,假如账务系统对同一个账户的处理阈值为100笔/s,24小时不间断服务(一天能处理86400000笔)。当业务高峰期来临的时候,热点账务的请求数会达到200笔/s。当账户的交易低于100笔/秒的时候,账务系统几乎还是实时地处理了记账请求,而当交易大于100笔/秒的时候,账务系统先返回结果,把账务处理丢到可靠的处理队列中,等并发量不大的时候慢慢消化,对用户来说感受到的体验还是很快就记账成功了。 这个方案是有个前提是:热点账户在某几个高峰时间点需要缓冲记账来削峰填谷,并且能在日间填完。一旦账户的日间交易量暴增,导致日间队列根本来不及消化,整个队列越来越长,那就不存在谷可以填,这时候肯定会带来用户大量的投诉。另外这种方案对支出类业务(账户减钱)来讲,也会有账户透支地风险。
。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)