高并发下的系统设计(偏数据库设计)

gavanwanggw gavanwanggw     2022-09-12     213

关键词:

高并发完毕数据库设计是要结合不同的应用场景的,本文主要涉及到一下问题:
1、对数据库表的字段訪问比較均衡,业务导向明显(网上商城,多条业务线);
2、对数据库表的字段訪问比較均衡,业务导向不明显(对单一应用的高并发訪问);
3、对数据库表的单一字段訪问比較集中(秒杀、大量用户对同一账户操作)
只是对于一般的小型站点的应用,并发高的话 採用读写分离基本上就能解决这个问题,本文主要是针对大型站点高并发数据库设计讨论。

一、对数据库表的訪问比較均衡,业务导向明显(网上商城,多条业务线)
     像这样的情况,一般採用数据库表垂直切分

    垂直切分就是要把表按模块划分到不同数据库中,这样的拆分在大型站点的演变过程中是非经常见的。当一个站点还在非常小的时候,仅仅有小量的人来开发和维护。各模块和表都在一起,当站点不断丰富和壮大的时候。也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。例如以下图所看到的:

技术分享技术分享

事实上,相对于垂直切分更进一步的是服务化改造。说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程。最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也很有利于进行局部的优化和治理。保障核心模块的稳定性。这样一种拆分方式也是有代价的:

  • 表关联无法在数据库层面做
  • 单表大数据量依旧存在性能瓶颈
  • 事务保证比較复杂
  • 应用端的复杂性添加

上面这些问题是显而易见的,处理这些的关键在于怎样解除不同模块间的耦合性,这说是技术问题。事实上更是业务的设计问题,仅仅有在业务上是松耦合的,才可能在技术设计上隔离开来。

没有耦合性,也就不存在表关联和事务的需求。

另外,大数据瓶颈问题能够採用水平切分。

二、对数据库表的字段訪问比較均衡,业务导向不明显(对单一应用的高并发訪问)

    1)这样的情况一般採用对数据库表进行水平切分。

    上面谈到垂直切分仅仅是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表依照某种规则把数据划分到不同表或数据库里。比如像计费系统。通过按时间来划分表就比較合适。由于系统都是处理某一时间段的数据。而像SaaS应用。通过按用户维度来划分数据比較合适,由于用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,以下是一个比較简单的按user_id来水平切分的样例:

技术分享技术分享

水平切分没有破坏表之间的联系,全然能够把有关系的表放在一个库里。这样就不影响应用端的业务需求,而且这种切分能从根本上解决大数据量的问题。它的问题也是非常明显的:

  • 当切分规则复杂时,添加了应用端调用的难度
  • 数据维护难度比較大,当拆分规则有变化时,须要对数据进行迁移

对于第一个问题,能够參考怎样整合应用端和数据库端。

对于第二个问题能够參考一致性hash的算法,通过某些映射策略来减少数据维护的成本

2)当然还能够把水平切分和垂直切分结合起来

由上面可知垂直切分能更清晰化模块划分,区分治理,水平切分能解决大数据量性能瓶颈问题。因此经常就会把两者结合使用,这在大型站点里是种常见的策略。这能够结合两者的长处,当然缺点就是比較复杂,成本较高,不太适合小型站点,以下是结合前面两个样例的情况:

技术分享技术分享

三、对数据库表的单一字段訪问比較集中(秒杀、大量用户对同一账户操作)

    对于这样的情况有非常多种解决方式。可是每一种都不是非常完美:

    1)採用内存缓存或者缓存数据库来缓解数据的库的压力

       详细做法是:在利用内存缓存或者缓存数据库把后台数据库server上相关的表数据载入到内存中,所用用户高并发的对内存数据进行处理,然后再定时轮询的方式把内存的数据刷新到后台数据库表中,这样的做法有下面问题:

     a)不能非常好保持内存数据与数据库数据的一致性。

     b)假设出现断电、内存损坏等情况,会有数据丢失;

    2)採用对数据库表水平切分。然后在后台的程序中对各个表的数据总体控制

        比如,有10000亿人民币为1亿人并发提供贷款业务。

