写在前面

在高并发场景下,某些业务场景可能存在对于单条数据高频修改的需求,举个简单的场景:

在MQ消费时,对账户进行加减操作,保证账户(较少账户)的总金额和流水的总金额相等,中间可能存在对于账户进行频繁update的操作,如果直接用DB接高频修改,瓶颈会出现在行级锁占用较长时间,导致消费能力不足,导致MQ消息积压严重。

对于这个场景我们有如下要求:

  1. 数据可靠,不允许丢失

  2. 减少锁时间,提升消费能力

以业务场景来说,我们要求应对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需求的方式进行讨论。未来考虑做一套课程将高频交易系统的架构和难题进行拆解和总结,准备叫《那些年我们拆解的高频交易系统解决方案》吧。


你好,我是春哥叨叨,更多真实架构案例分享,等你很久了!

微信扫描二维码,关注我的公众号

春哥叨叨

应对单条高频的数据修改方案相关推荐

  1. 阿里云Lindorm联合智臾科技发布,金融高频交易数据量化分析与处理方案

    简介:面向银行.保险.券商和私募的高频数据高性能一站式解决方案. 金融市场L1/L2的报价和交易数据是量化交易研究非常重要的数据,随着数字业务快速演进,具有时序特征的交易数据激增,对底层数据库和量化分 ...

  2. 干货 | 小米A/B实验场景查询提速:数据预聚合方案

    " 本期技术干货,我们邀请到了小米集团大数据工程师乐涛,和大家分享基于Apache Doris的小米A/B实验场景查询提速实践. " 一.业务背景 A/B实验是互联网场景中对比策略 ...

  3. 代码技巧——数据迁移方案【建议收藏】

    开发工作中,可能会遇到如"大表拆分"."跨库数据迁移"等场景,本文介绍互联网常见架构下的数据迁移方案及实现: 1. 数据迁移的业务场景 以下是需要数据迁移的场景 ...

  4. 大厂也在用的 6种 数据脱敏方案,别做泄密内鬼

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 最近连着几天晚上在家总是接到一些奇奇怪怪的电话," ...

  5. 基于Elasticsearch的数据报表方案

    文  | 闵令超 网易智企高级应用开发工程师 前言 数据报表分析对于企业管理者的分析决策有着至关重要的作用,因此数据报表的灵活可用以及数据的准确性显得至关重要.本文会介绍基于 Elasticsearc ...

  6. Flink + Iceberg + 对象存储,构建数据湖方案

    简介:上海站 Flink Meetup 分享内容,如何基于Flink.对象存储.Iceberg 来构建数据湖生态. 本文整理自 Dell 科技集团高级软件研发经理孙伟在 4 月 17 日 上海站 Fl ...

  7. 本地日志数据实时接入到hadoop集群的数据接入方案

    1. 概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.  整体方案 Flume作为日志收集工具,监控一个文件目录或者一个文 ...

  8. PostgreSQL的高可用与数据复制方案

    2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL是开源的,有多种高可用与数据复制方案,这里做个简单的比较. 一.高可用性.负载均衡.复制方案 共享磁盘失效 ...

  9. Android Learning:数据存储方案归纳与总结

    前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...

最新文章

  1. vue循环渲染变量类样式
  2. winform界面嵌入dwg图纸_c# cad中插入另一个dwg的图块
  3. 【安卓】基于SharedPreferences实现用户登录信息的存储
  4. 小甲鱼c++学习视频之运算符重载
  5. hdu2648 Shopping-map容器
  6. tinymce 工具栏 不显示_winform中MenuStrip主菜单、工具栏、状态栏、托盘、其他控件...
  7. linux是否有安装java_Linux 安装 Java
  8. MySQL设置真正的UTF-8
  9. [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
  10. Go Hack 2017 报名开启:十月魔都约一场 Go 语言烧脑之战
  11. 【动态规划】LIS最长上升子序列和LCS最长公共子序列
  12. c语言 stm32结构体赋值,STM32学习笔记9——结构体赋值问题
  13. 华三服务器监控系统,博世DS7400周界防盗报警系统联动H3C监控系统说明概要
  14. hsqldb的存储方式
  15. python找数字_python – 找到与给定数字最接近的数字
  16. moviepy音视频开发:audio_fadein、fadeout实现声音淡入淡出
  17. 服务器机柜可放多大显示器,一个标准服务器机柜究竟能够放多少服务器
  18. Charles 2 - breakpoint断点、compose编辑、rewrite重写、map映射重定向、repeat重发、throttling弱网测试
  19. 推荐计算机 在线使用方法,在线记笔记平台推荐:如何优雅地用电脑记笔记
  20. Ubuntu22.04 安装禅道

热门文章

  1. (树上启发式合并)CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  2. P1972 [SDOI2009]HH的项链(离线树状数组)
  3. P2057 [SHOI2007]善意的投票 (最大流最小割)
  4. mybatis基础综合/常见面试题
  5. 【Java例题】2.1复数类
  6. vue.js循环for(列表渲染)详解
  7. React——Flow代码静态检查
  8. RabbitMQ 3.6.x 安装和配置--Linux篇
  9. Mysql中分页查询两个方法比较
  10. 查看核心交换机CPU时的几个参数~~