• 高并发相关


    案例:秒杀程序

    高并发优化思路

    1.使用Google guava的RateLimiter来进行限流

    2.暴露秒杀接口,暴露信息,作为不常更新的热点数据,贮存到Redis里

    3.减库存时,在同一事务内,先"插入记录",再"更新库存", 能有效减少行锁的作用时间. 数据库更新操作,采用乐观锁,提高并发性

    4.前端静态文档部署到CDN, 缺少资金的公司可以选择动静分离。动静分离:把静态资源(js,css,图片)直接部署放到nginx, 动态服务还在原有的tomcat/SpringBoot里。

    5.Java应用部署多个集群节点,之间使用nginx做负载均衡和反向代理,提高客户端的并发数

    6.RabbitMQ异步处理秒杀记录

    部署图:

    秒杀过程

    秒杀进行的过程包含两步骤:

    步骤一(秒杀):在Redis里进行秒杀。 这个步骤用户并发量非常大,抢到后,给与30分钟的时间等待用户付款, 如果用户过期未付款,则Redis库存加1 ,算用户自动放弃付款。

    流程图Step1:

    1.先经过Nginx负载均衡;

    2.Nginx里面通过配置文件配置限流功能,限流算法是漏桶法;

    3.Redis判断是否秒杀过。避免重复秒杀。如果没有秒杀过,把用户名和seckillId封装成一条消息发送到RabbitMQ,请求变成被顺序串行处理立即返回状态“排队中”到客户端上,客户端上回显示“排队中...”

    4.后台监听RabbitMQ里消息,每次取一条消息,并解析后,请求Redis做库存减1操作(decr命令),并手动ACK队列 如果减库存成功,则在Redis里记录下库存成功的用户手机号userPhone.

    5.流程图Step2:客户端排队成功后,定时请求后台查询是否秒杀成功,后面会去查询Redis是否秒杀成功,如果抢购成功,或者抢购失败则停止定时查询, 如果是排队中,则继续定时查询。

    步骤二(付款):用户付款成功后,后台把付款记录持久化到MySQL中,这个步骤并发量相对小一点,使用数据库的事务解决数据一致性问题

  • 相关阅读:
    vimrc之fileformat
    std::copy ( myvector.begin(), myvector.end(), out_it )
    backtrace、backtrace_symbols
    mysql之replicate_do_table/replicate_ingore_table/replicate_wide_do_table/replicate_wide_ingore_table
    symbol lookup error
    mysql之select into outfile
    flex与bison
    运行maven打出来的jar包报错:Unable to locate Spring NamespaceHandler for XML schema namespace
    让maven生成可运行jar包
    windows下通过Git Bash使用Git常用命令
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/11532328.html
Copyright © 2020-2023  润新知