当前位置: 首页 > news >正文

最近接到一个大项目,给公司设计抢商品代金劵业务

  我们公司是做汽车金融方面的工作,在业内还挺大。目前单量来源于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 的默认垃圾回收器。这一部分需要结合你们系统逐步分析就可以。每个公司系统不一样 参考网上的一些设计,同时多做并发测试。多做测试。

相关文章:

最近接到一个大项目,给公司设计抢商品代金劵业务

我们公司是做汽车金融方面的工作&#xff0c;在业内还挺大。目前单量来源于2&#xff0c;3线城市&#xff0c;随着大环境越老越差位了吸引他们&#xff0c; 公司决定给全国的客户&#xff0c;销售等发一些商品 1.总体学习了京东开源秒杀系统设计思路和方案。 我们公司决定进行…...

防火墙(讲解)

目录 1.防火墙是什么? 2.防火墙设备 3.防火墙功能 1)出色的控制能力&#xff0c;过滤掉不安全服务 2)过滤非法用户和访问特殊站点 3)它能够对网络存取和访问进行监控审计 4.防火墙的局限 (1)防火墙有可能是可以绕过的 (2)防火墙不能防止内部出卖性攻击或者内部误操作…...

Python之装饰器-带参装饰器

Python之装饰器-带参装饰器 带参装饰器 之后不是一个单独的标识符&#xff0c;是一个函数调用函数调用的返回值又是一个函数&#xff0c;此函数是一个无参装饰器带参装饰器&#xff0c;可以有任意个参数 func()func(1)func(1, 2) def add(x, y):"""函数说明&…...

抖音IP属地怎么更改

抖音是一个非常受欢迎的短视频平台&#xff0c;吸引了无数用户在上面分享自己的生活和才艺。然而&#xff0c;随着快手的火爆&#xff0c;一些用户开始担心自己的IP地址会被他人获取&#xff0c;引起个人隐私风险。那么&#xff0c;抖音用户又该如何更改到别的地方呢&#xff1…...

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色&#xff0c;它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换&#xff0c;还是复杂的应用导航&#xff0c;导航栏都能够帮助用户快速找到所需内容&#xff0c;提升用户体验和应用的易用性。 在移动应用…...

检索增强生成(RAG)技术:实现流程、作用及应用案例

一. RAG简介 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术巧妙地结合了信息检索与神经网络生成模型的力量&#xff0c;通过在生成过程中引入相关的外部信息&#xff0c;实现了在…...

Ubuntu安装和使用

Ubuntu 安装和配置 修改下载源 打开软件与更新, 选择其它站点, 选择中国, 选择阿里云源 谷歌中文输入法配置 Ctrl Alt T打开终端, 执行下述命令下fcitx框架 输入密码进行安装 sudo apt-get install -y fcitx-googlepinyinWin呼出菜单, 选择语言支持, 第一次打开会显示语言…...

【Unity】Stream最好用的Selfhost开源轻量服务

【背景】 有好几种场景的投屏或者远控应用希望实现&#xff0c;无论用哪种方式&#xff0c;都绕不开如何构建服务这一关。 【分析】 外网有很多直接付费使用的信令传输类型或是提供流服务的服务器&#xff0c;但我的目标场景是断绝外网的局域网&#xff0c;而且付费也总觉得…...

Web 常见的攻击方式有哪些?

常见的 Web 攻击方式有以下几种&#xff1a; 跨站脚本攻击&#xff08;XSS 攻击&#xff09; 跨站请求伪造&#xff08;XSRF 攻击&#xff09; SQL 注入 XSS 攻击 MDN 定义如下&#xff1a; 跨站脚本攻击&#xff08;Cross-site scripting&#xff0c;XSS&#xff09;是一…...

Rancher(v2.6.3)——Rancher部署Redis(单机版)

Rancher部署Redis详细说明文档]&#xff1a;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&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#…...

stm32-模拟数字转化器ADC

接线图&#xff1a; #include "stm32f10x.h" // Device header//1: 开启RCC时钟&#xff0c;包括ADC和GPIO的时钟//2&#xff1a;配置GPIO将GPIO配置为模拟输入模式//3&#xff1a;配置多路开关将左边的通道接入到规则组中//4&#xff1a;配置ADC转…...

[Repo Git] manifests的写法

​manifests​​是个啥 在Repo​中manifests​描述了Repo客户端的结构&#xff0c;也就是可以从manifests​中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 ​manifests​的基本结构是一个Git存储库&#xff0c;在顶层目录中持有一个default.xml​文件。 由于m…...

位置编码与长度外推

位置编码 位置编码从前到后包括:绝对位置编码、余弦位置编码、旋转位置编码、ALiBi相对位置编码。 1 绝对位置编码(Absolute Positional Encoding) 应用的模型:BERT、GPT等Transformer基础模型广泛使用绝对位置编码来处理序列数据。 算法思想:绝对位置编码通过为序列中的…...

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…...

Vue3 中应该使用 Ref 还是 Reactive?

一、引言 在Vue 3中&#xff0c;构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时&#xff0c;我们有两个主要工具&#xff1a;reactive和ref。选择使用哪一个&#xff0c;实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...

前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】

目录 1、图片懒加载 步骤一&#xff1a;自定义全局指令 步骤二&#xff1a;代码中使用 ​编辑步骤三&#xff1a;效果查看 步骤四&#xff1a;代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug&#xff1a;需要…...

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构&#xff08;字段&#xff09; 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL&#xff1a;数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...

c#关键字 static

static 修饰符可用于声明 static 类。 在类、接口和结构中&#xff0c;可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本&#xff0c;但每个 static 字段只有一个副…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...