《秒杀系统架构设计》学习

2024-06-15 21:32

本文主要是介绍《秒杀系统架构设计》学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • QQ 业务特点:细粒度数据查询
    • 即使并发量很大,锁冲突其实不大,数据水平切分后,因为带上了 uid,gid 等字段,用户层面几乎没有锁冲突
  • weibo业务特点:读多写少,有少量读写锁冲突
    • 微博的核心业务是feed流:
      • 发消息,写操作
      • 刷消息,读操作
    • 微博业务显然是读多写少的,在用户刷消息时,自己feed流里的消息,是由别人发出的。
  • 秒杀业务特点:数据量少,写多读多,极大锁冲突
    • 12306的核心业务是:
      • 查票,读操作
      • 买票,写操作
    • stock(id, num) //核心数据结构:某一列车有多少张余票
    • 在用户量很大,并发量很大时,有极大的锁冲突。
  • 方向上“降低数据层锁冲突”,具体两大要点:
    • (1)降读:用缓存
    • (2)降写:把请求拦截在系统上游
  • 用缓存降低数据层读请求,不展开
    • 秒杀买票,这是一个典型的读多写少的业务场景:
      • 车次查询,读,量大
      • 余票查询,读,量大
      • 下单和支付,写,量小
    • 一趟火车2000张票,200w个 人同时来买,最多2000个人下单成功,其他人都是查询库存,写.
    • 比例只有0.1%,读比例占99.9%,非常适合使用缓存来优化。
  • 如何将请求,拦截在系统上游?
    • 先看看上下游分层架构,秒杀业务,常见的系统分层架构如何?
      • 浏览器->站点->服务->数据
    • 第一层,端上的请求拦截(浏览器/APP),可以做一些限速策略,限制用户在 X 秒内只能做一次请求
    • 第二层,站点层的请求拦截,使用 session,用户 uid 或 token 等识别同一用户,进行限速拦截,高级一点可以返回页面缓存,即返回上一次的内容
    • 第三层,服务层的请求拦截,知道了业务层的抗压能力和库存,可以根据此进行限速,使用消息队列或内存中的队列
    • 第四层,数据库闲庭信步,基本不需要做什么,因为到这里访问量应该很低了
  • (1)按照上面的优化方案,其实压力最大的反而是站点层,假设真实有效的请求数是每秒100w,这部分的压力怎么处理?
    • 站点层的扩容非常容易,测算出机器的处理能力,直接加机器即可,此外其实不需要所有的请求都处理返回,可以服务降级,把大部分的请求失败掉即可,保护系统是最优先原则
  • (2)站点层限速,是个每个uid的请求计数放到redis里么?吞吐量很大情况下,高并发访问redis,网络带宽会不会成为瓶颈?
    • redis 可以做水平切分,如果担心网络带宽,可以使用内存队列
  • 任何脱离业务的架构设计都是耍流氓,产品+技术,不可分割,产品上,能够如何“优化",以简化系统架构设计呢?
    • case 1 下单与支付分离
      • 一般来说,下单和支付放在同一个流程里,能够提高转化率。
      • 对于秒杀场景,产品上,下单流程和支付流程异步,放在两个环节里,能够降低数据库写压力。
      • 12306, 下单成功后,系统占住库存,45分钟之内支付即可。
    • case 2 分城市用户规则差异化
      • 一般来说,所有用户规则相同,体验会更好。
      • 对于秒杀场景,产品上,不同地域分时售票,虽然不是所有用户规则相同,但能够极大降低系统压力。
      • 北京9:00开始售票,上海9:30开始售票,广州XX开始售票,能够分担系统压力。
    • case 3 按钮只能点一次
      • 秒杀场景,由于短时间内并发较大,系统返回较慢,用户心情十分焦急,可能会频繁点击按钮,对系统造成压力。
      • 产品上可以优化为,一旦点击,不管系统是否返回,按钮立刻置灰,不给用户机会频繁点击。
    • case 4 库存显示粒度加粗
      • 一般来说,显示具体的库存数量,能够加强用户体验。
      • 对于秒杀场景,产品上,只显示有/无车票,而不是显示具体票数目,能够降低缓存淘汰率。
      • 显示库存会淘汰N次,显示有无只会淘汰1次。更多的,用户关注是否有票,而不是票有几张。
  • 总结
    • 一、秒杀业务为什么难?数据量并不大,但锁冲突巨大
    • 二、系统架构优化,方向上,降低数据层锁冲突
      • (1) 降读:用缓存
      • (2) 降写:把请求拦截在系统上游
    • 三、架构难度大,产品要折衷

这篇关于《秒杀系统架构设计》学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064628

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Redis中如何实现商品秒杀

《Redis中如何实现商品秒杀》:本文主要介绍Redis中如何实现商品秒杀问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录技术栈功能实现步骤步骤一:准备商品库存数据步骤二:实现商品秒杀步骤三:优化Redis性能技术讲解Redis的List类型Redis的Set

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi