Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路
这里我借鉴了网上其他大佬的观点:
一:
高并发带来的挑战
原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户。
吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100ms,我们有10台Web服务器,每台给它最大连接数500。
理想化计算方式:
10 * 500/0.1 = 50000
难道我们真的有处理5万并发?
不然。高并发场景下,Web服务器打开了越多的连接进程,CPU切换上下文的也越多。会增加CPU的压力,导致CPU业务请求响应耗时 会超出预期很多。可能你的系统只能承受2万的并发了。
这个时候我们需要怎么做?
答:1、请求的接口需要设计合理,怎么做?
动静分离,静态HTML可以通过Ng部署。
核心瓶颈在后台接口上,高并发情况下存储压力大,MySQL不合适,用Redis内存读写快。
2、重启与过载保护
如果你2万的并发硬抗3万流量,导致服务器没有连接进程可用,系统就要陷入异常状态了,响应时间极慢。当系统响应时间很久 ,有些用户越喜欢频繁点击。恶性循环导致“雪崩”,导致整个系统垮掉,就算重启服务也无济于事。
怎么做?
过载保护,如果检测到系统满载状态,拒绝请求自我保护。
(1)前端过滤简单方式
(2)过载保护设置在CGI入口层,将客户端的请求直接返回
二:
高并发下的数据安全
多线程写入同一个文件的时候,会出现“线程安全问题”。高并发的数据安全就是这个道理。比如有可能会出现超发。
方案:
悲观锁思路:修改数据时,锁定状态,排斥外部请求的修改。
缺点:
高并发下某些线程可能永远都抢不到这个“锁”,请求就会死在那里。堆积到一定程度,连接数被耗尽,系统异常。
FIFO队列思路:请求都排好队,不会导致某些请求永远拿不到锁。
缺点:
高并发可能导致队列内存“撑爆”,如果设置一个极大的内存队列,系统处理请求的速度根本跟不上不断快速涌入的请求。越积 越多,还是会导致响应变慢,系统陷入异常。
乐观锁思路:
跟悲观锁相比,乐观锁都有资格去执行请求,但会获得一个版本号,符合版本号的才算更新成功。
缺点:
加大计算机CPU计算的开销,但是这是一个比较好的解决方案。
缓存服务器思路:
Redis分布式要保证数据都能能够平均的缓存到每一台机器,首先想到的做法是对数据进行分片,因为Redis是key-value存储的, 首先想到的是Hash分片,可能的做法是对key进行哈希运算,得到一 个 long值对分布式的数量取模会得到一个一个对应数据库的一 个映射,没有读取就可以定位到这台数据库
三:
高并发下的水分与查杀。
原因:秒杀或是抢购等海量请求有时候并不是真正的用户在发送请求,有些为了“抢”到商品会使用一些“刷票”等类似的工具。这种做 法是帮助他们发送更多的请求到服务器。更高级的还制作一些自动请求 脚本。这些做法都是使自己的请求数占比多,成功率高。
这些很显然都是属于作弊行为,不过,我们也有一些解决方案。
答:分为以下几种情况
1、同一个账号,一次性发送多个请求。
高并发有可能会导致跳过某些逻辑判断。
方案:程序入口处,一个用户只允许一次请求,其他过滤。可以通过Redis内存缓存服务,写入一个标志位(只允许一个请求成功 ,结合watch乐观锁的特性)
2、多个账号,一次性发送多个请求
很多早期注册功能没有限制,导致一些特殊的工作室通过编写自动注册脚本注册一大批“僵尸账号”。专门做各种刷的行为,以 及一些转发抽奖活动,大大提升自己中奖的概率。
方案:检测指定机器IP请求频率,如果一个IP的请求频率异常的高。给它弹出一个验证码或者禁止它的请求。
3、多个账号,不同IP发送不同请求
有一些机构自己独占一批IP,然后做成一个随机代理IP的服务,有偿提供给这些“工作室”使用。还有一些直接黑掉用户电脑, 转发IP包,使普通用户的电脑变成IP代理出口。
方案:难以分辨了,容易“误伤”。可以通过高门槛的业务,或者通过“数据挖掘”来提前清理。
个人整理并发解决方案。
a.应用层面:读写分离、缓存、队列、集群、令牌、系统拆分、隔离、系统升级(可水平扩容方向)。
b.时间换空间:降低单次请求时间,这样在单位时间内系统并发就会提升。
c.空间换时间:拉长整体处理业务时间,换取后台系统容量空间。
Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路的更多相关文章
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- Java电商项目-1.构建数据库,搭建项目环境
目录 到Github获取源码请点击此处 一. 数据库还原 二. Mybatis逆向生成工具的使用 三. 搭建项目环境 四. 在linux虚拟机上部署zookeeper, 搭建Dubbo服务. linu ...
- Java电商项目-8.实现SSO单点登陆
目录 创建ashop-sso-web单点登陆系统 用户名唯一性验证 用户注册 用户登陆 获得用户登陆状态 实现安全退出 项目的Github地址 创建ashop-sso-web单点登陆系统 先创建好模块 ...
- Java电商项目-6.实现门户首页数据展示_Redis数据缓存
目录 项目的Github地址 需求介绍 搭建Redis集群环境 下面先描述单机版redis的安装 下面将进行Redis3主3从集群环境搭建 基于SOA架构, 创建门户ashop-portal-web门 ...
- Java电商项目-3.使用VSFTPD_Nginx完成商品新增
目录 到Github获取源码请点击此处 一. 商品类目查询 二. FTP图片服务器的搭建 图片上传思路介绍 Linux中安装vsftpd 接着配置ftp服务, 让外网可以访问 Http服务器搭建 Ng ...
- java电商项目常见异常
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- Java电商项目-5.内容管理cms系统
目录 实现加载内容分类树功能 实现内容分类动态添加 删除内容分类节点 实现内容分类节点的分页显示 实现广告内容的添加 实现广告内容删除 实现广告内容编辑 到Github获取源码请点击此处 实现加载内容 ...
- Java 高并发解决方案(电商的秒杀和抢购)
转载:https://blog.csdn.net/icangfeng/article/details/81201575 电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对 ...
- 16套java架构师,高并发,高可用,高性能,集群,大型分布式电商项目实战视频教程
16套Java架构师,集群,高可用,高可扩展,高性能,高并发,性能优化,设计模式,数据结构,虚拟机,微服务架构,日志分析,工作流,Jvm,Dubbo ,Spring boot,Spring cloud ...
随机推荐
- 大名鼎鼎的RPC和MQ到底有啥区别和联系
RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). R ...
- 推荐一款阿里开源的 Java 诊断工具,好用到爆!
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- ubuntu之路——day15.2 只用python的numpy在底层检验正则化对模型的影响
首先感谢这位博主整理的Andrew Ng的deeplearning.ai的相关作业:https://blog.csdn.net/u013733326/article/details/79827273 ...
- IDEA中执行maven命令:mvn clean 时报错
问题描述: 完成项目中的功能后,想要git一下,就用maven命令先清除一下编译文件,紧接着系统报错 Error executing Maven. 2 problems were encountere ...
- SnowFlake分布式ID生成及反解析
概述 分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种,SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位为 ...
- pycharm项目添加.gitignore忽略.idea文件夹
本地项目结构: .gitignore文件中添加: at_alsv_pro/.idea/SearchImage.iml at_alsv_pro/.idea/misc.xml at_alsv_pro/.i ...
- Spark布隆过滤器(bloomFilter)
数据过滤在很多场景都会应用到,特别是在大数据环境下.在数据量很大的场景实现过滤或者全局去重,需要存储的数据量和计算代价是非常庞大的.很多小伙伴第一念头肯定会想到布隆过滤器,有一定的精度损失,但是存储性 ...
- GSON工具类
import java.util.Map; import com.google.gson.reflect.TypeToken; import com.google.gson.FieldNamingPo ...
- k8s记录-master组件部署(八)
在 192.168.0.1 app 用户下执行1)程序准备tar zxvf kubernetes-server-linux-amd64.tar.gzmv kubernetes/server/bin/{ ...
- .Net Core个人笔记
目录 前言 IOC注册 三种生命周期 如何注册一个IOC服务 .Net Core部署IIS之后500错误 管道和中间件 示意图 管道方法 中间件 加日志观看 使用MVC MVC服务注入 MVC管道调用 ...