在数据库中建立一个总表存下10000亿人民币,然后再建立10张分表。初始设为空;后台java程序在訪问数据库时会有一个控制程序(中间件),开10个 线程池。每一个线程池相应一个数据库分表,其中间件接受到贷款申请时,中间件就会依据用户的ID(能够ip地址,账户编号)hash到相应的线程去到总表中借款,这个借款数目能够依据总表的资金和用户的要借的资金去申请额度(比方用户申请10w,总表有1000亿,相应线程能够向总表申请10亿),存入相应分表。供这个用户提供贷款,假设再有下个用户再到此线程池操作数据库表,就直接操作。分表中金额不够的时候再到总表中借款。

    这种设计攻克了,高并发存储数据库的问题,可是添加了后台的程序设计的难度,加大了程序的耦合度。

    3)採用“记流水不记账“的方式应对

       还用上一个样例,这样的方式。须要在数据库中设计两个表,一个用来存储账户金额(账户表),还有一个记录”流水“(流水表), 所谓”记流水“是指每当有个请求到来,就向流水表中插入一条记录。然后定时对所插入的记录进行统计,update账户表的数据,当然这样的方式,须要在内存中添加变量,来控制所用用户的贷款不能超过所贷款的总金额。这样的处理方式是数据库端处理秒杀、高并发集中訪问数据库表字段的有效方式,使用比較广泛。

    4)针对网购秒杀还有其针对性的设计。由于网购秒杀和高并发操作银行账户不同,网购秒杀同意用户请求丢失,简单的来说,仅仅须要在内存缓存或者内存数据库(充当队列)中保存较早的用户请求。然后再异步的处理这些请求来操作数据库(更新数据库)。




































阿里最后一面,高并发下如何设计一个秒杀系统?

近年来,随着“双十一”购物节和抖音等直播平台带货的热潮,大批促销活动涌现,「秒杀」这个词也越来越频繁地出现在我们的生活里。除了那些头部的电商公司,某宝、某东,还有各种街、某说、某会、... 查看详情

高并发下的商城秒杀设计php+mysql+redis的实现

<?php/*高并发的秒杀设计php+mysql+redis*Author:lms<php7在qq.com>QQ:二一九二4238*转发请注明来源网址http://www.thinkunion.nethttps://blog.csdn.net/weixin_43932088正常的操作:点击拍下,判断有没有库存,有则拍成功& 查看详情

高并发下线程安全的单例模式

...之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧... 查看详情

秒杀系统架构设计

...战:  1.对现有业务造成冲击  2.高并发下的应用、数据库负载  3.突然增加的网络及服务 查看详情

高并发下秒杀商品,你必须知道的9个细节(代码片段)

前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量&#... 查看详情

高并发下秒杀商品,你必须知道的9个细节(代码片段)

大家好,我是苏三,又跟大家见面了。前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出... 查看详情

高并发下秒杀商品,这9个细节得知道(代码片段)

大家好,我是bigsai,又跟大家见面了。前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出... 查看详情

高并发下乐观锁实现(代码片段)

...有业务并发更新某业务表,比如用户账户表,可考虑利用数据库乐观锁的办法解决。1、表设计   需要在表中新增version字段,可定义为bigint类型,初始值可设置为02、更新语句mybatis的实现<updateid="updateConsumeStarWithLook"... 查看详情

宜人贷系统架构——高并发下的进化之路

宜人贷系统版本的迭代1.0版本——简单的烦恼1.PNG迭代之前宜人贷的系统,其实就是一个前台,一个后台,一个DB,前台采用的是多机部署的方式。软件层也是跟最传统的软件一样分三层,第一层是Controller,第二层是Service... 查看详情

高并发下如何避免产生重复数据?(代码片段)

前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌࿰... 查看详情

高并发下如何避免产生重复数据?(代码片段)

前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1.需求产品有个需求:用户选择一些品牌࿰... 查看详情

分布式事务,高并发下分布式事务的解决方案

...spring事务原理》),Spring事务本质是单机下的事务,是由数据库本身保证的。今天,我将介绍一种比较复杂的事务:分布式事务。1、什么是分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务... 查看详情

秒杀系统设计(代码片段)

高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量(... 查看详情

高并发之网络io模型

你好,我是坤哥今天我们聊一下高并发下的网络IO模型高并发即我们所说的C10K(一个server服务1w个client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发架构其实有一些很通用的架构设计,如无锁化,缓存等,今... 查看详情

高并发下的web异步处理方案(代码片段)

...理。​如果一个请求业务处理涉及IO操作,比如访问数据库、调用第三方服务 查看详情

redis实现高并发下的抢购秒杀功能

...一个应用场景,主要需要解决的问题有两个:1高并发对数据库产生的压力2竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。重点在于... 查看详情

高并发下接口幂等性解决方案

一、幂等性概念在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不... 查看详情

秒杀系统架构分析与实战(代码片段)

...术挑战1、对现有网站业务造成冲击2、高并发下的应用、数据库负载3、突然增加的网络及服务器带宽4、直接下单5.如何控制秒杀商品页面购买按钮的点亮6.如何只允许第一个提交的订单被发送到订单子系统7.如何进行下单前置检... 查看详情