应对单条高频的数据修改方案
写在前面
在高并发场景下,某些业务场景可能存在对于单条数据高频修改的需求,举个简单的场景:
在MQ消费时,对账户进行加减操作,保证账户(较少账户)的总金额和流水的总金额相等,中间可能存在对于账户进行频繁update的操作,如果直接用DB接高频修改,瓶颈会出现在行级锁占用较长时间,导致消费能力不足,导致MQ消息积压严重。
对于这个场景我们有如下要求:
数据可靠,不允许丢失
减少锁时间,提升消费能力
以业务场景来说,我们要求应对100qps。
问题拆解
作为有经验的RD,需要避免一上来就进入方案设计和编码阶段的毛病,首先以产品需求角度分析整个需求场景的合理性。
100qps高频修改,是什么场景呢?上文知道了是账户加减操作。
解决方案
很多人想到的第一个解决方案就是批量处理,这种方案也是高并发高性能系统中常用到的解决方案,面向高并发大数据量场景的kafka在高性能设计上的一个重要方式就是批量处理写请求,所以我们首先可以考虑借助于快照形式,搞成批量修改,避免一次次修改造成的资源浪费和压力,这样可以将100qps降低到50qps或者20qps。
接下来就是考虑通过何种方案实现批量修改了。
首先考虑引入缓存方式,批量修改操作收敛到缓存中,但是缓存的往往面对的问题是数据可能丢失,当然可以依赖于具体缓存介质的特性实现数据不丢失。
另一个想到的解决方案还是拆分,拆分是高并发场景下经典的解决方案,我们可以考虑将目标账户进行拆解,拆分成多个子账户做操作,这样可以将热点操作分散。
还可以考虑CQRS方案,将操作以流水方式进行记录,拆分组合一次次流水,可以保证数据不丢失,在某个时间点进行数据聚合,类似于快照,同时流水数据可以解决聚合查询问题。
需求中一个问题是围绕行级锁展开的,针对于锁,我们可以考虑试试乐观锁,在失败后进行重试,可能相对于悲观锁性能好一些。
另一种方案是引入MQ,MQ是削峰填谷神器,高峰期可以将更新请求写入MQ,之后慢慢更新,降低对于DB的压力,同时通过MQ可以操作缓存修改,mq消费方在批量更新落库。但是引入MQ这种异步处理方式,同时MQ在高峰期可能积压严重,可能会对业务有一定影响,需要考虑业务场景是否对于延迟敏感。
而且需求中其实是有MQ方案的,只不过瓶颈在于对单个账户的高频修改。这种方式又回到了最初的单次转批量的解决方案上了,可以考虑内存合并MQ操作变更,一次落库降低更新频率。
交易系统高频修改场景
将方案扩展下需求场景,我们之前做交易系统,需要做到高频且数据一致性要求。类似的高频操作场景一般依赖于3张表:账户表,流水表,日志表。整体方案上需要满足事务,且对账户操作修改增加悲观锁。整体方案难度在于记录流水和合并日志消息。
整体方案依赖于账户水平拆分,解决读写瓶颈,缓存持久兜底保护DB,引入异步化处理流水,更新缓存,合并多次操作日志。
在整合了MQ异步,DB更新,缓存兜底,还需要做好应用层排队,和引擎层排队。
批量操作,流水表加批次号,按照批次号进行批次合并,异步更新账户信息。
如果对于金融场景来说,对于持久化存储和数据一致性还是又要求的,缓存可能丢数据,账户金额这种可能无法接受。
所以一般是持久化队列,消费异步消费,消费时批量更新,减少频繁更新锁占用。
在进行账户拆分之后,对于MQ使用来说可以按照账户建立partition,不异步消费不需要担心一个账户的并发更新,场景上避免不了并发处理,并发就拆分partition吧,当然拆的不够细热点问题可能就严重了。
最后
今天我又YY了一个高并发场景需求,最近准备就高频交易系统场景下方案做一些梳理,因为某些方案和背景可能涉及到公司核心系统,所以采用这种YY需求的方式进行讨论。未来考虑做一套课程将高频交易系统的架构和难题进行拆解和总结,准备叫《那些年我们拆解的高频交易系统解决方案》吧。
你好,我是春哥叨叨,更多真实架构案例分享,等你很久了!
微信扫描二维码,关注我的公众号
春哥叨叨
应对单条高频的数据修改方案相关推荐
- 阿里云Lindorm联合智臾科技发布,金融高频交易数据量化分析与处理方案
简介:面向银行.保险.券商和私募的高频数据高性能一站式解决方案. 金融市场L1/L2的报价和交易数据是量化交易研究非常重要的数据,随着数字业务快速演进,具有时序特征的交易数据激增,对底层数据库和量化分 ...
- 干货 | 小米A/B实验场景查询提速:数据预聚合方案
" 本期技术干货,我们邀请到了小米集团大数据工程师乐涛,和大家分享基于Apache Doris的小米A/B实验场景查询提速实践. " 一.业务背景 A/B实验是互联网场景中对比策略 ...
- 代码技巧——数据迁移方案【建议收藏】
开发工作中,可能会遇到如"大表拆分"."跨库数据迁移"等场景,本文介绍互联网常见架构下的数据迁移方案及实现: 1. 数据迁移的业务场景 以下是需要数据迁移的场景 ...
- 大厂也在用的 6种 数据脱敏方案,别做泄密内鬼
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 最近连着几天晚上在家总是接到一些奇奇怪怪的电话," ...
- 基于Elasticsearch的数据报表方案
文 | 闵令超 网易智企高级应用开发工程师 前言 数据报表分析对于企业管理者的分析决策有着至关重要的作用,因此数据报表的灵活可用以及数据的准确性显得至关重要.本文会介绍基于 Elasticsearc ...
- Flink + Iceberg + 对象存储,构建数据湖方案
简介:上海站 Flink Meetup 分享内容,如何基于Flink.对象存储.Iceberg 来构建数据湖生态. 本文整理自 Dell 科技集团高级软件研发经理孙伟在 4 月 17 日 上海站 Fl ...
- 本地日志数据实时接入到hadoop集群的数据接入方案
1. 概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1. 整体方案 Flume作为日志收集工具,监控一个文件目录或者一个文 ...
- PostgreSQL的高可用与数据复制方案
2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL是开源的,有多种高可用与数据复制方案,这里做个简单的比较. 一.高可用性.负载均衡.复制方案 共享磁盘失效 ...
- Android Learning:数据存储方案归纳与总结
前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...
最新文章
- vue循环渲染变量类样式
- winform界面嵌入dwg图纸_c# cad中插入另一个dwg的图块
- 【安卓】基于SharedPreferences实现用户登录信息的存储
- 小甲鱼c++学习视频之运算符重载
- hdu2648 Shopping-map容器
- tinymce 工具栏 不显示_winform中MenuStrip主菜单、工具栏、状态栏、托盘、其他控件...
- linux是否有安装java_Linux 安装 Java
- MySQL设置真正的UTF-8
- [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
- Go Hack 2017 报名开启:十月魔都约一场 Go 语言烧脑之战
- 【动态规划】LIS最长上升子序列和LCS最长公共子序列
- c语言 stm32结构体赋值,STM32学习笔记9——结构体赋值问题
- 华三服务器监控系统,博世DS7400周界防盗报警系统联动H3C监控系统说明概要
- hsqldb的存储方式
- python找数字_python – 找到与给定数字最接近的数字
- moviepy音视频开发:audio_fadein、fadeout实现声音淡入淡出
- 服务器机柜可放多大显示器,一个标准服务器机柜究竟能够放多少服务器
- Charles 2 - breakpoint断点、compose编辑、rewrite重写、map映射重定向、repeat重发、throttling弱网测试
- 推荐计算机 在线使用方法,在线记笔记平台推荐:如何优雅地用电脑记笔记
- Ubuntu22.04 安装禅道
热门文章
- (树上启发式合并)CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- P1972 [SDOI2009]HH的项链(离线树状数组)
- P2057 [SHOI2007]善意的投票 (最大流最小割)
- mybatis基础综合/常见面试题
- 【Java例题】2.1复数类
- vue.js循环for(列表渲染)详解
- React——Flow代码静态检查
- RabbitMQ 3.6.x 安装和配置--Linux篇
- Mysql中分页查询两个方法比较
- 查看核心交换机CPU时的几个参数~~