专栏首页JAVA乐园高并发场景下秒杀系统的设计思路

高并发场景下秒杀系统的设计思路

1. 概述

秒杀系统之所以难做,是因为在极短的时间内涌入大量的请求,来同时访问有限的服务资源,从而造成系统负载压力大,甚至导致系统服务瘫痪以及宕机的可能。本文会介绍秒杀系统中存在的痛点以及针对这些点的优化思路。

2. 秒杀系统是什么鬼

如:12306的春节抢票、各大电商搞的定时抢购活动,如小米手机的在线抢购等,抢过火车票的同学都知道在放票的那一瞬间可能1s都不到,票就被抢购一空了。

3. 秒杀系统的难点

(1)短时间内高并发,系统负载压力大

(2)竞争的资源有限,数据库锁冲突严重

(3)避免对其他业务的影响

4. 常见的互联网分层架构

(1)客户端层:手机或PC端操作的客户端页面,域名通过DNS解析路由到NG

(2)反向代理层:一般通过NG作为反向代理,将客户端请求均衡路由到后端站点服务,NG也可以水平扩展为多实例,且每个实例可单独部署为主从的高可用方案。

(3)站点层:站点层可以水平扩展为多个实例部署,以此来均衡来自客户端请求产生的高并发负载,多个web server之间的session信息可以集中存储于分布式缓存服务(Redis,MemCache)中。

(4)服务层:服务层也可水平扩展为多个实例部署,即时下最火的微服务方式

(5)数据库层:数据库层的常见部署方式,如读写分离,分库分表等

5. 秒杀系统的架构原则

(1)尽量将请求拦截在上游

对于秒杀系统来说,系统的瓶颈一般在数据库层,由于资源是有限的,如库中共1万张票,一瞬间并发进来100万的请求,那么有99万都是无用的请求,所以为了更好的保护底层有限的数据库资源,尽量将请求拦截在上游。

(2)充分利用缓存

缓存不但极大的缩短了数据的访问效率,更重要的是承载了底层数据库的访问压力,所以对于读多写少的业务场景充分利用好缓存

(3)热点隔离

业务隔离:如12306的分时段售票,将热点数据分散处理,来降低系统负载压力

系统隔离:实现系统的软硬隔离,不光是实现软件的隔离,还可以实现硬件的隔离,尽最大限度的减少秒杀带来的高并发安全性问题。

数据隔离:启用单独的cache集群或数据库来存放热点数据

6. 优化方案

(1)页面端优化,如:

  • 按钮置灰:禁止用户重复提交请求
  • 通过JS控制:在一定时间内只能提交一次请求

(2)web server层优化,如:

  • 动静分离:如将几乎不变的静态页面直接通过NG或CDN来路由访问,只有动态变换的页面可以请求到web server端
  • 页面缓存化
  • Nginx反向代理实现web server端的水平扩展

(3)后端service服务层优化

  • 使用缓存(Redis、Memchched):将读多写少的业务数据放入缓存,如秒杀业务中可以将更新频繁的商品库存信息放入Redis缓存处理

注:库存信息放入Redis缓存的时候最好分为多份放入不同key的缓存中,如库存为10万可以分为10份分别放入不同key的缓存中,这样将数据分散操作可以达到更高的读写性能。

  • 使用队列处理:将请求放入队列排队处理,以可控的速度来访问底层DB
  • 异步处理:如将秒杀成功的订单通知信息通过消息队列(RabbitMQ、Kafka)来异步处理

(4)DB层优化

  • 读写分离
  • 分表分库
  • 数据库集群

来源:https://my.oschina.net/feinik/blog/1807902

本文分享自微信公众号 - JAVA乐园(happyhuangjinjin88)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 系统架构设计:进程缓存和缓存服务,如何抉择?

    我们所说的缓存分为进程内部缓存(系统内部缓存)和 缓存服务(如redis/memcache)。计算机服务从原来的单体结构,到多实例,到现在流行的微服务,缓存服务...

    java乐园
  • 【吊打面试,击中要害】缓存穿透、缓存击穿和缓存雪崩

    2019磕磕碰碰总算过去了,2020年秉承开源共享原则,继续分享在工作中遇到的各种问题和干货。2020年在面试题开始,祝愿小伙伴在2020年都能谋...

    java乐园
  • 国内一个款不错的二级缓存框架J2Cache

    缓存技术在软件开发中已经无处不在,今天分享一款国内开源的相当不错的缓存框架J2Cache 。J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求...

    java乐园
  • Java软件工程师面试题汇总(持续更新)

    实战问题 1、一个请求超过20秒了,你怎么排查和解决; 2、说说你觉得做的比较不错的项目,讲一下项目结构和用到的框架,再说一下为什么要选择这些框架; 3、“商品...

    程裕强
  • 盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug

    在这篇文章中,我将介绍一些在测试环境(DEBUG)下正常,但在生产环境(Release)下却会出现的一些让人难以捉摸的Bug。

    小曾看世界
  • 秒杀系统架构分析与实战,一文带你搞懂秒杀架构!

    (1)查询商品; (2)创建订单; (3)扣减库存; (4)更新订单; (5)付款; (6)卖家发货;

    Java技术栈
  • 纯干货--秒杀系统架构分析与实战

    (1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货

    后端技术探索
  • 秒杀系统 架构分析 与 实战

    (1)查询商品; (2)创建订单; (3)扣减库存; (4)更新订单; (5)付款; (6)卖家发货;

    用户1516716
  • 秒杀系统架构分析与实战

    (1)查询商品; (2)创建订单; (3)扣减库存; (4)更新订单; (5)付款; (6)卖家发货;

    Java团长
  • 这是我读过写得最好的【秒杀系统架构】分析与实战!

    假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有:

    芋道源码

扫码关注云+社区

领取腾讯云代金券