zoukankan      html  css  js  c++  java
  • 秒杀系统设计面试

    秒杀业务的特点就是多个人读一个数据,难点就是读写冲突,锁情况特别的严重。 所以我们尽量不要让请求落在数据库上去,让请求拦截在系统的上游。解决思路:

    1、限流:屏蔽掉无用的流量,允许少部分流量流向后端。

    2、削峰:瞬时大流量峰值容易压垮系统。常用的消峰方法有异步处理、缓存和消息中间件等技术

    • 异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。
    • 缓存:秒杀系统本身是一个典型的读多写少的应用场景【一趟火车其实只有2000张票,200w个人来买,最多2000个人下单成功,其他人都是查询库存,写比例只有0.1%,读比例占99.9%】,非常适合使用缓存。
    • 消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。

    前端优化

    1、前端静态资源缓存,页面静态化和使用cdn缓存或redis缓存

    2、限流:1使用验证码防止机器人爬虫脚本自动提交2禁止重复提交,用户提交后按钮置灰

    后端优化

    1、利用负载均衡,使用多个机器处理并发请求

    2、秒杀开始前,前台不能得到秒杀地址,防止提前得到秒杀地址,模拟秒杀请求

    3、限制同一个用户id访问频率

    4、限制同一时间请求次数,达到请求上限时,随机拒绝部分请求来保证服务可用

    5、业务分离,将秒杀系统和其它业务分离,单独放在高配机器上,防止影响其它业务系统

    6、将秒杀请求放入到消息队列队列,后台订阅消息减库存,检测消息队列长度,达到最大库存不加消息队列,直接返回秒杀失败的消息

    7、利用缓存应对读请求,利用缓存减轻数据库压力

    8、利用缓存应对写请求,将数据库的库存数据转到redis里面,所有减库存操作都在redis里面进行,然后通过后台进程把redis里面的用户秒杀请求同步到数据库

  • 相关阅读:
    org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
    快速制作gif动图
    Linux中安装Oracle11g后出现监听的问题及解决办法
    navicat连接不上Linux服务器上的MySQL
    lapacke svd实例
    ubuntu lapack安装与使用
    python numpy访问行列元素的方法
    numpy opencv matlab eigen SVD结果对比
    相似变换 SimilarityTransform 以及skimage源码
    OpenCV仿射变换+投射变换+单应性矩阵
  • 原文地址:https://www.cnblogs.com/yinliang/p/10729459.html
Copyright © 2011-2022 走看看