面试总结(七):大数据与高并发-1

2023-11-16

问题导读:
1、秒杀系统的架构设计是怎样的?
2、为什么要使用NOSQL NOT ONLY SQL?
3、传统RDBMS和NOSQL的区别是什么?

大数据与高并发

一、秒杀架构设计

业务介绍

什么是秒杀?通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动

比如说京东秒杀,就是一种定时定量秒杀,在规定的时间内,无论商品是否秒杀完毕,该场次的秒杀活动都会结
束。这种秒杀,对时间不是特别严格,只要下手快点,秒中的概率还是比较大的。

淘宝以前就做过一元抢购,一般都是限量 1 件商品,同时价格低到「令人发齿」,这种秒杀一般都在开始时间 1 到3 秒内就已经抢光了,参与这个秒杀一般都是看运气的,不必太强求。

业务特点



瞬时并发量大

秒杀时会有大量用户在同一时间进行抢购,瞬时并发访问量突增 10 倍,甚至 100 倍以上都有。
  
库存量少

一般秒杀活动商品量很少,这就导致了只有极少量用户能成功购买到。

业务简单

流程比较简单,一般都是下订单、扣库存、支付订单。

技术难点


现有业务的冲击

秒杀是营销活动中的一种,如果和其他营销活动应用部署在同一服务器上,肯定会对现有其他活动造成冲击,极端
情况下可能导致整个电商系统服务宕机。

直接下订单

下单页面是一个正常的 URL 地址,需要控制在秒杀开始前,不能下订单,只能浏览对应活动商品的信息。简单来说,需要 Disable 订单按钮。

页面流量突增

秒杀活动开始前后,会有很多用户请求对应商品页面,会造成后台服务器的流量突增,同时对应的网络带宽增加,
需要控制商品页面的流量不会对后台服务器、DB、Redis 等组件的造成过大的压力

架构设计思想


  
限流

由于活动库存量一般都是很少,对应的只有少部分用户才能秒杀成功。所以我们需要限制大部分用户流量,只准少
量用户流量进入后端服务器。

削峰

秒杀开始的那一瞬间,会有大量用户冲击进来,所以在开始时候会有一个瞬间流量峰值。如何把瞬间的流量峰值变
得更平缓,是能否成功设计好秒杀系统的关键因素。实现流量削峰填谷,一般的采用缓存和 MQ 中间件来解决。

异步

秒杀其实可以当做高并发系统来处理,在这个时候,可以考虑从业务上做兼容,将同步的业务,设计成异步处理的
任务,提高网站的整体可用性。

缓存

秒杀系统的瓶颈主要体现在下订单、扣减库存流程中。在这些流程中主要用到 OLTP 的数据库,类似 MySQL、SQLServer、Oracle。由于数据库底层采用 B+ 树的储存结构,对应我们随机写入与读取的效率,相对较低。如果我们把部分业务逻辑迁移到内存的缓存或者 Redis 中,会极大的提高并发效率。

整体架构




客户端优化

客户端优化主要有两个问题:

秒杀页面

秒杀活动开始前,其实就有很多用户访问该页面了。如果这个页面的一些资源,比如 CSS、JS、图片、商品详情
等,都访问后端服务器,甚至 DB 的话,服务肯定会出现不可用的情况。所以一般我们会把这个页面整体进行静态化,并将页面静态化之后的页面分发到 CDN 边缘节点上,起到压力分散的作用。

防止提前下单

防止提前下单主要是在静态化页面中加入一个 JS 文件引用,该 JS 文件包含活动是否开始的标记以及开始时的动态下单页面的 URL 参数。同时,这个 JS 文件是不会被 CDN 系统缓存的,会一直请求后端服务的,所以这个 JS 文件一定要很小。当活动快开始的时候(比如提前),通过后台接口修改这个 JS 文件使之生效。

API 接入层优化

客户端优化,对于不是搞计算机方面的用户还是可以防止住的。但是稍有一定网络基础的用户就起不到作用了,因
此服务端也需要加些对应控制,不能信任客户端的任何操作。一般控制分为 2 大类:

限制用户维度访问频率

针对同一个用户( Userid 维度),做页面级别缓存,单元时间内的请求,统一走缓存,返回同一个页面。

限制商品维度访问频率

大量请求同时间段查询同一个商品时,可以做页面级别缓存,不管下回是谁来访问,只要是这个页面就直接返回。

