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

2024-03-18 17:52

本文主要是介绍最近接到一个大项目,给公司设计抢商品代金劵业务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于最近接到一个大项目,给公司设计抢商品代金劵业务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823159

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再