关于秒杀,第一反应都是实现起来比较复杂。难点在于:并发读+并发写+设计兜底方案的实现。

比如QQ,虽然数据量很大,但是多数的数据都是细粒度的数据查询,锁冲突比较少;但12306涉及到大量的读写操作,对可用性,高性能,数据一致都有要求。

在开始前,先说一些基本概念,通常互联网的应用包含了:

nginx代理层

tomcat站点层

rpc service服务层

数据层(cache和db)

方向上,降低数据层锁冲突,具体两大要点:

  • 缓存降读

  • 降低写的频率,将请求拦截在系统上游

所以,优化的方向,也是从上面几层展开。

一:优化方案:

1:端上的请求拦截(浏览器/app)

比如通过答题延长请求发出时间

js做一些基本性的校验等

2:站点层的请求拦截

同一个uid xxS内才可以请求,比如计数和限速

这里可以看到,站点层可能承担了大部分的流量和压力,所以站点层需要设计成无状态服务,通过水平扩展的方式,分担压力;

但是站点层如何限速呢?

  • 如果使用redis,那么redis需要做proxy切分

  • 当然,也可以通过nginx七层路由,相同的id落地到相同的tomcat站点上,做内存计数

3:服务层的请求拦截

流量削峰,比如根据你的数据库抗压能力,计算出tps,或者通过业务库存计算等

流量削峰解决了什么问题:

  • 服务端处理变得更加平稳

  • 节省服务器的资源成本

如何削峰:

  • 排队:通过消息队列来缓冲瞬时流量

4:数据库处理

分库分表,热点数据隔离,读写分离等等

二:12306产品方案:

  • 对于秒杀系统来说,下单与支付可以分离,所以支付系统基本上可以不用特殊处理

  • 不同的地域分时售票等

三:兜底方案

1:降级

比如当秒杀流量达到5W/s时,把一些无关紧要的查询记录从之前的100条,降低为10条,这个可以直接由参数来控制

2:拒绝服务

当系统达到一定的阈值时,设置过载保护,比如在nginx层上做限制,直接返回503 code码等

更多交流,也欢迎您关注我的微信公众号:

一分钟了解"秒杀"系统的更多相关文章

  1. 用Redis轻松实现秒杀系统

    秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应 ...

  2. PHP秒杀系统全方位设计(二)

    商品页面开发 静态化展示页面[效率要比动态PHP高很多,PHP程序需要解析等步骤,本身就需要很多流程,整个下来PHP的处理花的时间和资源要多] 商品状态的控制 开始前.进行中.库存不足.结束 数据逻辑 ...

  3. PHP秒杀系统全方位设计分析(二)

    商品页面开发 静态化展示页面[效率要比动态PHP高很多,PHP程序需要解析等步骤,本身就需要很多流程,整个下来PHP的处理花的时间和资源要多] 商品状态的控制 开始前.进行中.库存不足.结束 数据逻辑 ...

  4. 从构建分布式秒杀系统聊聊验证码 给大家推荐8个SpringBoot精选项目

    前言 为了拦截大部分请求,秒杀案例前端引入了验证码.淘宝上很多人吐槽,等输入完秒杀活动结束了,对,结束了...... 当然了,验证码的真正作用是,有效拦截刷单操作,让羊毛党空手而归. 验证码 那么到底 ...

  5. 12306抢票带来的启示:看我如何用Go实现百万QPS的秒杀系统

    本文为开源实验性工程:“github.com/GuoZhaoran/spikeSystem”的配套文章,原作者:“绘你一世倾城”,现为:猎豹移动php开发工程师,感谢原作者的技术分享. 1.引言 Go ...

  6. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  7. 【Todo】秒杀系统材料

    秒杀系统:Link <一个经验证可落地的秒杀系统实践思路> 主要依赖于Redis进行处理. http://geek.csdn.net/news/detail/59847   淘宝大秒系统设 ...

  8. PHP秒杀系统-高并发高性能的极致挑战

    慕课网实战教程后端:1.java c++算法与数据结构2.java Spring Boot带前后端 渐进式开发企业级博客系统3.java Spring Boot企业微信点餐系统4.java Sprin ...

  9. Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE

    初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...

随机推荐

  1. Java 内存模型(Java Memory Model,JMM)

    基本概念 JMM 本身是一种抽象的概念并不是真实存在,它描述的是一组规范,通过这组规范定义了程序的访问方式 JMM 同步规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最 ...

  2. Mac鼠标灵敏度调节

    系统的调节到最大还是无法满足你的时候那么你就该看看我接下来的操作了,请看: 查看 首先打开终端,输入一下命令: defaults read -g com.apple.mouse.scaling 此命令 ...

  3. Java程序员面试学习资料汇总

    整理了一些关于Java程序员面试的书籍及免费资料. 一.书籍篇1)<Offer来了:Java面试核心知识点精讲(原理篇)>精讲Java面试必需的JVM原理.Java基础.并发编程.数据结构 ...

  4. .NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象

    目       录 1.      现象概述... 1 2.      操作数据库的代码... 2 3.      引起的异常... 2 4.      异常信息分析... 3 5.      分析结 ...

  5. Hibernate4.3 QBC查询

    一.基本查询 1 Session session = HibernateUtils.getSession(); 2 //创建QBC查询接口的实现类 3 Criteria criteria = sess ...

  6. dhtmlxGantt独立安装的系统要求

    dhtmlxGantt库提供了使用导出作为在线服务从甘特图导出和导入数据的可能性. 您还可以通过在计算机上安装导出服务来本地导出甘特图.您需要确保系统满足系统要求才能使用导出模块: PNG / PDF ...

  7. mysql-18-function

    #函数 /* 存储过程:可以有0个或多个返回,适合批量插入.批量更新 函数:有且仅有一个返回,适合处理数据后返回一个结果 */ #一.创建语法 /* create function 函数名(参数列表) ...

  8. C++ 中explicit的作用

    转载:https://www.cnblogs.com/diligenceday/p/5781408.html C++ 中explicit的作用   explicit作用: 在C++中,explicit ...

  9. Eclipse 设置Tab键为4个空格

    参考:java编程规范之eclipse设置tab键为四个空格 Eclipse版本 1.点击菜单Window > Preference 2.在Preferences窗口中,展开General &g ...

  10. JVM 第二篇:垃圾收集器以及算法

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 0. 引言 一说到 JVM ,大多数人第一个想到的可能就是 GC ,今天我们就来聊一聊和 GC 关系最大的垃圾收集器以及垃圾收集算法,希望能通过 ...