SOA 服务层优化

上面两层只能限制异常用户访问,如果秒杀活动运营的比较好,很多用户都参加了,就会造成系统压力过大甚至宕
机,因此需要后端流量控制。

对于后端系统的控制可以通过消息队列、异步处理、提高并发等方式解决。对于超过系统水位线的请求,直接采取
「Fail-Fast」原则,拒绝掉。

秒杀整体流程图



秒杀系统核心在于层层过滤,逐渐递减瞬时访问压力,减少最终对数据库的冲击。通过上面流程图就会发现压力最
大的地方在哪里?

MQ 排队服务,只要 MQ 排队服务顶住,后面下订单与扣减库存的压力都是自己能控制的,根据数据库的压力,可以定制化创建订单消费者的数量,避免出现消费者数据量过多,导致数据库压力过大或者直接宕机。

库存服务专门为秒杀的商品提供库存管理,实现提前锁定库存,避免超卖的现象。同时,通过超时处理任务发现已
抢到商品,但未付款的订单,并在规定付款时间后,处理这些订单,将恢复订单商品对应的库存量。

总结

核心思想:层层过滤

  • 尽量将请求拦截在上游,降低下游的压力
  • 充分利用缓存与消息队列,提高请求处理速度以及削峰填谷的作用


二、数据库架构发展历程

单机MySQL的美好年代

在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。



上述架构下,我们来看看数据存储的瓶颈是什么?

1. 数据量的总大小 一个机器放不下时
2. 数据的索引(B+ Tree)一个机器的内存放不下时
3. 访问量(读写混合)一个实例不能承受

Memcached(缓存)+MySQL+垂直拆分

后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。


Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端

Mysql主从复制读写分离

由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master- slave模式成为这个时候的网站标配了。



分表分库+水平拆分+mysql集群

在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。




同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。

三、MySQL的扩展性瓶颈

MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

alter table add Colum

四、为什么要使用NOSQL   NOT ONLY SQL

为什么使用NoSQL ?

今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。



NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”, 泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

五、传统RDBMS VS NOSQL

RDBMS vs NoSQL

RDBMS SQL

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务


NoSQL
 

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
    -键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性


六、NOSQL数据库的类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试总结(七):大数据与高并发-1 的相关文章

  • WiFiAssistant 无线承载网络设置助手的开发历程(一)

    今年6月中旬 我曾经基于MFC写过一个WiFiHelper的小程序 开启和关闭虚拟WiFi 并且能够支持定时关机 当然 真正使用虚拟WiFi还需要手动设置共享 并且 由于我的是台式机 所以并没有去升级WiFiHelper 估计是即将毕业的缘

