最近接到一个大项目,给公司设计抢商品代金劵业务
我们公司是做汽车金融方面的工作,在业内还挺大。目前单量来源于2,3线城市,随着大环境越老越差位了吸引他们, 公司决定给全国的客户,销售等发一些商品
1.总体学习了京东开源秒杀系统设计思路和方案。
我们公司决定进行如下设计。
a.资源投入不会太大,一个完全体的秒杀系统 那都是用到 很多硬件 比如交换机。机房设计等
b.公司给我们的资源不会太多,所以整体思路 上只能从现有资源层面进行处理,
c.发挥出Nginx 的长版优势,用它做一些业务处理,(这一步非常关键,要完美契合你们公司业务逻辑。这需要很多方向的思考)
为啥Nginx 能在秒杀系统中这么优秀 ,这就要说到多进程单线程的多路复用技术,多路复用技术有两个模型。一个是select和epoll模型 目前最好的是epoll模型。当一个请求进来之后 遇到IO或者调用外部服务的时候。会阻塞,但是进程不会一直等待 ,这期间他会干其他事,等好了再回来处理。
举一个例子,比如你干一件事,这件事中有很多过程,你时间上无法控制的,比如你去买星巴克咖啡,下完单之后他给你制作,你不会在哪里等,你跑到卖炸鸡的那边 再买炸鸡 。
同样都是多路复用为啥epoll 模型优秀呢,像刚才那个例子 假如你同时干了10件事,都处于等待状态。你怎么知道 哪件干完了呢,而且需要等着你继续处理呢,那就 一遍一遍的问,跑去咖啡店 说 好了吗 ,回复没好,跑去炸鸡店 好了吗。没好继续往下问。这样很慢是吗。对这就是select 模型。而epoll 多了一个回调,主动通知,但是呢 不是主动通知你,而是主动放到一个完成队列里边去 ,就是完成的都放到一起,你自己处理。
2.隔离(安全为主)
主要是两方面 一个是数据隔离 一个是业务隔离,数据这块尽量要做到 读写分离,热点数据做缓存,业务隔离 每家公司不一样所以说 具体要结合你们业务场景去做,但是非常非常重要。
3.预约机制
我们系统上线之后,咋说呢 还是有问题,具体过程心酸~,后来我们该用预约方法(这样可以提前预知多少数据请求),因为我们公司业务较特殊,很多客户和业务员让他们预约的话,有些繁琐,具体细节不赘述了 。就是先主动放一部分 非预约的, 然后 一部分预约的。然后针对预约的数据 放到 redis 一手机号设置为key 但是这里有一个问题,我们是单片redis 的key进行操作 目前 只能支持7,8万的 TPS。那咋办呢 后续说,(别老想着扩redis 资源有限)。
4.销峰填谷
有没有想过这样一个问题,比如一个业务很火爆的时候,主办方会分为上午场,下午场。对我们平台为了避免页面被同一时间大量访问,随机给每位用户的响应时间,这样用户在提交的同时,不会同一时间集中访问平台。因为用户在访问购买的时候填写的信息大都是一直,比如付款金额,手机号,商品信息等等都差不多,提交时间也差不多。但是 给每位用户不同的响应时间界面 就会避免集中提交。(说简单一点,访问你们页面,你们响应时间设置一个随机数,就类似于sheep.(1000),但是这仅仅助于你理解,可别乱说)。还有一些其他平台从验证码,上做功夫,避免集中访问道理一样。
下面再说一下技术手段,想象这样一个场景,当你的前置系统访问后方核心系统,当很平稳的时候,前置系统访问核心系统通过RPC 没问题。但是如果前置系统访问了超大,你核心系统处理不过来很容易被冲击。这个时候咋办,不能用RPC了 只能用MQ 进行处理了。(我见过一些公司,也不分析自己的业务逻辑上来不管那个接口访问直接用MQ,问他们 他们说 快啊 ,稳定啊,牛的不行 )。
5.限流
到这个地方需要上技术手段了。我们说的秒杀重器,Nginx 用ip 或者用户名(我们公司是和手机号关联)限流 ,具体怎么做很多 教程
limit_req_zone <变量名> zone=<限流规则名称>:<内存大小> rate=<速率阈值>r/s;
一搬rate 定义 1
还有就是 API 限流 这个比较简单了,自己写一个 或者用开源的都可以 (RateLimiter Google)
6.监控系统
高并发的系统最关键是监控,也就是你必须随时知道系统的健康状况,以及预警机制,注意只关注最重要的几个数据,比如缓存数据是否被打满,缓存命中率是否正常,划重点 少但是 关键。然后 就是一些细节类的,比如缓存踢出率,是不是旧的key值有没有被剔除等。
7.数据一致性问题
我们平时对一个数据进行加减 通常回操作数据库,这只是平常的业务需求没问题,业务量不大的情况下,像高并发的场景必须要单独设计。既要满足高并发处理,月要保证数据安全。这是你可能说分布式锁,setNx等,这样不行因为 这回带来更多的问题 虽然能解决一部分问题。这里用的是Reids 的原生方法,众所周知Redis 是单线程的 天然解决查询和更新操作(一次性完成)。怎么做呢?重点来了Redis 中可以使用lua 脚本
下边是我们的lua脚本
local pcount = redis.call('get', KEYS[1])
if not c_s or tonumber(pcount) < tonumber(ARGV[1]) thenreturn 0
end
redis.call('decrby',KEYS[1], ARGV[1])
return 1
读取lua脚本
URL url = Resources.getResource("你的脚本地址");
List<String> lines = Resources.asCharSource(url, Charsets.UTF_8).readLines();
lines.forEach(line->{luaScript += (line + "\n");
});
可以吧 sha1 存放起来 因为是预加载,以后都可以用sha1 了 String sha1 = jedisCluster.scriptLoad(luaScript);
注意@PostConstruct 也可以用这个做项目启动的时候就把lua脚本加载到缓存
执行jedisCluster.evalsha(sha1,Collections.singletonList(key),Collections.singletonList(value));
这样就可以了 对一个数据进行 decrby(减操作)操作 如果库存不够了 则会返回0
这样可以支持很高的。并发量,而且不存咋数据安全问题。然后可以在 秒杀完了之后 对数据库进行一致性操作。
7.JVM 垃圾回收
对于垃圾回收器的选择,是需要分业务场景的。如果我们提供的服务对响应时间敏感,并且堆内存能够给到 8G 以上的,那建议选择 G1;堆内存较小或 JDK 版本较低的,可以选择 CMS。相反如果对响应时间不敏感,追求一定的吞吐量的,则建议选择 ParallelGC,同时这也是 JDK8 的默认垃圾回收器。这一部分需要结合你们系统逐步分析就可以。每个公司系统不一样 参考网上的一些设计,同时多做并发测试。多做测试。
相关文章:
最近接到一个大项目,给公司设计抢商品代金劵业务
我们公司是做汽车金融方面的工作,在业内还挺大。目前单量来源于2,3线城市,随着大环境越老越差位了吸引他们, 公司决定给全国的客户,销售等发一些商品 1.总体学习了京东开源秒杀系统设计思路和方案。 我们公司决定进行…...
防火墙(讲解)
目录 1.防火墙是什么? 2.防火墙设备 3.防火墙功能 1)出色的控制能力,过滤掉不安全服务 2)过滤非法用户和访问特殊站点 3)它能够对网络存取和访问进行监控审计 4.防火墙的局限 (1)防火墙有可能是可以绕过的 (2)防火墙不能防止内部出卖性攻击或者内部误操作…...
Python之装饰器-带参装饰器
Python之装饰器-带参装饰器 带参装饰器 之后不是一个单独的标识符,是一个函数调用函数调用的返回值又是一个函数,此函数是一个无参装饰器带参装饰器,可以有任意个参数 func()func(1)func(1, 2) def add(x, y):"""函数说明&…...
抖音IP属地怎么更改
抖音是一个非常受欢迎的短视频平台,吸引了无数用户在上面分享自己的生活和才艺。然而,随着快手的火爆,一些用户开始担心自己的IP地址会被他人获取,引起个人隐私风险。那么,抖音用户又该如何更改到别的地方呢࿱…...
Flutter 全局控制底部导航栏和自定义导航栏的方法
1. 介绍 导航栏在移动应用中扮演着至关重要的角色,它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换,还是复杂的应用导航,导航栏都能够帮助用户快速找到所需内容,提升用户体验和应用的易用性。 在移动应用…...
检索增强生成(RAG)技术:实现流程、作用及应用案例
一. RAG简介 在自然语言处理(NLP)领域中,检索增强生成(Retrieval-Augmented Generation, RAG)技术巧妙地结合了信息检索与神经网络生成模型的力量,通过在生成过程中引入相关的外部信息,实现了在…...
Ubuntu安装和使用
Ubuntu 安装和配置 修改下载源 打开软件与更新, 选择其它站点, 选择中国, 选择阿里云源 谷歌中文输入法配置 Ctrl Alt T打开终端, 执行下述命令下fcitx框架 输入密码进行安装 sudo apt-get install -y fcitx-googlepinyinWin呼出菜单, 选择语言支持, 第一次打开会显示语言…...
【Unity】Stream最好用的Selfhost开源轻量服务
【背景】 有好几种场景的投屏或者远控应用希望实现,无论用哪种方式,都绕不开如何构建服务这一关。 【分析】 外网有很多直接付费使用的信令传输类型或是提供流服务的服务器,但我的目标场景是断绝外网的局域网,而且付费也总觉得…...
Web 常见的攻击方式有哪些?
常见的 Web 攻击方式有以下几种: 跨站脚本攻击(XSS 攻击) 跨站请求伪造(XSRF 攻击) SQL 注入 XSS 攻击 MDN 定义如下: 跨站脚本攻击(Cross-site scripting,XSS)是一…...
Rancher(v2.6.3)——Rancher部署Redis(单机版)
Rancher部署Redis详细说明文档]:https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#6rancher%E9%83%A8%E7%BD%B2redis ps:如果觉得作者写的还行,能够满足您的需求&#…...
stm32-模拟数字转化器ADC
接线图: #include "stm32f10x.h" // Device header//1: 开启RCC时钟,包括ADC和GPIO的时钟//2:配置GPIO将GPIO配置为模拟输入模式//3:配置多路开关将左边的通道接入到规则组中//4:配置ADC转…...
[Repo Git] manifests的写法
manifests是个啥 在Repo中manifests描述了Repo客户端的结构,也就是可以从manifests中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 manifests的基本结构是一个Git存储库,在顶层目录中持有一个default.xml文件。 由于m…...
位置编码与长度外推
位置编码 位置编码从前到后包括:绝对位置编码、余弦位置编码、旋转位置编码、ALiBi相对位置编码。 1 绝对位置编码(Absolute Positional Encoding) 应用的模型:BERT、GPT等Transformer基础模型广泛使用绝对位置编码来处理序列数据。 算法思想:绝对位置编码通过为序列中的…...
Linux信号补充——信号发送和保存
三、信号的发送与保存 3.1信号的发送 必须有操作系统来保存信号,因为他是管理者; 信号给进程的task_struct发送信号,在task_struct中维护了一个整数signal有0-31位,共32个bit位;对于信号的管理使用的是位图结…...
Vue3 中应该使用 Ref 还是 Reactive?
一、引言 在Vue 3中,构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时,我们有两个主要工具:reactive和ref。选择使用哪一个,实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...
红外相机和RGB相机标定:实现两种模态数据融合
1. 前期准备 RGB相机:森云智能SG2-IMX390,1个红外相机:艾睿光电IR-Pilot 640X-32G,1个红外标定板:https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...
前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
目录 1、图片懒加载 步骤一:自定义全局指令 步骤二:代码中使用 编辑步骤三:效果查看 步骤四:代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug:需要…...
【MySQL】2.MySQL数据库的基本操作
目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构(字段) 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL:数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...
常见技术难点及方案
1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁; 1.1.2 防止死锁 需要确保在任何故障场景下,都不会出现死锁; 1.2.3 可重入 特殊的锁机制,它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...
c#关键字 static
static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本,但每个 static 字段只有一个副…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