随机推荐

  • 【English】十大词性之连词

    连词 文章目录 连词 前言 一 并列连词 1 1 表并列关系的并列连词 2表示选择关系的并列连词 3 表示转折关系的并列连词 4 表示因果关系的并列连词 二 从属连词 总结 前言 连词是一种虚词 在句中起连接作用 可以用来连接单词 短语 从
  • 16个车辆信息检测数据集收集汇总(简介及链接)

    16个车辆信息检测数据集收集汇总 简介及链接 目录 1 UA DETRAC 2 BDD100K 自动驾驶数据集 3 综合汽车 CompCars 数据集 4 Stanford Cars Dataset 5 OpenData V11 0 车辆重
  • Python—使用tkinter制作一个小时钟

    网上搬运的 自己又调试了一下 分享一下 coding utf 8 from tkinter import import math time def points for i in range 1 13 x 200 130 math sin
  • 矩阵的广义逆及python实践

    机器学习的代码中经常有求矩阵的广义逆 本文先从概念上总结了矩阵的广义逆 然后用python的numpy库实践 概念 矩阵的广义逆 Generalized inverse 也称为伪逆 pseudo inverse 假设一个矩阵 及另一矩阵 若
  • Unity学习记录——物理系统与碰撞

    Unity学习记录 物理系统与碰撞 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业6 编程题 简单打飞碟 物理引擎改进版 1 题目要求 改进飞碟 Hit UFO 游戏 游戏内容要求 按adapter模式设计图修改飞碟游戏
  • vivado bram 参数设置

    1 no output registers 没有reg 在同一周期内即可读出数据 2 at the output of the primitive output register 加了一层reg 数据读出延迟了一个周期 3 REG2 is
  • 处理器流水线深度问题

    正面意义 流水线的级数越多 意味着流水线切得越细 每一级流水线内容纳的硬件逻辑便越少 在两级寄存器 每一级流水线由两个寄存器组成 之间的硬件逻辑越少 则处理器能够达到更高的主频 因此现代处理器的流水线极深主要是处理器追求高频的指标所驱使 负
  • 聚类效果评价——Silhouette Coefficient(轮廓系数)——内部评估标准(1)

    公式与简介 Rousseeuw Peter J Silhouettes a graphical aid to the interpretation and validation of cluster analysis Journal of
  • android UI到系统揭秘

    一文读懂 View 的 Measure Layout Draw 流程 https juejin cn post 6939540905581887502 heading 16 scheduleTraversals gt scheduleTra
  • 基于Java+Spring+mybatis+vue+element实现酒店管理系统

    博主介绍 全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 CSDN博客之星TOP100 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业设计 文末获取联系 精彩专栏推荐
  • ChatGPT懂SAP吗?跟ChatGPT聊完后,我暂时还不担心会被它取代岗位

    我弄了个ChatGPT账号 随便问了一下他SAP的问题 它的回答还是比较有意思的 贴出来跟大家分享一下 问题1 我是 SAP 开发工程师 你有什么可以帮到我 作为一个语言模型 我可以为您提供关于SAP开发的一般性建议 以及关于如何使用SAP
  • 高并发环境下qps计算

    最近在研究阿里的一些中间件 最近看到了sentinel 由于和我们现在使用的统计 判断 预警 熔断有点类似 所以就深入了源码细看了一下 不看不要紧 一看吓一跳 我们现在的熔断的粒度是分钟级别的 没想到sentinel可以精细到任何级别 甚至
  • linux rename命令无效,Linux rename 命令 command not found rename 命令详解 rename 命令未找到 rename 命令安装 - CommandNot...

    显示行号 选择喜欢的代码风格 默认 GitHub Dune LakeSide Plateau Vibrant Blue Eighties Tranquil rename 命令使用正则表达式重命名多个文件 它由 Perl 编程语言的创建者 L
  • MinIO集群模式信息泄露漏洞(CVE-2023-28432)vulhub漏洞复现

    MinIO是一个开源对象存储系统 在其RELEASE 2023 03 20T20 16 18Z版本 不含 以前 集群模式部署下存在一处信息泄露漏洞 攻击者可以通过发送一个POST数据包获取进程所有的环境变量 其中就包含账号密码MINIO S
  • 解决“结构 “<unnamed>“ 没有字段 “ac_vol“ C/C++(136)”的错误提示

    今天来分享一个自己遇到的错误提示 其实这个错误如果是粗心 可能经常会遇到 哈哈哈如果你的编译器有代码自动补全可能不太会遇到 好了 我们看一下这个错误 这个错误提示我们 结构 unnamed 没有字段 ac vol C C 136 意思就是该
  • el-select下拉框选中并且赋值成功,前台页面不显示

    el select下拉框选中并且浏览器开发工具显示赋值成功 前台页面就是不显示 这是怎么回事呐 以下是解决办法 vue2中可以在change事件中使用如下代码 this forceUpdate vue3中使用 import getCurre
  • C++时间戳转换方法详解及示例代码

    C 时间戳转换方法详解及示例代码 时间戳是指从某个固定的起始时间点开始计算的时间间隔 通常以秒为单位表示 在开发中 我们经常需要将时间戳转换成可读性更好的日期时间格式 或者将日期时间格式转换为时间戳 在本文中 将详细介绍如何使用C 编程语言
  • windos 11第一次开机跳过联网/华硕笔记本开机网络错误

    前言 电脑卖家在电脑系统和自带的office办公软件激活后就不支持退货了 目前自带win11的新电脑 开机连网和之前win10不同 没法直接跳过 连网后又必须使用微软账户 对于想先进入电脑桌面检测一下电脑性能和使用本地账号的人很不友好 一下
  • elementui的上传功能-上传图片加参数

    elementui的上传功能 上传图片加参数
  • 面试总结(七):大数据与高并发-1

    问题导读 1 秒杀系统的架构设计是怎样的 2 为什么要使用NOSQL NOT ONLY SQL 3 传统RDBMS和NOSQL的区别是什么 大数据与高并发一 秒杀架构设计业务介绍什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